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

