Re: [Xen-devel] [PATCH v6 2/4] xen: don't process rcu callbacks when holding a rcu_read_lock()

2020-03-17 Thread Jan Beulich
On 13.03.2020 14:06, Juergen Gross wrote:
> 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 

Reviewed-by: Jan Beulich 

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

[Xen-devel] [PATCH v6 2/4] xen: don't process rcu callbacks when holding a rcu_read_lock()

2020-03-13 Thread Juergen Gross
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 
---
V3:
- add RCU_SOFTIRQ to ignore in process_pending_softirqs_norcu()
  (Roger Pau Monné)

V5:
- block rcu processing depending on rch_read_lock() being held or not
  (Jan Beulich)
---
 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)
-- 
2.16.4


___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel