Once rcutorture starts invoking rcu_torture_one_read() from hardware
interrupt handlers, srcu_read_delay() will need to avoid invoking
schedule_timeout_interruptible() from such handlers.  Note that
in_hardirq() does not suffice because some architectures invoke what would
otherwise be hardware interrupt handlers directly from the idle loop.
Therefore, a simple irqs_disabled() is pressed into service.

Signed-off-by: Paul E. McKenney <[email protected]>
---
 kernel/rcu/rcutorture.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 1a033ae1f1eb6a..0e0ad4cccc3644 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -767,7 +767,7 @@ srcu_read_delay(struct torture_random_state *rrsp, struct 
rt_read_seg *rtrsp)
 
        delay = torture_random(rrsp) %
                (nrealreaders * 2 * longdelay * uspertick);
-       if (!delay && in_task()) {
+       if (!delay && in_task() && !irqs_disabled()) {
                schedule_timeout_interruptible(longdelay);
                rtrsp->rt_delay_jiffies = longdelay;
        } else {
-- 
2.40.1


Reply via email to