diff options
author | Koen Vandeputte <koen.vandeputte@ncentric.com> | 2019-08-05 15:20:22 +0200 |
---|---|---|
committer | Koen Vandeputte <koen.vandeputte@ncentric.com> | 2019-08-09 18:30:41 +0200 |
commit | 6ced31c32020ca095a9a5f9d45782896c7384551 (patch) | |
tree | 578e14815ce775a29c9733823a442ed263a867d8 | |
parent | 697658e220bcf63d4bae12c20737fbd50a967e65 (diff) | |
download | upstream-6ced31c32020ca095a9a5f9d45782896c7384551.tar.gz upstream-6ced31c32020ca095a9a5f9d45782896c7384551.tar.bz2 upstream-6ced31c32020ca095a9a5f9d45782896c7384551.zip |
ar71xx/ath79: ag71xx: fix sleep in atomic
When enabling atomic-sleep-debugging options in the kernel,
following splat is seen when disabling the interface (which happens on boot):
[ 10.892878] eth0: link down
[ 10.896788] BUG: sleeping function called from invalid context at net/core/dev.c:5563
[ 10.904730] in_atomic(): 1, irqs_disabled(): 1, pid: 425, name: ip
[ 10.911004] 2 locks held by ip/425:
[ 10.914539] #0: (rtnl_mutex){....}, at: [<80377474>] rtnetlink_rcv_msg+0x2d8/0x380
[ 10.922441] #1: (&(&ag->lock)->rlock){....}, at: [<80330158>] ag71xx_hw_disable+0x24/0x94
[ 10.930976] CPU: 0 PID: 425 Comm: ip Not tainted 4.14.136 #0
[ 10.936716] Stack : 805e0000 80589228 80557404 876998ec 80610000 80610000 87cdcafc 805b5327
[ 10.945233] 80551534 000001a9 8061386c 87699ccc 87cfb180 00000001 876998a0 84f70903
[ 10.953751] 00000000 00000000 80b00000 8769979c 6a7407fa 00000000 00000007 00000000
[ 10.962270] 000000b7 16d0954a 000000b6 00000000 80000000 87cb658c 87cb65b0 00000001
[ 10.970787] 8046f97c 87699ccc 87cfb180 87ff2810 00000003 802ce724 0806e098 80610000
[ 10.979306] ...
[ 10.981797] Call Trace:
[ 10.984287] [<8006cb0c>] show_stack+0x58/0x100
[ 10.988814] [<800aab34>] ___might_sleep+0x100/0x120
[ 10.993774] [<8035c434>] napi_disable+0x30/0xd8
[ 10.998377] [<80330198>] ag71xx_hw_disable+0x64/0x94
[ 11.003418] [<8033069c>] ag71xx_stop+0x24/0x38
[ 11.007959] [<80359e30>] __dev_close_many+0xcc/0x104
[ 11.013009] [<80362eac>] __dev_change_flags+0xc8/0x1ac
[ 11.018227] [<80362fb8>] dev_change_flags+0x28/0x70
[ 11.023182] [<80376890>] do_setlink+0x31c/0x91c
[ 11.027786] [<80379360>] rtnl_newlink+0x3ec/0x7f8
[ 11.032563] [<80377498>] rtnetlink_rcv_msg+0x2fc/0x380
[ 11.037799] [<8039a734>] netlink_rcv_skb+0xd4/0x178
[ 11.042754] [<80399d10>] netlink_unicast+0x168/0x250
[ 11.047796] [<8039a2d4>] netlink_sendmsg+0x3d8/0x434
[ 11.052841] [<8033f0e4>] ___sys_sendmsg+0x1dc/0x290
[ 11.057794] [<80340140>] __sys_sendmsg+0x54/0x84
[ 11.062495] [<8007212c>] syscall_common+0x34/0x58
This is caused by calling napi_disable() while holding the spinlock.
Fix it by omitting the spinlock, which is not required here
Extensively tested on GL-MiFi, RB-912 and RB-922 hardware
Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
-rw-r--r-- | target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c | 6 | ||||
-rw-r--r-- | target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c | 6 |
2 files changed, 0 insertions, 12 deletions
diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index 2c0b4d2410..30ab37efe4 100644 --- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -668,10 +668,6 @@ static int ag71xx_hw_enable(struct ag71xx *ag) static void ag71xx_hw_disable(struct ag71xx *ag) { - unsigned long flags; - - spin_lock_irqsave(&ag->lock, flags); - netif_stop_queue(ag->dev); ag71xx_hw_stop(ag); @@ -680,8 +676,6 @@ static void ag71xx_hw_disable(struct ag71xx *ag) napi_disable(&ag->napi); del_timer_sync(&ag->oom_timer); - spin_unlock_irqrestore(&ag->lock, flags); - ag71xx_rings_cleanup(ag); } diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index 5847a6bf5c..3b2584c132 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -765,10 +765,6 @@ static int ag71xx_hw_enable(struct ag71xx *ag) static void ag71xx_hw_disable(struct ag71xx *ag) { - unsigned long flags; - - spin_lock_irqsave(&ag->lock, flags); - netif_stop_queue(ag->dev); ag71xx_hw_stop(ag); @@ -777,8 +773,6 @@ static void ag71xx_hw_disable(struct ag71xx *ag) napi_disable(&ag->napi); del_timer_sync(&ag->oom_timer); - spin_unlock_irqrestore(&ag->lock, flags); - ag71xx_rings_cleanup(ag); } |