Skip to content

Commit 8533b14

Browse files
committed
eth: mlx4: create a page pool for Rx
Create a pool per rx queue. Subsequent patches will make use of it. Move fcs_del to a hole to make space for the pointer. Per common "wisdom" base the page pool size on the ring size. Note that the page pool cache size is in full pages, so just round up the effective buffer size to pages. Reviewed-by: Tariq Toukan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 4991b88 commit 8533b14

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#if IS_ENABLED(CONFIG_IPV6)
4949
#include <net/ip6_checksum.h>
5050
#endif
51+
#include <net/page_pool/helpers.h>
5152

5253
#include "mlx4_en.h"
5354

@@ -268,6 +269,7 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
268269
u32 size, u16 stride, int node, int queue_index)
269270
{
270271
struct mlx4_en_dev *mdev = priv->mdev;
272+
struct page_pool_params pp = {};
271273
struct mlx4_en_rx_ring *ring;
272274
int err = -ENOMEM;
273275
int tmp;
@@ -286,9 +288,26 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
286288
ring->log_stride = ffs(ring->stride) - 1;
287289
ring->buf_size = ring->size * ring->stride + TXBB_SIZE;
288290

289-
if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index, 0) < 0)
291+
pp.flags = PP_FLAG_DMA_MAP;
292+
pp.pool_size = size * DIV_ROUND_UP(priv->rx_skb_size, PAGE_SIZE);
293+
pp.nid = node;
294+
pp.napi = &priv->rx_cq[queue_index]->napi;
295+
pp.netdev = priv->dev;
296+
pp.dev = &mdev->dev->persist->pdev->dev;
297+
pp.dma_dir = priv->dma_dir;
298+
299+
ring->pp = page_pool_create(&pp);
300+
if (!ring->pp)
290301
goto err_ring;
291302

303+
if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index, 0) < 0)
304+
goto err_pp;
305+
306+
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, MEM_TYPE_PAGE_POOL,
307+
ring->pp);
308+
if (err)
309+
goto err_xdp_info;
310+
292311
tmp = size * roundup_pow_of_two(MLX4_EN_MAX_RX_FRAGS *
293312
sizeof(struct mlx4_en_rx_alloc));
294313
ring->rx_info = kvzalloc_node(tmp, GFP_KERNEL, node);
@@ -319,6 +338,8 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
319338
ring->rx_info = NULL;
320339
err_xdp_info:
321340
xdp_rxq_info_unreg(&ring->xdp_rxq);
341+
err_pp:
342+
page_pool_destroy(ring->pp);
322343
err_ring:
323344
kfree(ring);
324345
*pring = NULL;
@@ -445,6 +466,7 @@ void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
445466
xdp_rxq_info_unreg(&ring->xdp_rxq);
446467
mlx4_free_hwq_res(mdev->dev, &ring->wqres, size * stride + TXBB_SIZE);
447468
kvfree(ring->rx_info);
469+
page_pool_destroy(ring->pp);
448470
ring->rx_info = NULL;
449471
kfree(ring);
450472
*pring = NULL;

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,11 @@ struct mlx4_en_rx_ring {
335335
u16 stride;
336336
u16 log_stride;
337337
u16 cqn; /* index of port CQ associated with this ring */
338+
u8 fcs_del;
338339
u32 prod;
339340
u32 cons;
340341
u32 buf_size;
341-
u8 fcs_del;
342+
struct page_pool *pp;
342343
void *buf;
343344
void *rx_info;
344345
struct bpf_prog __rcu *xdp_prog;

0 commit comments

Comments
 (0)