From: Ian Campbell Subject: xen: netback: save interrupt state in add_to_net_schedule_list_tail add_to_net_schedule_list_tail is called from both hard interrupt context (add_to_net_schedule_list_tail) and soft interrupt/process context (netif_schedule_work) so use the interrupt state saving spinlock variants. Fixes: ------------[ cut here ]------------ WARNING: at kernel/lockdep.c:2323 trace_hardirqs_on_caller+0xef/0x1a0() Hardware name: PowerEdge 860 Modules linked in: rtc_cmos rtc_core rtc_lib Pid: 16, comm: xenwatch Not tainted 2.6.32.18-x86_32p-xen0-00850-ge6b9b2c #98 Call Trace: [] warn_slowpath_common+0x6c/0xc0 [] warn_slowpath_null+0x15/0x20 [] trace_hardirqs_on_caller+0xef/0x1a0 [] trace_hardirqs_on+0xb/0x10 [] _spin_unlock_irq+0x22/0x40 [] add_to_net_schedule_list_tail+0x5f/0xb0 [] netif_be_int+0x2b/0x120 [] handle_IRQ_event+0x2e/0xe0 [] handle_level_irq+0x6e/0xf0 [] __xen_evtchn_do_upcall+0x16f/0x190 [] xen_evtchn_do_upcall+0x28/0x40 [] xen_do_upcall+0x7/0xc [] xs_talkv+0x59/0x1a0 [] xs_single+0x3a/0x50 [] xenbus_read+0x39/0x60 [] frontend_changed+0x3e7/0x6a0 [] xenbus_otherend_changed+0x8a/0xa0 [] frontend_changed+0x12/0x20 [] xenwatch_thread+0x7c/0x140 [] kthread+0x74/0x80 [] kernel_thread_helper+0x7/0x10 ---[ end trace 48d73949a8e0909a ]--- Signed-off-by: Ian Campbell Signed-off-by: Jan Beulich --- a/drivers/xen/netback/netback.c +++ b/drivers/xen/netback/netback.c @@ -821,16 +821,18 @@ static void remove_from_net_schedule_lis static void add_to_net_schedule_list_tail(netif_t *netif) { + unsigned long flags; + if (__on_net_schedule_list(netif)) return; - spin_lock_irq(&net_schedule_list_lock); + spin_lock_irqsave(&net_schedule_list_lock, flags); if (!__on_net_schedule_list(netif) && likely(netif_schedulable(netif))) { list_add_tail(&netif->list, &net_schedule_list); netif_get(netif); } - spin_unlock_irq(&net_schedule_list_lock); + spin_unlock_irqrestore(&net_schedule_list_lock, flags); } /*