* [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store
@ 2017-05-31 10:29 Jia-Ju Bai
2017-05-31 15:17 ` Michael Büsch
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Jia-Ju Bai @ 2017-05-31 10:29 UTC (permalink / raw)
To: Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ, kvalo-sgV2jX0FEOL9JmXXK+q4OQ
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Jia-Ju Bai,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
b43-dev-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
The driver may sleep under a spin lock, and the function call path is:
b43legacy_attr_interfmode_store (acquire the lock by spin_lock_irqsave)
b43legacy_radio_set_interference_mitigation
b43legacy_radio_interference_mitigation_disable
b43legacy_calc_nrssi_slope
b43legacy_synth_pu_workaround
might_sleep and msleep --> may sleep
Fixing it may be complex, and a possible way is to remove
spin_lock_irqsave and spin_lock_irqrestore in
b43legacy_attr_interfmode_store, and the code has been protected by
mutex_lock and mutex_unlock.
Signed-off-by: Jia-Ju Bai <baijiaju1990-9Onoh4P/yGk@public.gmane.org>
---
drivers/net/wireless/broadcom/b43legacy/sysfs.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/net/wireless/broadcom/b43legacy/sysfs.c b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
index 2a1da15..9ede143 100644
--- a/drivers/net/wireless/broadcom/b43legacy/sysfs.c
+++ b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
@@ -137,14 +137,12 @@ static ssize_t b43legacy_attr_interfmode_store(struct device *dev,
}
mutex_lock(&wldev->wl->mutex);
- spin_lock_irqsave(&wldev->wl->irq_lock, flags);
err = b43legacy_radio_set_interference_mitigation(wldev, mode);
if (err)
b43legacyerr(wldev->wl, "Interference Mitigation not "
"supported by device\n");
mmiowb();
- spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
mutex_unlock(&wldev->wl->mutex);
return err ? err : count;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store
2017-05-31 10:29 [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store Jia-Ju Bai
@ 2017-05-31 15:17 ` Michael Büsch
2017-05-31 17:33 ` Larry Finger
2017-06-01 23:24 ` kbuild test robot
2 siblings, 0 replies; 10+ messages in thread
From: Michael Büsch @ 2017-05-31 15:17 UTC (permalink / raw)
To: Jia-Ju Bai
Cc: Larry.Finger, kvalo, netdev, linux-wireless, b43-dev,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1912 bytes --]
On Wed, 31 May 2017 18:29:07 +0800
Jia-Ju Bai <baijiaju1990@163.com> wrote:
> The driver may sleep under a spin lock, and the function call path is:
> b43legacy_attr_interfmode_store (acquire the lock by spin_lock_irqsave)
> b43legacy_radio_set_interference_mitigation
> b43legacy_radio_interference_mitigation_disable
> b43legacy_calc_nrssi_slope
> b43legacy_synth_pu_workaround
> might_sleep and msleep --> may sleep
>
> Fixing it may be complex, and a possible way is to remove
> spin_lock_irqsave and spin_lock_irqrestore in
> b43legacy_attr_interfmode_store, and the code has been protected by
> mutex_lock and mutex_unlock.
>
> Signed-off-by: Jia-Ju Bai <baijiaju1990@163.com>
> ---
> drivers/net/wireless/broadcom/b43legacy/sysfs.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/net/wireless/broadcom/b43legacy/sysfs.c b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> index 2a1da15..9ede143 100644
> --- a/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> +++ b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> @@ -137,14 +137,12 @@ static ssize_t b43legacy_attr_interfmode_store(struct device *dev,
> }
>
> mutex_lock(&wldev->wl->mutex);
> - spin_lock_irqsave(&wldev->wl->irq_lock, flags);
>
> err = b43legacy_radio_set_interference_mitigation(wldev, mode);
> if (err)
> b43legacyerr(wldev->wl, "Interference Mitigation not "
> "supported by device\n");
> mmiowb();
> - spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
> mutex_unlock(&wldev->wl->mutex);
>
> return err ? err : count;
Interference mitigation has never been properly implemented and tested.
As such nobody should use it and I would be surprised if anybody uses
this attribute.
So I would suggest to remove this sysfs attribute entirely instead of
having this incorrect fix.
--
Michael
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store
2017-05-31 10:29 [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store Jia-Ju Bai
2017-05-31 15:17 ` Michael Büsch
@ 2017-05-31 17:33 ` Larry Finger
[not found] ` <85905124-7167-aeb0-8aff-4ceec09e9542-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
2017-06-01 23:24 ` kbuild test robot
2 siblings, 1 reply; 10+ messages in thread
From: Larry Finger @ 2017-05-31 17:33 UTC (permalink / raw)
To: Jia-Ju Bai, kvalo; +Cc: linux-wireless, b43-dev, netdev, linux-kernel
On 05/31/2017 05:29 AM, Jia-Ju Bai wrote:
> The driver may sleep under a spin lock, and the function call path is:
> b43legacy_attr_interfmode_store (acquire the lock by spin_lock_irqsave)
> b43legacy_radio_set_interference_mitigation
> b43legacy_radio_interference_mitigation_disable
> b43legacy_calc_nrssi_slope
> b43legacy_synth_pu_workaround
> might_sleep and msleep --> may sleep
>
> Fixing it may be complex, and a possible way is to remove
> spin_lock_irqsave and spin_lock_irqrestore in
> b43legacy_attr_interfmode_store, and the code has been protected by
> mutex_lock and mutex_unlock.
>
> Signed-off-by: Jia-Ju Bai <baijiaju1990@163.com>
> ---
> drivers/net/wireless/broadcom/b43legacy/sysfs.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/net/wireless/broadcom/b43legacy/sysfs.c b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> index 2a1da15..9ede143 100644
> --- a/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> +++ b/drivers/net/wireless/broadcom/b43legacy/sysfs.c
> @@ -137,14 +137,12 @@ static ssize_t b43legacy_attr_interfmode_store(struct device *dev,
> }
>
> mutex_lock(&wldev->wl->mutex);
> - spin_lock_irqsave(&wldev->wl->irq_lock, flags);
>
> err = b43legacy_radio_set_interference_mitigation(wldev, mode);
> if (err)
> b43legacyerr(wldev->wl, "Interference Mitigation not "
> "supported by device\n");
> mmiowb();
> - spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
> mutex_unlock(&wldev->wl->mutex);
>
> return err ? err : count;
>
Jia-Ju,
Did you actually observe the attempt to sleep under the spin lock, or did you
discover this using some tool? In other words, have either of your patches been
tested?
Larry
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store
2017-05-31 10:29 [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store Jia-Ju Bai
2017-05-31 15:17 ` Michael Büsch
2017-05-31 17:33 ` Larry Finger
@ 2017-06-01 23:24 ` kbuild test robot
2 siblings, 0 replies; 10+ messages in thread
From: kbuild test robot @ 2017-06-01 23:24 UTC (permalink / raw)
To: Jia-Ju Bai
Cc: kbuild-all, Larry.Finger, kvalo, linux-wireless, b43-dev, netdev,
linux-kernel, Jia-Ju Bai
[-- Attachment #1: Type: text/plain, Size: 3833 bytes --]
Hi Jia-Ju,
[auto build test WARNING on wireless-drivers-next/master]
[also build test WARNING on v4.12-rc3 next-20170601]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Jia-Ju-Bai/b43legacy-Fix-a-sleep-in-atomic-bug-in-b43legacy_attr_interfmode_store/20170531-192639
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: x86_64-randconfig-a0-06020536 (attached as .config)
compiler: gcc-4.4 (Debian 4.4.7-8) 4.4.7
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
drivers/net/wireless/broadcom/b43legacy/sysfs.c: In function 'b43legacy_attr_interfmode_store':
>> drivers/net/wireless/broadcom/b43legacy/sysfs.c:114: warning: unused variable 'flags'
vim +/flags +114 drivers/net/wireless/broadcom/b43legacy/sysfs.c
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 98 " Mitigation)\n");
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 99 break;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 100 default:
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 101 B43legacy_WARN_ON(1);
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 102 }
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 103
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 104 mutex_unlock(&wldev->wl->mutex);
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 105
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 106 return count;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 107 }
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 108
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 109 static ssize_t b43legacy_attr_interfmode_store(struct device *dev,
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 110 struct device_attribute *attr,
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 111 const char *buf, size_t count)
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 112 {
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 113 struct b43legacy_wldev *wldev = dev_to_b43legacy_wldev(dev);
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 @114 unsigned long flags;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 115 int err;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 116 int mode;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 117
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 118 if (!capable(CAP_NET_ADMIN))
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 119 return -EPERM;
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 120
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 121 mode = get_integer(buf, count);
75388acd drivers/net/wireless/b43legacy/sysfs.c Larry Finger 2007-09-25 122 switch (mode) {
:::::: The code at line 114 was first introduced by commit
:::::: 75388acd0cd827dc1498043daa7d1c760902cd67 [B43LEGACY]: add mac80211-based driver for legacy BCM43xx devices
:::::: TO: Larry Finger <Larry.Finger@lwfinger.net>
:::::: CC: David S. Miller <davem@sunset.davemloft.net>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27408 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-07-30 10:24 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-31 10:29 [PATCH] b43legacy: Fix a sleep-in-atomic bug in b43legacy_attr_interfmode_store Jia-Ju Bai
2017-05-31 15:17 ` Michael Büsch
2017-05-31 17:33 ` Larry Finger
[not found] ` <85905124-7167-aeb0-8aff-4ceec09e9542-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
2017-06-01 1:05 ` Jia-Ju Bai
[not found] ` <592F6843.9000204-9Onoh4P/yGk@public.gmane.org>
2017-06-01 4:15 ` Kalle Valo
2017-06-01 16:11 ` Jonathan Corbet
2017-06-01 17:43 ` Larry Finger
[not found] ` <20170601101113.6dd30d6d-T1hC0tSOHrs@public.gmane.org>
2017-06-02 1:18 ` Jia-Ju Bai
[not found] ` <5930BCD6.9010306-9Onoh4P/yGk@public.gmane.org>
2017-07-30 10:24 ` Michael Büsch
2017-06-01 23:24 ` kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).