mac80211: update encap offload patches to the latest version
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / subsys / 325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch
diff --git a/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch b/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch
new file mode 100644 (file)
index 0000000..e8b29bb
--- /dev/null
@@ -0,0 +1,53 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 21 Aug 2020 05:49:07 +0200
+Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support
+ bulk free
+
+Store processed skbs ready to be freed in a list so the driver bulk free them
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1092,12 +1092,14 @@ ieee80211_info_get_tx_time_est(struct ie
+  * @info: Basic tx status information
+  * @skb: Packet skb (can be NULL if not provided by the driver)
+  * @rate: The TX rate that was used when sending the packet
++ * @free_list: list where processed skbs are stored to be free'd by the driver
+  */
+ struct ieee80211_tx_status {
+       struct ieee80211_sta *sta;
+       struct ieee80211_tx_info *info;
+       struct sk_buff *skb;
+       struct rate_info *rate;
++      struct list_head *free_list;
+ };
+ /**
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -1053,7 +1053,10 @@ static void __ieee80211_tx_status(struct
+        * with this test...
+        */
+       if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
+-              dev_kfree_skb(skb);
++              if (status->free_list)
++                      list_add_tail(&skb->list, status->free_list);
++              else
++                      dev_kfree_skb(skb);
+               return;
+       }
+@@ -1182,7 +1185,10 @@ free:
+               return;
+       ieee80211_report_used_skb(local, skb, false);
+-      dev_kfree_skb(skb);
++      if (status->free_list)
++              list_add_tail(&skb->list, status->free_list);
++      else
++              dev_kfree_skb(skb);
+ }
+ EXPORT_SYMBOL(ieee80211_tx_status_ext);