Thanks for Cc'ing me. On Mon, Mar 13, 2017 at 06:08:48PM +0800, Qi Hou wrote: > The current order of calls within trace_hardirqs_off() would provoke an > "unannotated irqs-off" WARNING. > > This warning was reported by check_flags() when it found that the hardirqs has > been disabled but the irq-flags state, hardirqs_enabled, has not been cleared. > > Check_flags() is called via trace_hardirqs_off(), and trace_hardirqs_off() > will > be called by functions kind of local_irq_disable() if CONFIG_TRACE_IRQFLAGS > has > been enabled. > > The calltrace from functions kind of local_irq_diasble() to check_flags() > simplied as below: > > local_irq_disable() > |- trace_hardirqs_off() > |- trace_hardirqs_off_caller() > |- preemptirqsoff_hist() > |- __DO_TRACE() > |- rcu_dereference_sched() > |- rcu_read_lock_sched_held() > |- lock_is_held() > |- check_flags() > > The order of calls within trace_hardirqs_off() can be simplified as below: > > local_irq_disable() > |- raw_local_irq_disable() > |- trace_hardirqs_off() > |- trace_hardirqs_off() --> check_flags() > |- hardirqs_enabled = 0 > > We could find that the call to check_flags() has been made between disabling > hardirqs and clearing hardirqs_enabled. That will definitely cause an > "unannotated irqs-off" warning. > > To fix this "unannotated irqs-off" warning, we must call trace_hardirqs_off() > after that we clear hardirqs_enabled.
Here you say: "trace_hardirqs_off()" > Signed-off-by: Qi Hou <[email protected]> > --- > kernel/locking/lockdep.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c > index 577f026..e8b35e4 100644 > --- a/kernel/locking/lockdep.c > +++ b/kernel/locking/lockdep.c > @@ -2627,8 +2627,6 @@ __visible void trace_hardirqs_off_caller(unsigned long > ip) > { > struct task_struct *curr = current; > > - time_hardirqs_off(CALLER_ADDR0, ip); This is: "TIME_hardirqs_off()", notice the difference? Care to try to write a changelog that makes sense?

