> Lorenzo Bianconi <lorenzo@xxxxxxxxxx> writes: > > > Fix a possible race in mt7921_pm_power_save_work() if rx/tx napi > > schedules ps_work and we are currently accessing device register > > on a different cpu. > > > > Fixes: 1d8efc741df8 ("mt76: mt7921: introduce Runtime PM support") > > Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> > > --- > > drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 8 ++++++++ > > 1 file changed, 8 insertions(+) > > > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c > > index defef3496246..0744f6e42ba3 100644 > > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c > > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c > > @@ -1553,6 +1553,14 @@ void mt7921_pm_power_save_work(struct work_struct *work) > > dev->fw_assert) > > goto out; > > > > + if (mutex_is_locked(&dev->mt76.mutex)) > > + /* if mt76 mutex is held we should not put the device > > + * to sleep since we are currently accessing device > > + * register map. We need to wait for the next power_save > > + * trigger. > > + */ > > + goto out; > > This looks fishy to me. What protects the case when ps_work is run first > and at the same time another cpu starts accessing the registers? > > Do note that I didn't check the code, so I might be missing something. before accessing chip registers, we run mt7921_mutex_acquire() so we grab mt76 mutex and run mt76_connac_pm_wake(). In mt76_connac_pm_wake() we cancel ps_work, so it is not possible to access regs while mt7921_pm_power_save_work() is running. The only leftover case is the other way around, i.e. if we schedule mt7921_pm_power_save_work while we are already reading/writing chip regs. This is only possible when mt7921_pm_power_save_work is scheduled by rx_napi and this patch is fixing the latter case. Agree? Regards, Lorenzo > > -- > https://patchwork.kernel.org/project/linux-wireless/list/ > > https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Attachment:
signature.asc
Description: PGP signature