diff options
author | Amitkumar Karwar <akarwar@marvell.com> | 2014-03-28 00:05:26 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-03-31 13:47:41 -0400 |
commit | a7488c792f007377971a87aa42f91741f3fbd47f (patch) | |
tree | 8ee28d099ee32fa7548ee0355aa48fd51374f36d /drivers/net/wireless/mwifiex | |
parent | aabcaa8b4994b935ae54a902afc7b0c3d89098a6 (diff) |
mwifiex: fix spinlock bad magic bug
[ 6630.450908] BUG: spinlock bad magic on CPU#1,
ksdioirqd/mmc1/355
[ 6630.450914] Unable to handle kernel NULL pointer dereference
at virtual address 0000004f
[ 6630.450919] pgd = ecbd8000
[ 6630.450926] [0000004f] *pgd=00000000
[ 6630.450936] lock: 0xeea4ab08, .magic: 00000000,
.owner: <none>/-1, .owner_cpu: 0
[ 6630.450939] Backtrace:
[ 6630.450956] [<c010d354>] (unwind_backtrace+0x0/0x118) from
[<c060c238>] (dump_stack+0x28/0x30)
[ 6630.450960] Internal error: Oops: 5 [#1] SMP ARM
[ 6630.450964] Modules linked in: uvcvideo videobuf2_vmalloc
[ 6630.450980] [<c060c238>] (dump_stack+0x28/0x30) from
[<c0315ab4>] (spin_dump+0x80/0x94)
[ 6630.450988] [<c0315ab4>] (spin_dump+0x80/0x94) from
[<c0315af4>] (spin_bug+0x2c/0x30)
[ 6630.450996] [<c0315af4>] (spin_bug+0x2c/0x30) from
[<c0315b80>] (do_raw_spin_lock+0x28/0x15c)
[ 6630.451004] [<c0315b80>] (do_raw_spin_lock+0x28/0x15c) from
[<c0610c24>] (_raw_spin_lock_irqsave+0x20/0x28)
[ 6630.451016] [<c0610c24>] (_raw_spin_lock_irqsave+0x20/0x28)
from [<bf07a7f4>] (mwifiex_exec_next_cmd
+0x6c/0x45c [mwifiex])
[ 6630.451030] [<bf07a7f4>] (mwifiex_exec_next_cmd+0x6c/0x45c
[mwifiex]) from [<bf07834c>]
(mwifiex_main_process+0x2c8/0x464 [mwifiex])
[ 6630.451047] [<bf07834c>] (mwifiex_main_process+0x2c8/0x464
[mwifiex]) from [<bf0a093c>]
(mwifiex_sdio_interrupt+0xc8/0x1cc [mwifiex_sdio]
[ 6630.451064] [<bf0a093c>] (mwifiex_sdio_interrupt+0xc8/0x1cc
[mwifiex_sdio]) from [<c04bbde0>]
(sdio_irq_thread+0x178/0x31c)
[ 6630.451079] [<c04bbde0>] (sdio_irq_thread+0x178/0x31c) from
[<c0145514>] (kthread+0xc8/0xd8)
[ 6630.451095] [<c0145514>] (kthread+0xc8/0xd8) from
[<c0106118>] (ret_from_fork+0x14/0x20)
This bug has introduced/exposed due to recent patch in which we
cancel pending commands before suspend (using hs_enabling flag).
The NULL pointer is dereferenced when both
mwifiex_cancel_all_pending_cmd() and mwifiex_exec_next_cmd()
try to access cmd pending queue simultaneously.
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex')
-rw-r--r-- | drivers/net/wireless/mwifiex/cmdevt.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c index a23791d49955..1062c918a7bf 100644 --- a/drivers/net/wireless/mwifiex/cmdevt.c +++ b/drivers/net/wireless/mwifiex/cmdevt.c | |||
@@ -981,11 +981,10 @@ mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter) | |||
981 | struct mwifiex_private *priv; | 981 | struct mwifiex_private *priv; |
982 | int i; | 982 | int i; |
983 | 983 | ||
984 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags); | ||
984 | /* Cancel current cmd */ | 985 | /* Cancel current cmd */ |
985 | if ((adapter->curr_cmd) && (adapter->curr_cmd->wait_q_enabled)) { | 986 | if ((adapter->curr_cmd) && (adapter->curr_cmd->wait_q_enabled)) { |
986 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
987 | adapter->curr_cmd->wait_q_enabled = false; | 987 | adapter->curr_cmd->wait_q_enabled = false; |
988 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
989 | adapter->cmd_wait_q.status = -1; | 988 | adapter->cmd_wait_q.status = -1; |
990 | mwifiex_complete_cmd(adapter, adapter->curr_cmd); | 989 | mwifiex_complete_cmd(adapter, adapter->curr_cmd); |
991 | } | 990 | } |
@@ -1005,6 +1004,7 @@ mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter) | |||
1005 | spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags); | 1004 | spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags); |
1006 | } | 1005 | } |
1007 | spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags); | 1006 | spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags); |
1007 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); | ||
1008 | 1008 | ||
1009 | /* Cancel all pending scan command */ | 1009 | /* Cancel all pending scan command */ |
1010 | spin_lock_irqsave(&adapter->scan_pending_q_lock, flags); | 1010 | spin_lock_irqsave(&adapter->scan_pending_q_lock, flags); |