OSDN Git Service

mt7601u: use ieee80211_rx_list to pass frames to the network stack as a batch
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 13 Jan 2021 23:26:26 +0000 (00:26 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 25 Jan 2021 14:41:44 +0000 (16:41 +0200)
Similar to mt76 driver, rely on ieee80211_rx_list in order to
improve icache footprint

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/5c72fa2dda45c1ae3f285af80c02f3db23341d85.1610580222.git.lorenzo@kernel.org
drivers/net/wireless/mediatek/mt7601u/dma.c

index 98733c2..46d05f8 100644 (file)
@@ -74,7 +74,8 @@ bad_frame:
 }
 
 static void mt7601u_rx_process_seg(struct mt7601u_dev *dev, u8 *data,
-                                  u32 seg_len, struct page *p)
+                                  u32 seg_len, struct page *p,
+                                  struct list_head *list)
 {
        struct sk_buff *skb;
        struct mt7601u_rxwi *rxwi;
@@ -104,9 +105,13 @@ static void mt7601u_rx_process_seg(struct mt7601u_dev *dev, u8 *data,
        if (!skb)
                return;
 
-       spin_lock(&dev->mac_lock);
-       ieee80211_rx(dev->hw, skb);
-       spin_unlock(&dev->mac_lock);
+       local_bh_disable();
+       rcu_read_lock();
+
+       ieee80211_rx_list(dev->hw, NULL, skb, list);
+
+       rcu_read_unlock();
+       local_bh_enable();
 }
 
 static u16 mt7601u_rx_next_seg_len(u8 *data, u32 data_len)
@@ -130,6 +135,7 @@ mt7601u_rx_process_entry(struct mt7601u_dev *dev, struct mt7601u_dma_buf_rx *e)
        u32 seg_len, data_len = e->urb->actual_length;
        u8 *data = page_address(e->p);
        struct page *new_p = NULL;
+       LIST_HEAD(list);
        int cnt = 0;
 
        if (!test_bit(MT7601U_STATE_INITIALIZED, &dev->state))
@@ -140,7 +146,8 @@ mt7601u_rx_process_entry(struct mt7601u_dev *dev, struct mt7601u_dma_buf_rx *e)
                new_p = dev_alloc_pages(MT_RX_ORDER);
 
        while ((seg_len = mt7601u_rx_next_seg_len(data, data_len))) {
-               mt7601u_rx_process_seg(dev, data, seg_len, new_p ? e->p : NULL);
+               mt7601u_rx_process_seg(dev, data, seg_len,
+                                      new_p ? e->p : NULL, &list);
 
                data_len -= seg_len;
                data += seg_len;
@@ -150,6 +157,8 @@ mt7601u_rx_process_entry(struct mt7601u_dev *dev, struct mt7601u_dma_buf_rx *e)
        if (cnt > 1)
                trace_mt_rx_dma_aggr(dev, cnt, !!new_p);
 
+       netif_receive_skb_list(&list);
+
        if (new_p) {
                /* we have one extra ref from the allocator */
                __free_pages(e->p, MT_RX_ORDER);