Re: wcn36xx: Introduce mutual exclusion of fw configuration

From: Kalle Valo
Date: Tue Aug 08 2017 - 07:08:53 EST


Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> wrote:

> As the association status changes the driver needs to configure the
> hardware. This is done based on information in the "sta" acquired by
> ieee80211_find_sta(), which requires the caller to ensure that the "sta"
> is valid while its being used; generally by entering an rcu read
> section.
>
> But the operations acting on the "sta" has to communicate with the
> firmware and may therefor sleep, resulting in the following report:
>
> [ 31.418190] BUG: sleeping function called from invalid context at
> kernel/locking/mutex.c:238
> [ 31.425919] in_atomic(): 0, irqs_disabled(): 0, pid: 34, name:
> kworker/u8:1
> [ 31.434609] CPU: 0 PID: 34 Comm: kworker/u8:1 Tainted: G W
> 4.12.0-rc4-next-20170607+ #993
> [ 31.441002] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC
> (DT)
> [ 31.450380] Workqueue: phy0 ieee80211_iface_work
> [ 31.457226] Call trace:
> [ 31.461830] [<ffffff8008088c58>] dump_backtrace+0x0/0x260
> [ 31.464004] [<ffffff8008088f7c>] show_stack+0x14/0x20
> [ 31.469557] [<ffffff8008392e70>] dump_stack+0x98/0xb8
> [ 31.474592] [<ffffff80080e4330>] ___might_sleep+0xf0/0x118
> [ 31.479626] [<ffffff80080e43a8>] __might_sleep+0x50/0x88
> [ 31.485010] [<ffffff80088ff9a4>] mutex_lock+0x24/0x60
> [ 31.490479] [<ffffff8008595c38>] wcn36xx_smd_set_link_st+0x30/0x130
> [ 31.495428] [<ffffff8008591ed8>] wcn36xx_bss_info_changed+0x148/0x448
> [ 31.501504] [<ffffff80088ab3c4>]
> ieee80211_bss_info_change_notify+0xbc/0x118
> [ 31.508102] [<ffffff80088f841c>] ieee80211_assoc_success+0x664/0x7f8
> [ 31.515220] [<ffffff80088e13d4>]
> ieee80211_rx_mgmt_assoc_resp+0x144/0x2d8
> [ 31.521555] [<ffffff80088e1e20>]
> ieee80211_sta_rx_queued_mgmt+0x190/0x698
> [ 31.528239] [<ffffff80088bc44c>] ieee80211_iface_work+0x234/0x368
> [ 31.535011] [<ffffff80080d81ac>] process_one_work+0x1cc/0x340
> [ 31.541086] [<ffffff80080d8368>] worker_thread+0x48/0x430
> [ 31.546814] [<ffffff80080de448>] kthread+0x108/0x138
> [ 31.552195] [<ffffff8008082ec0>] ret_from_fork+0x10/0x50
>
> In order to ensure that the "sta" remains alive (and consistent) for the
> duration of bss_info_changed() mutual exclusion has to be ensured with
> sta_remove().
>
> This is done by introducing a mutex to cover firmware configuration
> changes, which is made to also ensure mutual exclusion between other
> operations changing the state or configuration of the firmware. With
> this we can drop the rcu read lock.
>
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx>
> Signed-off-by: Kalle Valo <kvalo@xxxxxxxxxxxxxxxx>

Patch applied to ath-next branch of ath.git, thanks.

39efc7cc7ccf wcn36xx: Introduce mutual exclusion of fw configuration

--
https://patchwork.kernel.org/patch/9877987/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches