Message ID | 20220920235018.1675956-1-seanga2@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 878e2405710aacfeeb19364c300f38b7a9abfe8f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2] net: sunhme: Fix packet reception for len < RX_COPY_THRESHOLD | expand |
Hello: This patch was applied to netdev/net.git (master) by Jakub Kicinski <kuba@kernel.org>: On Tue, 20 Sep 2022 19:50:18 -0400 you wrote: > There is a separate receive path for small packets (under 256 bytes). > Instead of allocating a new dma-capable skb to be used for the next packet, > this path allocates a skb and copies the data into it (reusing the existing > sbk for the next packet). There are two bytes of junk data at the beginning > of every packet. I believe these are inserted in order to allow aligned DMA > and IP headers. We skip over them using skb_reserve. Before copying over > the data, we must use a barrier to ensure we see the whole packet. The > current code only synchronizes len bytes, starting from the beginning of > the packet, including the junk bytes. However, this leaves off the final > two bytes in the packet. Synchronize the whole packet. > > [...] Here is the summary with links: - [net,v2] net: sunhme: Fix packet reception for len < RX_COPY_THRESHOLD https://git.kernel.org/netdev/net/c/878e2405710a You are awesome, thank you!
diff --git a/drivers/net/ethernet/sun/sunhme.c b/drivers/net/ethernet/sun/sunhme.c index 1921054b7f7d..e660902cfdf7 100644 --- a/drivers/net/ethernet/sun/sunhme.c +++ b/drivers/net/ethernet/sun/sunhme.c @@ -2020,9 +2020,9 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev) skb_reserve(copy_skb, 2); skb_put(copy_skb, len); - dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE); + dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len + 2, DMA_FROM_DEVICE); skb_copy_from_linear_data(skb, copy_skb->data, len); - dma_sync_single_for_device(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE); + dma_sync_single_for_device(hp->dma_dev, dma_addr, len + 2, DMA_FROM_DEVICE); /* Reuse original ring buffer. */ hme_write_rxd(hp, this, (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),