diff options
author | Felix Fietkau <nbd@nbd.name> | 2020-01-18 18:44:00 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2020-01-29 12:24:57 +0100 |
commit | ea5078014d3f8a6f662e41cf9dec23028ca303e3 (patch) | |
tree | 1f0d92c9c26dda6f4665c70b98e900703c147928 /package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch | |
parent | e0ab33ea496f371a0683b18d5555d651f8df1f5e (diff) |
mac80211: backport airtime queue limits support
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch')
-rw-r--r-- | package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch b/package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch new file mode 100644 index 0000000000..3289aae151 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/306-mac80211-move-store-skb-ack-code-to-its-own-function.patch @@ -0,0 +1,78 @@ +From: John Crispin <john@phrozen.org> +Date: Tue, 29 Oct 2019 10:13:02 +0100 +Subject: [PATCH] mac80211: move store skb ack code to its own function + +This patch moves the code handling SKBTX_WIFI_STATUS inside the TX path +into an extra function. This allows us to reuse it inside the 802.11 encap +offloading datapath. + +Signed-off-by: John Crispin <john@phrozen.org> +Link: https://lore.kernel.org/r/20191029091304.7330-2-john@phrozen.org +Signed-off-by: Johannes Berg <johannes.berg@intel.com> +--- + +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -2430,6 +2430,33 @@ static int ieee80211_lookup_ra_sta(struc + return 0; + } + ++static int ieee80211_store_ack_skb(struct ieee80211_local *local, ++ struct sk_buff *skb, ++ u32 *info_flags) ++{ ++ struct sk_buff *ack_skb = skb_clone_sk(skb); ++ u16 info_id = 0; ++ ++ if (ack_skb) { ++ unsigned long flags; ++ int id; ++ ++ spin_lock_irqsave(&local->ack_status_lock, flags); ++ id = idr_alloc(&local->ack_status_frames, ack_skb, ++ 1, 0x10000, GFP_ATOMIC); ++ spin_unlock_irqrestore(&local->ack_status_lock, flags); ++ ++ if (id >= 0) { ++ info_id = id; ++ *info_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; ++ } else { ++ kfree_skb(ack_skb); ++ } ++ } ++ ++ return info_id; ++} ++ + /** + * ieee80211_build_hdr - build 802.11 header in the given frame + * @sdata: virtual interface to build the header for +@@ -2723,26 +2750,8 @@ static struct sk_buff *ieee80211_build_h + } + + if (unlikely(!multicast && skb->sk && +- skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) { +- struct sk_buff *ack_skb = skb_clone_sk(skb); +- +- if (ack_skb) { +- unsigned long flags; +- int id; +- +- spin_lock_irqsave(&local->ack_status_lock, flags); +- id = idr_alloc(&local->ack_status_frames, ack_skb, +- 1, 0x10000, GFP_ATOMIC); +- spin_unlock_irqrestore(&local->ack_status_lock, flags); +- +- if (id >= 0) { +- info_id = id; +- info_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; +- } else { +- kfree_skb(ack_skb); +- } +- } +- } ++ skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) ++ info_id = ieee80211_store_ack_skb(local, skb, &info_flags); + + /* + * If the skb is shared we need to obtain our own copy. |