From: John Fastabend Date: Mon, 1 Oct 2012 14:52:20 +0000 (+0000) Subject: ixgbevf: fix softirq-safe to unsafe splat on internal mbx_lock X-Git-Tag: omap-for-v3.8/fixes-for-merge-window-v4-signed~45^2~577^2~1 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=55fdd45bcf02565b8764c0e036fa752c1f854966;p=pandora-kernel.git ixgbevf: fix softirq-safe to unsafe splat on internal mbx_lock The lockdep splat below identifies a case where irq safe to unsafe lock order is detected. Resolved by making mbx_lock bh. ====================================================== [ INFO: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected ] 3.6.0-rc5jk-net-next+ #119 Not tainted ------------------------------------------------------ ip/2608 [HC0[0]:SC0[2]:HE1:SE0] is trying to acquire: (&(&adapter->mbx_lock)->rlock){+.+...}, at: [] ixgbevf_set_rx_mode+0x36/0xd2 [ixgbevf] and this task is already holding: (_xmit_ETHER){+.....}, at: [] dev_set_rx_mode+0x1e/0x33 which would create a new lock dependency: (_xmit_ETHER){+.....} -> (&(&adapter->mbx_lock)->rlock){+.+...} but this new dependency connects a SOFTIRQ-irq-safe lock: (&(&mc->mca_lock)->rlock){+.-...} ... which became SOFTIRQ-irq-safe at: [] __lock_acquire+0x2f2/0xdf3 [] lock_acquire+0x12b/0x158 [] _raw_spin_lock_bh+0x4a/0x7d [] mld_ifc_timer_expire+0x1b2/0x282 [ipv6] [] run_timer_softirq+0x2a2/0x3ee [] __do_softirq+0x161/0x2b9 [] call_softirq+0x1c/0x30 [] do_softirq+0x4b/0xa3 [] irq_exit+0x53/0xd7 [] do_IRQ+0x9d/0xb4 [] ret_from_intr+0x0/0x1a [] cpuidle_enter+0x12/0x14 [] cpuidle_enter_state+0x17/0x3f [] cpuidle_idle_call+0x140/0x21c [] cpu_idle+0x79/0xcd [] rest_init+0x149/0x150 [] start_kernel+0x37c/0x389 [] x86_64_start_reservations+0xb8/0xbd [] x86_64_start_kernel+0x101/0x110 to a SOFTIRQ-irq-unsafe lock: (&(&adapter->mbx_lock)->rlock){+.+...} ... which became SOFTIRQ-irq-unsafe at: ... [] __lock_acquire+0x366/0xdf3 [] lock_acquire+0x12b/0x158 [] _raw_spin_lock+0x45/0x7a [] ixgbevf_negotiate_api+0x3d/0x6d [ixgbevf] [] ixgbevf_open+0x6c/0x43e [ixgbevf] [] __dev_open+0xa0/0xe6 [] __dev_change_flags+0xbe/0x142 [] dev_change_flags+0x21/0x57 [] do_setlink+0x2e2/0x7f4 [] rtnl_newlink+0x277/0x4bb [] rtnetlink_rcv_msg+0x236/0x253 [] netlink_rcv_skb+0x43/0x94 [] rtnetlink_rcv+0x26/0x2d [] netlink_unicast+0xee/0x174 [] netlink_sendmsg+0x26a/0x288 [] __sock_sendmsg_nosec+0x58/0x61 [] __sock_sendmsg+0x3d/0x48 [] sock_sendmsg+0x6e/0x87 [] __sys_sendmsg+0x206/0x288 [] sys_sendmsg+0x42/0x60 [] system_call_fastpath+0x16/0x1b other info that might help us debug this: Chain exists of: &(&mc->mca_lock)->rlock --> _xmit_ETHER --> &(&adapter->mbx_lock)->rlock Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&(&adapter->mbx_lock)->rlock); local_irq_disable(); lock(&(&mc->mca_lock)->rlock); lock(_xmit_ETHER); lock(&(&mc->mca_lock)->rlock); *** DEADLOCK *** Signed-off-by: John Fastabend Acked-by: Greg Rose Tested-by: Sibai Li Signed-off-by: Jeff Kirsher --- Reading git-diff-tree failed