2022-04-04 14:30:05

by Pavel Skripkin

[permalink] [raw]
Subject: Re: staging: r8188eu: how to handle nested mutex under spinlock

Hi Michael,

On 4/3/22 14:41, Michael Straube wrote:
>
> Hi Fabio,
>
> wait..
>
> rtw_set_802_11_disassociate() calls rtw_pwr_wakeup() only if
> check_fwstate(pmlmepriv, _FW_LINKED) is true.
>
>
> if (check_fwstate(pmlmepriv, _FW_LINKED)) {
> rtw_disassoc_cmd(padapter, 0, true);
> rtw_indicate_disconnect(padapter);
> rtw_free_assoc_resources(padapter, 1);
> rtw_pwr_wakeup(padapter);
> }
>

msleep() cannot be called in atomic context:

drivers/staging/r8188eu/core/rtw_pwrctrl.c:379

if (pwrpriv->ps_processing) {
while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000)
msleep(10);
}




With regards,
Pavel Skripkin


2022-04-05 03:00:26

by Pavel Skripkin

[permalink] [raw]
Subject: Re: staging: r8188eu: how to handle nested mutex under spinlock

On 4/3/22 14:48, Pavel Skripkin wrote:
> On 4/3/22 14:41, Michael Straube wrote:
>>
>> Hi Fabio,
>>
>> wait..
>>
>> rtw_set_802_11_disassociate() calls rtw_pwr_wakeup() only if
>> check_fwstate(pmlmepriv, _FW_LINKED) is true.
>>
>>
>> if (check_fwstate(pmlmepriv, _FW_LINKED)) {
>> rtw_disassoc_cmd(padapter, 0, true);
>> rtw_indicate_disconnect(padapter);
>> rtw_free_assoc_resources(padapter, 1);
>> rtw_pwr_wakeup(padapter);
>> }
>>
>
> msleep() cannot be called in atomic context:
>
> drivers/staging/r8188eu/core/rtw_pwrctrl.c:379
>
> if (pwrpriv->ps_processing) {
> while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000)
> msleep(10);
> }
>

Hm, just wondering, shouldn't we annotate load from
pwrpriv->ps_processing with READ_ONCE() inside while loop?

IIUC compiler might want to cache first load into register and we will
stuck here forever.


Am I missing something?



With regards,
Pavel Skripkin