ieee80211_handle_wake_tx_queue must not run concurrent multiple times.
It calls ieee80211_txq_schedule_start() and the drivers migrated to iTXQ
do not expect overlapping drv_tx() calls.
This fixes 'c850e31f79f0 ("wifi: mac80211: add internal handler for
wake_tx_queue")', which introduced ieee80211_handle_wake_tx_queue.
Drivers started to use it with 'a790cc3a4fad ("wifi: mac80211: add
wake_tx_queue callback to drivers")'.
But only after fixing an independent bug with
'4444bc2116ae ("wifi: mac80211: Proper mark iTXQs for resumption")'
problematic concurrent calls really happened and exposed the initial
issue.
Fixes: c850e31f79f0 ("wifi: mac80211: add internal handler for wake_tx_queue")
Reported-by: Thomas Mann <[email protected]>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217119
Link: https://lore.kernel.org/r/[email protected]/
Link: https://lore.kernel.org/r/[email protected]>
CC: <[email protected]>
Signed-off-by: Alexander Wetzel <[email protected]>
---
@Thomas
Would be good when you can test that patch again.
But it would be really strange if it's not working, too...
@Johannes
Based on your last mail you prefer to hard serialize it and not use a
spin lock per AC. So I kept that part from the first patch.
Alexander
---
net/mac80211/ieee80211_i.h | 3 +++
net/mac80211/util.c | 3 +++
2 files changed, 6 insertions(+)
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index ecc232eb1ee8..e082582e0aa2 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1284,6 +1284,9 @@ struct ieee80211_local {
struct list_head active_txqs[IEEE80211_NUM_ACS];
u16 schedule_round[IEEE80211_NUM_ACS];
+ /* serializes ieee80211_handle_wake_tx_queue */
+ spinlock_t handle_wake_tx_queue_lock;
+
u16 airtime_flags;
u32 aql_txq_limit_low[IEEE80211_NUM_ACS];
u32 aql_txq_limit_high[IEEE80211_NUM_ACS];
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 1a28fe5cb614..3aceb3b731bf 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -314,6 +314,8 @@ void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
struct ieee80211_txq *queue;
+ spin_lock(&local->handle_wake_tx_queue_lock);
+
/* Use ieee80211_next_txq() for airtime fairness accounting */
ieee80211_txq_schedule_start(hw, txq->ac);
while ((queue = ieee80211_next_txq(hw, txq->ac))) {
@@ -321,6 +323,7 @@ void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
ieee80211_return_txq(hw, queue, false);
}
ieee80211_txq_schedule_end(hw, txq->ac);
+ spin_unlock(&local->handle_wake_tx_queue_lock);
}
EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue);
--
2.39.2
On 14.03.23 22:11, Alexander Wetzel wrote:
> ieee80211_handle_wake_tx_queue must not run concurrent multiple times.
> It calls ieee80211_txq_schedule_start() and the drivers migrated to iTXQ
> do not expect overlapping drv_tx() calls.
>
> This fixes 'c850e31f79f0 ("wifi: mac80211: add internal handler for
> wake_tx_queue")', which introduced ieee80211_handle_wake_tx_queue.
> Drivers started to use it with 'a790cc3a4fad ("wifi: mac80211: add
> wake_tx_queue callback to drivers")'.
> But only after fixing an independent bug with
> '4444bc2116ae ("wifi: mac80211: Proper mark iTXQs for resumption")'
> problematic concurrent calls really happened and exposed the initial
> issue.
>
> Fixes: c850e31f79f0 ("wifi: mac80211: add internal handler for wake_tx_queue")
> Reported-by: Thomas Mann <[email protected]>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217119
> Link: https://lore.kernel.org/r/[email protected]/
> Link: https://lore.kernel.org/r/[email protected]>
> CC: <[email protected]>
> Signed-off-by: Alexander Wetzel <[email protected]>
> ---
>
> @Thomas
> Would be good when you can test that patch again.
> But it would be really strange if it's not working, too...
>
> @Johannes
> Based on your last mail you prefer to hard serialize it and not use a
> spin lock per AC. So I kept that part from the first patch.
This is missing the spin_lock_init() call.
- Felix
Alexander Wetzel <[email protected]> writes:
> ieee80211_handle_wake_tx_queue must not run concurrent multiple times.
> It calls ieee80211_txq_schedule_start() and the drivers migrated to iTXQ
> do not expect overlapping drv_tx() calls.
>
> This fixes 'c850e31f79f0 ("wifi: mac80211: add internal handler for
> wake_tx_queue")', which introduced ieee80211_handle_wake_tx_queue.
> Drivers started to use it with 'a790cc3a4fad ("wifi: mac80211: add
> wake_tx_queue callback to drivers")'.
> But only after fixing an independent bug with
> '4444bc2116ae ("wifi: mac80211: Proper mark iTXQs for resumption")'
> problematic concurrent calls really happened and exposed the initial
> issue.
This is cosmetics but the recommended way to refer to commits is:
This fixes commit c850e31f79f0 ("wifi: mac80211: add internal handler
for wake_tx_queue"), which introduced ieee80211_handle_wake_tx_queue....
More info:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
--
https://patchwork.kernel.org/project/linux-wireless/list/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches