Message ID | 20220723195932.1302575-1-longman@redhat.com |
---|---|
State | Accepted |
Commit | d295ad34f236c3518634fb6403d4c0160456e470 |
Headers | show |
Series | intel_idle: Fix false positive RCU splats due to incorrect hardirqs state | expand |
On Sat, Jul 23, 2022 at 10:00 PM Waiman Long <longman@redhat.com> wrote: > > Commit 32d4fd5751ea ("cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE") > uses raw_local_irq_enable/local_irq_disable() around call to > __intel_idle() in intel_idle_irq(). > > With interrupt enabled, timer tick interrupt can happen and a > subsequently call to __do_softirq() may change the lockdep hardirqs state > of a debug kernel back to 'on'. This will result in a mismatch between > the cpu hardirqs state (off) and the lockdep hardirqs state (on) causing > a number of false positive "WARNING: suspicious RCU usage" splats. > > Fix that by using local_irq_disable() to disable interrupt in > intel_idle_irq(). > > Fixes: 32d4fd5751ea ("cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE") > Signed-off-by: Waiman Long <longman@redhat.com> Applied as 5.19-rc material. Peter, please let me know if you have concerns. > --- > drivers/idle/intel_idle.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c > index f5c6802aa6c3..907700d1e78e 100644 > --- a/drivers/idle/intel_idle.c > +++ b/drivers/idle/intel_idle.c > @@ -162,7 +162,13 @@ static __cpuidle int intel_idle_irq(struct cpuidle_device *dev, > > raw_local_irq_enable(); > ret = __intel_idle(dev, drv, index); > - raw_local_irq_disable(); > + > + /* > + * The lockdep hardirqs state may be changed to 'on' with timer > + * tick interrupt followed by __do_softirq(). Use local_irq_disable() > + * to keep the hardirqs state correct. > + */ > + local_irq_disable(); > > return ret; > } > -- > 2.31.1 >
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index f5c6802aa6c3..907700d1e78e 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -162,7 +162,13 @@ static __cpuidle int intel_idle_irq(struct cpuidle_device *dev, raw_local_irq_enable(); ret = __intel_idle(dev, drv, index); - raw_local_irq_disable(); + + /* + * The lockdep hardirqs state may be changed to 'on' with timer + * tick interrupt followed by __do_softirq(). Use local_irq_disable() + * to keep the hardirqs state correct. + */ + local_irq_disable(); return ret; }
Commit 32d4fd5751ea ("cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE") uses raw_local_irq_enable/local_irq_disable() around call to __intel_idle() in intel_idle_irq(). With interrupt enabled, timer tick interrupt can happen and a subsequently call to __do_softirq() may change the lockdep hardirqs state of a debug kernel back to 'on'. This will result in a mismatch between the cpu hardirqs state (off) and the lockdep hardirqs state (on) causing a number of false positive "WARNING: suspicious RCU usage" splats. Fix that by using local_irq_disable() to disable interrupt in intel_idle_irq(). Fixes: 32d4fd5751ea ("cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE") Signed-off-by: Waiman Long <longman@redhat.com> --- drivers/idle/intel_idle.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)