|
@@ -549,6 +549,19 @@ void sta_info_recalc_tim(struct sta_info *sta);
|
|
|
void sta_info_init(struct ieee80211_local *local);
|
|
|
void sta_info_stop(struct ieee80211_local *local);
|
|
|
int sta_info_flush_defer(struct ieee80211_sub_if_data *sdata);
|
|
|
+
|
|
|
+/**
|
|
|
+ * sta_info_flush_cleanup - flush the sta_info cleanup queue
|
|
|
+ * @sdata: the interface
|
|
|
+ *
|
|
|
+ * Flushes the sta_info cleanup queue for a given interface;
|
|
|
+ * this is necessary before the interface is removed or, for
|
|
|
+ * AP/mesh interfaces, before it is deconfigured.
|
|
|
+ *
|
|
|
+ * Note an rcu_barrier() must precede the function, after all
|
|
|
+ * stations have been flushed/removed to ensure the call_rcu()
|
|
|
+ * calls that add stations to the cleanup queue have completed.
|
|
|
+ */
|
|
|
void sta_info_flush_cleanup(struct ieee80211_sub_if_data *sdata);
|
|
|
|
|
|
/**
|
|
@@ -562,6 +575,7 @@ static inline int sta_info_flush(struct ieee80211_sub_if_data *sdata)
|
|
|
{
|
|
|
int ret = sta_info_flush_defer(sdata);
|
|
|
|
|
|
+ rcu_barrier();
|
|
|
sta_info_flush_cleanup(sdata);
|
|
|
|
|
|
return ret;
|