Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211_hwsim: fix PS debugfs file locking

The functions called within the iterators must be called with
tasklets disabled, so use atomic iteration like the rest of
the code and disable tasklets around the whole operation.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+11 -11
+11 -11
drivers/net/wireless/mac80211_hwsim.c
··· 626 626 old_ps = data->ps; 627 627 data->ps = val; 628 628 629 + local_bh_disable(); 629 630 if (val == PS_MANUAL_POLL) { 630 - ieee80211_iterate_active_interfaces(data->hw, 631 - IEEE80211_IFACE_ITER_NORMAL, 632 - hwsim_send_ps_poll, data); 631 + ieee80211_iterate_active_interfaces_atomic( 632 + data->hw, IEEE80211_IFACE_ITER_NORMAL, 633 + hwsim_send_ps_poll, data); 633 634 data->ps_poll_pending = true; 634 635 } else if (old_ps == PS_DISABLED && val != PS_DISABLED) { 635 - ieee80211_iterate_active_interfaces(data->hw, 636 - IEEE80211_IFACE_ITER_NORMAL, 637 - hwsim_send_nullfunc_ps, 638 - data); 636 + ieee80211_iterate_active_interfaces_atomic( 637 + data->hw, IEEE80211_IFACE_ITER_NORMAL, 638 + hwsim_send_nullfunc_ps, data); 639 639 } else if (old_ps != PS_DISABLED && val == PS_DISABLED) { 640 - ieee80211_iterate_active_interfaces(data->hw, 641 - IEEE80211_IFACE_ITER_NORMAL, 642 - hwsim_send_nullfunc_no_ps, 643 - data); 640 + ieee80211_iterate_active_interfaces_atomic( 641 + data->hw, IEEE80211_IFACE_ITER_NORMAL, 642 + hwsim_send_nullfunc_no_ps, data); 644 643 } 644 + local_bh_enable(); 645 645 646 646 return 0; 647 647 }