patch "staging: rtl8712: get rid of flush_scheduled_work" added to staging-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: rtl8712: get rid of flush_scheduled_work
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 9be550ee43919b070bcd77f9228bdbbbc073245b Mon Sep 17 00:00:00 2001
From: Pavel Skripkin <[email protected]>
Date: Wed, 21 Jul 2021 22:34:36 +0300
Subject: staging: rtl8712: get rid of flush_scheduled_work
This patch is preparation for following patch for error handling refactoring.
flush_scheduled_work() takes (wq_completion)events lock and
it can lead to deadlock when r871xu_dev_remove() is called from workqueue. To avoid deadlock sutiation we can change flush_scheduled_work() call to flush_work() call for all possibly scheduled works in this driver, since next patch adds device_release_driver() in case of fw load failure.
--- drivers/staging/rtl8712/rtl8712_led.c | 8 ++++++++ drivers/staging/rtl8712/rtl871x_led.h | 1 + drivers/staging/rtl8712/rtl871x_pwrctrl.c | 8 ++++++++ drivers/staging/rtl8712/rtl871x_pwrctrl.h | 1 + drivers/staging/rtl8712/usb_intf.c | 3 ++- 5 files changed, 20 insertions(+), 1 deletion(-)
drivers/staging/rtl8712/rtl8712_led.c +8 -0
@@ -1820,3 +1820,11 @@ void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)break ; } } + +void r8712_flush_led_works (struct _adapter *padapter) +{ +struct led_priv *pledpriv = &padapter->ledpriv; + +flush_work (&pledpriv->SwLed0.BlinkWorkItem); +flush_work (&pledpriv->SwLed1.BlinkWorkItem); +}
drivers/staging/rtl8712/rtl871x_led.h +1 -0
@@ -112,6 +112,7 @@ struct led_priv {void r8712_InitSwLeds (struct _adapter *padapter);void r8712_DeInitSwLeds (struct _adapter *padapter);void LedControl871x (struct _adapter *padapter,enum LED_CTL_MODE LedAction); +void r8712_flush_led_works (struct _adapter *padapter);#endif
drivers/staging/rtl8712/rtl871x_pwrctrl.c +8 -0
@@ -224,3 +224,11 @@ void r8712_unregister_cmd_alive(struct _adapter *padapter) }mutex_unlock (&pwrctrl->mutex_lock); } + +void r8712_flush_rwctrl_works (struct _adapter *padapter) +{ +struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +flush_work (&pwrctrl->SetPSModeWorkItem); +flush_work (&pwrctrl->rpwm_workitem); +}
drivers/staging/rtl8712/rtl871x_pwrctrl.h +1 -0
@@ -108,5 +108,6 @@ void r8712_cpwm_int_hdl(struct _adapter *padapter,void r8712_set_ps_mode (struct _adapter *padapter,uint ps_mode,uint smart_ps);void r8712_set_rpwm (struct _adapter *padapter,u8 val8); +void r8712_flush_rwctrl_works (struct _adapter *padapter);#endif /* __RTL871X_PWRCTRL_H_ */
drivers/staging/rtl8712/usb_intf.c +2 -1
@@ -606,7 +606,8 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf) padapter->surprise_removed = true;if (pnetdev->reg_state !=NETREG_UNINITIALIZED )unregister_netdev (pnetdev);/* will call netdev_close() */ -flush_scheduled_work (); +r8712_flush_rwctrl_works (padapter); +r8712_flush_led_works (padapter);udelay (1 );/* Stop driver mlme relation timer */ r8712_stop_drv_timers (padapter);
Signature · 1 line
2.32.0