mt7601u: use ieee80211_rx_list to pass frames to the network stack as a batch
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
This commit is contained in:
parent
6598f32d9d
commit
2a9269b1cd
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user