[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] rcu: don't process callbacks when holding a rcu_read_lock()
commit cef21210fb133038ba399a3a98228f0f9f277c6f Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Thu Mar 26 12:46:11 2020 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Mar 26 12:46:11 2020 +0100 rcu: don't process callbacks when holding a rcu_read_lock() Some keyhandlers are calling process_pending_softirqs() while holding a rcu_read_lock(). This is wrong, as process_pending_softirqs() might activate rcu calls which should not happen inside a rcu_read_lock(). For that purpose modify process_pending_softirqs() to not allow rcu callback processing when a rcu_read_lock() is being held. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/common/softirq.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xen/common/softirq.c b/xen/common/softirq.c index b83ad96d6c..00d676b62c 100644 --- a/xen/common/softirq.c +++ b/xen/common/softirq.c @@ -29,6 +29,7 @@ static void __do_softirq(unsigned long ignore_mask) { unsigned int i, cpu; unsigned long pending; + bool rcu_allowed = !(ignore_mask & (1ul << RCU_SOFTIRQ)); for ( ; ; ) { @@ -38,7 +39,7 @@ static void __do_softirq(unsigned long ignore_mask) */ cpu = smp_processor_id(); - if ( rcu_pending(cpu) ) + if ( rcu_allowed && rcu_pending(cpu) ) rcu_check_callbacks(cpu); if ( ((pending = (softirq_pending(cpu) & ~ignore_mask)) == 0) @@ -53,9 +54,16 @@ static void __do_softirq(unsigned long ignore_mask) void process_pending_softirqs(void) { + unsigned long ignore_mask = (1ul << SCHEDULE_SOFTIRQ) | + (1ul << SCHED_SLAVE_SOFTIRQ); + + /* Block RCU processing in case of rcu_read_lock() held. */ + if ( preempt_count() ) + ignore_mask |= 1ul << RCU_SOFTIRQ; + ASSERT(!in_irq() && local_irq_is_enabled()); /* Do not enter scheduler as it can preempt the calling context. */ - __do_softirq((1ul << SCHEDULE_SOFTIRQ) | (1ul << SCHED_SLAVE_SOFTIRQ)); + __do_softirq(ignore_mask); } void do_softirq(void) -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |