mt76: use ieee80211_rx_list to pass frames to the network stack as a batch
authorFelix Fietkau <nbd@nbd.name>
Sat, 25 Jul 2020 17:03:17 +0000 (19:03 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 4 Dec 2020 12:46:13 +0000 (13:46 +0100)
Improves icache footprint

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c

index 4befe7f..4e0ed9c 100644 (file)
@@ -932,7 +932,8 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
 {
        struct ieee80211_sta *sta;
        struct ieee80211_hw *hw;
-       struct sk_buff *skb;
+       struct sk_buff *skb, *tmp;
+       LIST_HEAD(list);
 
        spin_lock(&dev->rx_lock);
        while ((skb = __skb_dequeue(frames)) != NULL) {
@@ -942,9 +943,19 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
                }
 
                mt76_rx_convert(dev, skb, &hw, &sta);
-               ieee80211_rx_napi(hw, sta, skb, napi);
+               ieee80211_rx_list(hw, sta, skb, &list);
        }
        spin_unlock(&dev->rx_lock);
+
+       if (!napi) {
+               netif_receive_skb_list(&list);
+               return;
+       }
+
+       list_for_each_entry_safe(skb, tmp, &list, list) {
+               skb_list_del_init(skb);
+               napi_gro_receive(napi, skb);
+       }
 }
 
 void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,