wifi: mac80211: add more ops assertions
authorJohannes Berg <johannes.berg@intel.com>
Mon, 28 Aug 2023 11:59:36 +0000 (13:59 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Sep 2023 09:27:19 +0000 (11:27 +0200)
Add more might_sleep() checks and check sdata-in-driver
for one additional place.

type=feature
ticket=jira:WIFI-314309

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/driver-ops.c
net/mac80211/driver-ops.h

index 30cd0c905a24f61c5996b877eee42aa2bc1ecc36..376dae58b5a6a17393d473ca5be2230043608a45 100644 (file)
@@ -285,6 +285,8 @@ int drv_assign_vif_chanctx(struct ieee80211_local *local,
 {
        int ret = 0;
 
+       might_sleep();
+
        drv_verify_link_exists(sdata, link_conf);
        if (!check_sdata_in_driver(sdata))
                return -EIO;
index c4505593ba7a6f6594e2bfb04c5ba18d8f443d64..d95ff2282f541781cef72833d50c30961f1da388 100644 (file)
@@ -40,6 +40,8 @@ static inline void drv_tx(struct ieee80211_local *local,
 static inline void drv_sync_rx_queues(struct ieee80211_local *local,
                                      struct sta_info *sta)
 {
+       might_sleep();
+
        if (local->ops->sync_rx_queues) {
                trace_drv_sync_rx_queues(local, sta->sdata, &sta->sta);
                local->ops->sync_rx_queues(&local->hw);
@@ -569,6 +571,8 @@ static inline void drv_sta_statistics(struct ieee80211_local *local,
                                      struct ieee80211_sta *sta,
                                      struct station_info *sinfo)
 {
+       might_sleep();
+
        sdata = get_bss_sdata(sdata);
        if (!check_sdata_in_driver(sdata))
                return;
@@ -616,6 +620,8 @@ static inline int drv_get_survey(struct ieee80211_local *local, int idx,
 {
        int ret = -EOPNOTSUPP;
 
+       might_sleep();
+
        trace_drv_get_survey(local, idx, survey);
 
        if (local->ops->get_survey)
@@ -797,6 +803,8 @@ static inline void drv_set_rekey_data(struct ieee80211_local *local,
                                      struct ieee80211_sub_if_data *sdata,
                                      struct cfg80211_gtk_rekey_data *data)
 {
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -987,6 +995,8 @@ static inline void drv_stop_ap(struct ieee80211_local *local,
                               struct ieee80211_sub_if_data *sdata,
                               struct ieee80211_bss_conf *link_conf)
 {
+       might_sleep();
+
        /* make sure link_conf is protected */
        drv_verify_link_exists(sdata, link_conf);
 
@@ -1016,6 +1026,8 @@ drv_set_default_unicast_key(struct ieee80211_local *local,
                            struct ieee80211_sub_if_data *sdata,
                            int key_idx)
 {
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -1046,6 +1058,8 @@ drv_channel_switch_beacon(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_local *local = sdata->local;
 
+       might_sleep();
+
        if (local->ops->channel_switch_beacon) {
                trace_drv_channel_switch_beacon(local, sdata, chandef);
                local->ops->channel_switch_beacon(&local->hw, &sdata->vif,
@@ -1060,6 +1074,8 @@ drv_pre_channel_switch(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_local *local = sdata->local;
        int ret = 0;
 
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return -EIO;
 
@@ -1077,6 +1093,8 @@ drv_post_channel_switch(struct ieee80211_sub_if_data *sdata)
        struct ieee80211_local *local = sdata->local;
        int ret = 0;
 
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return -EIO;
 
@@ -1092,6 +1110,8 @@ drv_abort_channel_switch(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
 
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -1107,6 +1127,8 @@ drv_channel_switch_rx_beacon(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_local *local = sdata->local;
 
+       might_sleep();
+
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -1163,6 +1185,8 @@ static inline int drv_get_txpower(struct ieee80211_local *local,
 {
        int ret;
 
+       might_sleep();
+
        if (!local->ops->get_txpower)
                return -EOPNOTSUPP;
 
@@ -1267,6 +1291,10 @@ drv_get_ftm_responder_stats(struct ieee80211_local *local,
 {
        u32 ret = -EOPNOTSUPP;
 
+       might_sleep();
+       if (!check_sdata_in_driver(sdata))
+               return -EIO;
+
        if (local->ops->get_ftm_responder_stats)
                ret = local->ops->get_ftm_responder_stats(&local->hw,
                                                         &sdata->vif,
@@ -1436,6 +1464,8 @@ static inline void drv_sta_set_4addr(struct ieee80211_local *local,
                                     struct ieee80211_sta *sta, bool enabled)
 {
        sdata = get_bss_sdata(sdata);
+
+       might_sleep();
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -1451,6 +1481,8 @@ static inline void drv_sta_set_decap_offload(struct ieee80211_local *local,
                                             bool enabled)
 {
        sdata = get_bss_sdata(sdata);
+
+       might_sleep();
        if (!check_sdata_in_driver(sdata))
                return;
 
@@ -1526,6 +1558,8 @@ static inline int drv_net_setup_tc(struct ieee80211_local *local,
 {
        int ret = -EOPNOTSUPP;
 
+       might_sleep();
+
        sdata = get_bss_sdata(sdata);
        trace_drv_net_setup_tc(local, sdata, type);
        if (local->ops->net_setup_tc)