exit_idle() should be called after irq_enter(), otherwise it throws:
[ INFO: suspicious RCU usage. ]
3.6.5 #1 Not tainted
-------------------------------
include/linux/rcupdate.h:725 rcu_read_lock() used illegally while idle!
other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active = 1, debug_locks = 1
RCU used illegally from extended quiescent state!
1 lock held by swapper/0/0:
#0: (rcu_read_lock){......}, at: [<
ffffffff810e9fe0>] __atomic_notifier_call_chain+0x0/0x140
stack backtrace:
Pid: 0, comm: swapper/0 Not tainted 3.6.5 #1
Call Trace:
<IRQ> [<
ffffffff811259a2>] lockdep_rcu_suspicious+0xe2/0x130
[<
ffffffff810ea10c>] __atomic_notifier_call_chain+0x12c/0x140
[<
ffffffff810e9fe0>] ? atomic_notifier_chain_unregister+0x90/0x90
[<
ffffffff811216cd>] ? trace_hardirqs_off+0xd/0x10
[<
ffffffff810ea136>] atomic_notifier_call_chain+0x16/0x20
[<
ffffffff810777c3>] exit_idle+0x43/0x50
[<
ffffffff81568865>] xen_evtchn_do_upcall+0x25/0x50
[<
ffffffff81aa690e>] xen_do_hypervisor_callback+0x1e/0x30
<EOI> [<
ffffffff810013aa>] ? hypercall_page+0x3aa/0x1000
[<
ffffffff810013aa>] ? hypercall_page+0x3aa/0x1000
[<
ffffffff81061540>] ? xen_safe_halt+0x10/0x20
[<
ffffffff81075cfa>] ? default_idle+0xba/0x570
[<
ffffffff810778af>] ? cpu_idle+0xdf/0x140
[<
ffffffff81a4d881>] ? rest_init+0x135/0x144
[<
ffffffff81a4d74c>] ? csum_partial_copy_generic+0x16c/0x16c
[<
ffffffff82520c45>] ? start_kernel+0x3db/0x3e8
[<
ffffffff8252066a>] ? repair_env_string+0x5a/0x5a
[<
ffffffff82520356>] ? x86_64_start_reservations+0x131/0x135
[<
ffffffff82524aca>] ? xen_start_kernel+0x465/0x46
Git commit
98ad1cc14a5c4fd658f9d72c6ba5c86dfd3ce0d5
Author: Frederic Weisbecker <fweisbec@gmail.com>
Date: Fri Oct 7 18:22:09 2011 +0200
x86: Call idle notifier after irq_enter()
did this, but it missed the Xen code.
Signed-off-by: Mojiong Qiu <mjqiu@tencent.com>
Cc: stable@vger.kernel.org # from 3.3 and newer.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>