Skip to content

Commit 3e2cc5b

Browse files
NetanelBelgazalgregkh
authored andcommitted
net: ena: fix driver when PAGE_SIZE == 64kB
[ Upstream commit ef5b077 ] The buffer length field in the ena rx descriptor is 16 bit, and the current driver passes a full page in each ena rx descriptor. When PAGE_SIZE equals 64kB or more, the buffer length field becomes zero. To solve this issue, limit the ena Rx descriptor to use 16kB even when allocating 64kB kernel pages. This change would not impact ena device functionality, as 16kB is still larger than maximum MTU. Signed-off-by: Netanel Belgazal <netanel@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent a5bdc72 commit 3e2cc5b

2 files changed

Lines changed: 16 additions & 5 deletions

File tree

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ static inline int ena_alloc_rx_page(struct ena_ring *rx_ring,
456456
return -ENOMEM;
457457
}
458458

459-
dma = dma_map_page(rx_ring->dev, page, 0, PAGE_SIZE,
459+
dma = dma_map_page(rx_ring->dev, page, 0, ENA_PAGE_SIZE,
460460
DMA_FROM_DEVICE);
461461
if (unlikely(dma_mapping_error(rx_ring->dev, dma))) {
462462
u64_stats_update_begin(&rx_ring->syncp);
@@ -473,7 +473,7 @@ static inline int ena_alloc_rx_page(struct ena_ring *rx_ring,
473473
rx_info->page_offset = 0;
474474
ena_buf = &rx_info->ena_buf;
475475
ena_buf->paddr = dma;
476-
ena_buf->len = PAGE_SIZE;
476+
ena_buf->len = ENA_PAGE_SIZE;
477477

478478
return 0;
479479
}
@@ -490,7 +490,7 @@ static void ena_free_rx_page(struct ena_ring *rx_ring,
490490
return;
491491
}
492492

493-
dma_unmap_page(rx_ring->dev, ena_buf->paddr, PAGE_SIZE,
493+
dma_unmap_page(rx_ring->dev, ena_buf->paddr, ENA_PAGE_SIZE,
494494
DMA_FROM_DEVICE);
495495

496496
__free_page(page);
@@ -910,10 +910,10 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
910910
do {
911911
dma_unmap_page(rx_ring->dev,
912912
dma_unmap_addr(&rx_info->ena_buf, paddr),
913-
PAGE_SIZE, DMA_FROM_DEVICE);
913+
ENA_PAGE_SIZE, DMA_FROM_DEVICE);
914914

915915
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_info->page,
916-
rx_info->page_offset, len, PAGE_SIZE);
916+
rx_info->page_offset, len, ENA_PAGE_SIZE);
917917

918918
netif_dbg(rx_ring->adapter, rx_status, rx_ring->netdev,
919919
"rx skb updated. len %d. data_len %d\n",

drivers/net/ethernet/amazon/ena/ena_netdev.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,4 +350,15 @@ void ena_dump_stats_to_buf(struct ena_adapter *adapter, u8 *buf);
350350

351351
int ena_get_sset_count(struct net_device *netdev, int sset);
352352

353+
/* The ENA buffer length fields is 16 bit long. So when PAGE_SIZE == 64kB the
354+
* driver passas 0.
355+
* Since the max packet size the ENA handles is ~9kB limit the buffer length to
356+
* 16kB.
357+
*/
358+
#if PAGE_SIZE > SZ_16K
359+
#define ENA_PAGE_SIZE SZ_16K
360+
#else
361+
#define ENA_PAGE_SIZE PAGE_SIZE
362+
#endif
363+
353364
#endif /* !(ENA_H) */

0 commit comments

Comments
 (0)