rtl8188eu: Fix a possible sleep-in-atomic bug in _rtw_pwr_wakeup
authorJia-Ju Bai <baijiaju1990@163.com>
Sun, 8 Oct 2017 11:54:53 +0000 (19:54 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Oct 2017 13:43:35 +0000 (15:43 +0200)
The driver may sleep under a spinlock, and the function call path is:
rtw_set_802_11_disassociate(acquire the spinlock)
  _rtw_pwr_wakeup
    usleep_range --> may sleep

To fix it, usleep_range is replaced with udelay.
This bug is found by my static analysis tool and my code review.

Signed-off-by: Jia-Ju Bai <baijiaju1990@163.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8188eu/core/rtw_pwrctrl.c

index 658b9da09476769c8703a741b6376a1c4d2ff944..ac27f9a023bcea1ab7a16e142aa88e4feaf72fd5 100644 (file)
@@ -570,7 +570,7 @@ int _rtw_pwr_wakeup(struct adapter *padapter, u32 ips_deffer_ms, const char *cal
                DBG_88E("%s wait ps_processing...\n", __func__);
                while (pwrpriv->ps_processing &&
                       jiffies_to_msecs(jiffies - start) <= 3000)
-                       usleep_range(1000, 3000);
+                       udelay(1500);
                if (pwrpriv->ps_processing)
                        DBG_88E("%s wait ps_processing timeout\n", __func__);
                else