Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/torvalds/linux.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorGregory Greenman <gregory.greenman@intel.com>2022-06-29 12:22:24 +0300
committerJohannes Berg <johannes.berg@intel.com>2022-07-15 12:43:17 +0300
commitb327c84c328ed2be4dbad4f5ed7c17476fe1b3bf (patch)
treeda6ad6ff38cc3082b5e0b8d2ba3e47dbeaeb33d7 /net
parentfd17bf041b40e3dac705c4313854becbe07b7557 (diff)
wifi: mac80211: replace link_id with link_conf in start/stop_ap()
When calling start/stop_ap(), mac80211 already has a protected link_conf pointer. Pass it to the driver, so it shouldn't handle RCU protection. Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/cfg.c4
-rw-r--r--net/mac80211/driver-ops.h18
-rw-r--r--net/mac80211/trace.h23
-rw-r--r--net/mac80211/util.c3
4 files changed, 25 insertions, 23 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index fa3b6cc2cafa..9214883eb0a8 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1296,7 +1296,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
}
- err = drv_start_ap(sdata->local, sdata, link_id);
+ err = drv_start_ap(sdata->local, sdata, link_conf);
if (err) {
old = sdata_dereference(link->u.ap.beacon, sdata);
@@ -1457,7 +1457,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
GFP_KERNEL);
}
- drv_stop_ap(sdata->local, sdata, link_id);
+ drv_stop_ap(sdata->local, sdata, link_conf);
/* free all potentially still buffered bcast frames */
local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index eb16a354338c..a04a88d122b7 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -987,32 +987,38 @@ int drv_switch_vif_chanctx(struct ieee80211_local *local,
static inline int drv_start_ap(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- unsigned int link_id)
+ struct ieee80211_bss_conf *link_conf)
{
int ret = 0;
+ /* make sure link_conf is protected */
+ sdata_assert_lock(sdata);
+
might_sleep();
if (!check_sdata_in_driver(sdata))
return -EIO;
- trace_drv_start_ap(local, sdata, link_id);
+ trace_drv_start_ap(local, sdata, link_conf);
if (local->ops->start_ap)
- ret = local->ops->start_ap(&local->hw, &sdata->vif, link_id);
+ ret = local->ops->start_ap(&local->hw, &sdata->vif, link_conf);
trace_drv_return_int(local, ret);
return ret;
}
static inline void drv_stop_ap(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- unsigned int link_id)
+ struct ieee80211_bss_conf *link_conf)
{
+ /* make sure link_conf is protected */
+ sdata_assert_lock(sdata);
+
if (!check_sdata_in_driver(sdata))
return;
- trace_drv_stop_ap(local, sdata, link_id);
+ trace_drv_stop_ap(local, sdata, link_conf);
if (local->ops->stop_ap)
- local->ops->stop_ap(&local->hw, &sdata->vif, link_id);
+ local->ops->stop_ap(&local->hw, &sdata->vif, link_conf);
trace_drv_return_void(local);
}
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index b6f12ac91849..75e5c1376351 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1754,9 +1754,9 @@ DEFINE_EVENT(local_sdata_chanctx, drv_unassign_vif_chanctx,
TRACE_EVENT(drv_start_ap,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- unsigned int link_id),
+ struct ieee80211_bss_conf *link_conf),
- TP_ARGS(local, sdata, link_id),
+ TP_ARGS(local, sdata, link_conf),
TP_STRUCT__entry(
LOCAL_ENTRY
@@ -1769,17 +1769,12 @@ TRACE_EVENT(drv_start_ap,
),
TP_fast_assign(
- struct ieee80211_bss_conf *info =
- sdata_dereference(sdata->vif.link_conf[link_id], sdata);
-
LOCAL_ASSIGN;
VIF_ASSIGN;
- __entry->link_id = link_id;
- if (info) {
- __entry->dtimper = info->dtim_period;
- __entry->bcnint = info->beacon_int;
- __entry->hidden_ssid = info->hidden_ssid;
- }
+ __entry->link_id = link_conf->link_id;
+ __entry->dtimper = link_conf->dtim_period;
+ __entry->bcnint = link_conf->beacon_int;
+ __entry->hidden_ssid = link_conf->hidden_ssid;
memcpy(__get_dynamic_array(ssid),
sdata->vif.cfg.ssid,
sdata->vif.cfg.ssid_len);
@@ -1794,9 +1789,9 @@ TRACE_EVENT(drv_start_ap,
TRACE_EVENT(drv_stop_ap,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
- unsigned int link_id),
+ struct ieee80211_bss_conf *link_conf),
- TP_ARGS(local, sdata, link_id),
+ TP_ARGS(local, sdata, link_conf),
TP_STRUCT__entry(
LOCAL_ENTRY
@@ -1807,7 +1802,7 @@ TRACE_EVENT(drv_stop_ap,
TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
- __entry->link_id = link_id;
+ __entry->link_id = link_conf->link_id;
),
TP_printk(
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 0ff09c639c50..cb0dd874c5df 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2579,7 +2579,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
changed |= BSS_CHANGED_AP_PROBE_RESP;
if (rcu_access_pointer(sdata->deflink.u.ap.beacon))
- drv_start_ap(local, sdata, 0);
+ drv_start_ap(local, sdata,
+ sdata->deflink.conf);
}
fallthrough;
case NL80211_IFTYPE_MESH_POINT: