mac80211: extend ieee80211_tx_status_ext to support bulk free
authorFelix Fietkau <nbd@nbd.name>
Tue, 8 Sep 2020 12:37:00 +0000 (14:37 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 18 Sep 2020 10:24:25 +0000 (12:24 +0200)
Store processed skbs ready to be freed in a list so the driver bulk free them

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20200908123702.88454-13-nbd@nbd.name
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/status.c

index 07c4dd7ab55f70ed87146493fb733e318ce47899..d3c43420779c6c807a145c372a08033c9a5326f5 100644 (file)
@@ -1096,12 +1096,14 @@ ieee80211_info_get_tx_time_est(struct ieee80211_tx_info *info)
  * @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;
 };
 
 /**
index 28df5d02e4491721bb0acd007cd95d0a65bca34d..7fe5bececfd9dcb68c977f78ebc4dffc29473243 100644 (file)
@@ -1044,7 +1044,10 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
         * 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;
        }
 
@@ -1173,7 +1176,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);