OSDN Git Service

mac80211_hwsim: fix PS debugfs file locking
authorJohannes Berg <johannes.berg@intel.com>
Fri, 9 Jan 2015 10:29:50 +0000 (11:29 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 9 Jan 2015 10:29:50 +0000 (11:29 +0100)
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>
drivers/net/wireless/mac80211_hwsim.c

index 057a99e..74f4e1c 100644 (file)
@@ -626,22 +626,22 @@ static int hwsim_fops_ps_write(void *dat, u64 val)
        old_ps = data->ps;
        data->ps = val;
 
+       local_bh_disable();
        if (val == PS_MANUAL_POLL) {
-               ieee80211_iterate_active_interfaces(data->hw,
-                                                   IEEE80211_IFACE_ITER_NORMAL,
-                                                   hwsim_send_ps_poll, data);
+               ieee80211_iterate_active_interfaces_atomic(
+                       data->hw, IEEE80211_IFACE_ITER_NORMAL,
+                       hwsim_send_ps_poll, data);
                data->ps_poll_pending = true;
        } else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
-               ieee80211_iterate_active_interfaces(data->hw,
-                                                   IEEE80211_IFACE_ITER_NORMAL,
-                                                   hwsim_send_nullfunc_ps,
-                                                   data);
+               ieee80211_iterate_active_interfaces_atomic(
+                       data->hw, IEEE80211_IFACE_ITER_NORMAL,
+                       hwsim_send_nullfunc_ps, data);
        } else if (old_ps != PS_DISABLED && val == PS_DISABLED) {
-               ieee80211_iterate_active_interfaces(data->hw,
-                                                   IEEE80211_IFACE_ITER_NORMAL,
-                                                   hwsim_send_nullfunc_no_ps,
-                                                   data);
+               ieee80211_iterate_active_interfaces_atomic(
+                       data->hw, IEEE80211_IFACE_ITER_NORMAL,
+                       hwsim_send_nullfunc_no_ps, data);
        }
+       local_bh_enable();
 
        return 0;
 }