diff options
author | Govindarajulu Varadarajan <_govind@gmx.com> | 2014-10-19 10:50:28 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-21 21:24:25 +0200 |
commit | 39dc90c159c1bcc0fdd42913a7d560b1a1cd3acf (patch) | |
tree | a79429db005b46558ee7f75086cf5e69129619b8 /drivers/net/ethernet/cisco | |
parent | enic: fix possible deadlock in enic_stop/ enic_rfs_flw_tbl_free (diff) | |
download | linux-39dc90c159c1bcc0fdd42913a7d560b1a1cd3acf.tar.xz linux-39dc90c159c1bcc0fdd42913a7d560b1a1cd3acf.zip |
enic: Do not call napi_disable when preemption is disabled.
In enic_stop, we disable preemption using local_bh_disable(). We disable
preemption to wait for busy_poll to finish.
napi_disable should not be called here as it might sleep.
Moving napi_disable() call out side of local_bh_disable.
BUG: sleeping function called from invalid context at include/linux/netdevice.h:477
in_atomic(): 1, irqs_disabled(): 0, pid: 443, name: ifconfig
INFO: lockdep is turned off.
Preemption disabled at:[<ffffffffa029c5c4>] enic_rfs_flw_tbl_free+0x34/0xd0 [enic]
CPU: 31 PID: 443 Comm: ifconfig Not tainted 3.17.0-netnext-05504-g59f35b8 #268
Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
ffff8800dac10000 ffff88020b8dfcb8 ffffffff8148a57c 0000000000000000
ffff88020b8dfcd0 ffffffff8107e253 ffff8800dac12a40 ffff88020b8dfd10
ffffffffa029305b ffff88020b8dfd48 ffff8800dac10000 ffff88020b8dfd48
Call Trace:
[<ffffffff8148a57c>] dump_stack+0x4e/0x7a
[<ffffffff8107e253>] __might_sleep+0x123/0x1a0
[<ffffffffa029305b>] enic_stop+0xdb/0x4d0 [enic]
[<ffffffff8138ed7d>] __dev_close_many+0x9d/0xf0
[<ffffffff8138ef81>] __dev_close+0x31/0x50
[<ffffffff813974a8>] __dev_change_flags+0x98/0x160
[<ffffffff81397594>] dev_change_flags+0x24/0x60
[<ffffffff814085fd>] devinet_ioctl+0x63d/0x710
[<ffffffff81139c16>] ? might_fault+0x56/0xc0
[<ffffffff81409ef5>] inet_ioctl+0x65/0x90
[<ffffffff813768e0>] sock_do_ioctl+0x20/0x50
[<ffffffff81376ebb>] sock_ioctl+0x20b/0x2e0
[<ffffffff81197250>] do_vfs_ioctl+0x2e0/0x500
[<ffffffff81492619>] ? sysret_check+0x22/0x5d
[<ffffffff81285f23>] ? __this_cpu_preempt_check+0x13/0x20
[<ffffffff8109fe19>] ? trace_hardirqs_on_caller+0x119/0x270
[<ffffffff811974ac>] SyS_ioctl+0x3c/0x80
[<ffffffff814925ed>] system_call_fastpath+0x1a/0x1f
Signed-off-by: Govindarajulu Varadarajan <_govind@gmx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/cisco')
-rw-r--r-- | drivers/net/ethernet/cisco/enic/enic_main.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 929bfe70080a..180e53fa628f 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -1674,13 +1674,13 @@ static int enic_stop(struct net_device *netdev) enic_dev_disable(enic); - local_bh_disable(); for (i = 0; i < enic->rq_count; i++) { napi_disable(&enic->napi[i]); + local_bh_disable(); while (!enic_poll_lock_napi(&enic->rq[i])) mdelay(1); + local_bh_enable(); } - local_bh_enable(); netif_carrier_off(netdev); netif_tx_disable(netdev); |