FAILED: patch "[PATCH] wifi: mac80211: Fix iTXQ AMPDU fragmentation handling" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
592234e941f1 ("wifi: mac80211: Fix iTXQ AMPDU fragmentation handling") 4444bc2116ae ("wifi: mac80211: Proper mark iTXQs for resumption") 7d360f6061db ("wifi: mac80211: add support for restricting netdev features per vif") 107395f9cf44 ("wifi: mac80211: Drop support for TX push path") dfd2d876b3fd ("Merge remote-tracking branch 'wireless/main' into wireless-next")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 592234e941f1addaa598601c9227e3b72d608625 Mon Sep 17 00:00:00 2001
From: Alexander Wetzel <[email protected]>
Date: Fri, 6 Jan 2023 23:31:41 +0100
Subject: [PATCH] wifi: mac80211: Fix iTXQ AMPDU fragmentation handling
mac80211 must not enable aggregation wile transmitting a fragmented MPDU. Enforce that for mac80211 internal TX queues (iTXQs).
net/mac80211/agg-tx.c +0 -2
@@ -511,8 +511,6 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)*/ clear_bit (HT_AGG_STATE_WANT_START , &tid_tx->state); -ieee80211_agg_stop_txq (sta, tid); -/* * Make sure no packets are being processed. This ensures that * we have a valid starting sequence number and that in-flight
net/mac80211/ht.c +31 -0
@@ -391,6 +391,37 @@ void ieee80211_ba_session_work(struct work_struct *work) tid_tx = sta->ampdu_mlme.tid_start_tx[tid];if (!blocked && tid_tx) { +struct txq_info *txqi =to_txq_info (sta->sta.txq[tid]); +struct ieee80211_sub_if_data *sdata = +vif_to_sdata (txqi->txq.vif); +struct fq *fq = &sdata->local->fq; + +spin_lock_bh (&fq->lock); + +/* Allow only frags to be dequeued */ +set_bit (IEEE80211_TXQ_STOP , &txqi->flags); + +if (!skb_queue_empty (&txqi->frags)) { +/* Fragmented Tx is ongoing, wait for it to +* finish. Reschedule worker to retry later. +*/ + +spin_unlock_bh (&fq->lock); +spin_unlock_bh (&sta->lock); + +/* Give the task working on the txq a chance +* to send out the queued frags +*/ +synchronize_net (); + +mutex_unlock (&sta->ampdu_mlme.mtx); + +ieee80211_queue_work (&sdata->local->hw, work); +return ; + } + +spin_unlock_bh (&fq->lock); +/* * Assign it over to the normal tid_tx array * where it "goes live".
net/mac80211/tx.c +6 -12
@@ -1129,7 +1129,6 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,struct sk_buff *purge_skb =NULL ;if (test_bit (HT_AGG_STATE_OPERATIONAL , &tid_tx->state)) { - info->flags |=IEEE80211_TX_CTL_AMPDU ; reset_agg_timer = true; }else if (test_bit (HT_AGG_STATE_WANT_START , &tid_tx->state)) {/*
@@ -1161,7 +1160,6 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,if (!tid_tx) {/* do nothing, let packet pass through */ }else if (test_bit (HT_AGG_STATE_OPERATIONAL , &tid_tx->state)) { - info->flags |=IEEE80211_TX_CTL_AMPDU ; reset_agg_timer = true; }else { queued = true;
@@ -3677,8 +3675,7 @@ static void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, info->band = fast_tx->band; info->control.vif = &sdata->vif; info->flags =IEEE80211_TX_CTL_FIRST_FRAGMENT | -IEEE80211_TX_CTL_DONTFRAG | - (ampdu ?IEEE80211_TX_CTL_AMPDU :0 ); +IEEE80211_TX_CTL_DONTFRAG ; info->control.flags =IEEE80211_TX_CTRL_FAST_XMIT |u32_encode_bits (IEEE80211_LINK_UNSPECIFIED ,IEEE80211_TX_CTRL_MLO_LINK );
@@ -3804,9 +3801,6 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,spin_lock_bh (&fq->lock); -if (unlikely (test_bit (IEEE80211_TXQ_STOP , &txqi->flags))) - goto out; -/* Make sure fragments stay together. */ skb =__skb_dequeue (&txqi->frags);if (unlikely (skb)) {
@@ -3816,6 +3810,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,IEEE80211_SKB_CB (skb)->control.flags &= ~IEEE80211_TX_INTCFL_NEED_TXPROCESSING ; }else { +if (unlikely (test_bit (IEEE80211_TXQ_STOP , &txqi->flags))) + goto out; + skb =fq_tin_dequeue (fq, tin, fq_tin_dequeue_func); }
@@ -3866,9 +3863,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, }if (test_bit (IEEE80211_TXQ_AMPDU , &txqi->flags)) - info->flags |=IEEE80211_TX_CTL_AMPDU ; -else - info->flags &= ~IEEE80211_TX_CTL_AMPDU ; + info->flags |= (IEEE80211_TX_CTL_AMPDU | +IEEE80211_TX_CTL_DONTFRAG );if (info->flags &IEEE80211_TX_CTL_HW_80211_ENCAP ) {if (!ieee80211_hw_check (&local->hw,HAS_RATE_CONTROL )) {
@@ -4602,8 +4598,6 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata, info =IEEE80211_SKB_CB (skb);memset (info,0 ,sizeof (*info)); -if (tid_tx) - info->flags |=IEEE80211_TX_CTL_AMPDU ; info->hw_queue = sdata->vif.hw_queue[queue];