[PATCH v2] wifi: mt76: mt792x: Fix a potential deadlock in high-load situations
AceLan Kao
acelan.kao at canonical.com
Wed Dec 17 23:05:27 PST 2025
Leon Yen <leon.yen at mediatek.com> 於 2025年12月15日週一 下午8:24寫道:
>
> A deadlock may occur between two works, ps_work and mac_work, if their work
> functions run simultaneously as they attempt to cancel each other by
> calling cancel_delayed_work_sync().
>
> mt792x_mac_work() -> ... -> cancel_delayed_work_sync(&pm->ps_work);
> mt792x_pm_power_save_work() -> cancel_delayed_work_sync(&mphy->mac_work);
>
> In high-load situations, they are queued but may not have chance to be
> executed until the CPUs are released. Once the CPUs are available, there
> is a high possibility that the ps_work function and mac_work function will
> be executed simultaneously, resulting in a possible deadlock.
>
> This patch replaces cancel_delayed_work_sync() with cancel_delayed_work()
> in ps_work to eliminate the deadlock and make the code easier to maintain.
>
> Signed-off-by: Leon Yen <leon.yen at mediatek.com>
Tested-by: Chia-Lin Kao (AceLan) <acelan.kao at canonical.com>
Without the patch, the system may hang during stress tests.
And now I can't reproduce the hang issue with this patch.
Thanks.
> ---
> v2: Modify the solution to make it simpler and easier to maintain
> ---
> drivers/net/wireless/mediatek/mt76/mt792x_mac.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_mac.c b/drivers/net/wireless/mediatek/mt76/mt792x_mac.c
> index 71dec93094eb..888e5a505673 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt792x_mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt792x_mac.c
> @@ -375,7 +375,7 @@ void mt792x_pm_power_save_work(struct work_struct *work)
> }
>
> if (!mt792x_mcu_fw_pmctrl(dev)) {
> - cancel_delayed_work_sync(&mphy->mac_work);
> + cancel_delayed_work(&mphy->mac_work);
> return;
> }
> out:
> --
> 2.45.2
>
>
More information about the Linux-mediatek
mailing list