diff options
Diffstat (limited to 'drivers/net/ethernet/intel/libeth/rx.c')
| -rw-r--r-- | drivers/net/ethernet/intel/libeth/rx.c | 42 | 
1 files changed, 28 insertions, 14 deletions
diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c index 66d1d23b8ad2..62521a1f4ec9 100644 --- a/drivers/net/ethernet/intel/libeth/rx.c +++ b/drivers/net/ethernet/intel/libeth/rx.c @@ -1,5 +1,9 @@  // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (C) 2024 Intel Corporation */ +/* Copyright (C) 2024-2025 Intel Corporation */ + +#define DEFAULT_SYMBOL_NAMESPACE	"LIBETH" + +#include <linux/export.h>  #include <net/libeth/rx.h> @@ -68,7 +72,7 @@ static u32 libeth_rx_hw_len_truesize(const struct page_pool_params *pp,  static bool libeth_rx_page_pool_params(struct libeth_fq *fq,  				       struct page_pool_params *pp)  { -	pp->offset = LIBETH_SKB_HEADROOM; +	pp->offset = fq->xdp ? LIBETH_XDP_HEADROOM : LIBETH_SKB_HEADROOM;  	/* HW-writeable / syncable length per one page */  	pp->max_len = LIBETH_RX_PAGE_LEN(pp->offset); @@ -155,11 +159,12 @@ int libeth_rx_fq_create(struct libeth_fq *fq, struct napi_struct *napi)  		.dev		= napi->dev->dev.parent,  		.netdev		= napi->dev,  		.napi		= napi, -		.dma_dir	= DMA_FROM_DEVICE,  	};  	struct libeth_fqe *fqes;  	struct page_pool *pool; -	bool ret; +	int ret; + +	pp.dma_dir = fq->xdp ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE;  	if (!fq->hsplit)  		ret = libeth_rx_page_pool_params(fq, &pp); @@ -173,20 +178,28 @@ int libeth_rx_fq_create(struct libeth_fq *fq, struct napi_struct *napi)  		return PTR_ERR(pool);  	fqes = kvcalloc_node(fq->count, sizeof(*fqes), GFP_KERNEL, fq->nid); -	if (!fqes) +	if (!fqes) { +		ret = -ENOMEM;  		goto err_buf; +	} + +	ret = xdp_reg_page_pool(pool); +	if (ret) +		goto err_mem;  	fq->fqes = fqes;  	fq->pp = pool;  	return 0; +err_mem: +	kvfree(fqes);  err_buf:  	page_pool_destroy(pool); -	return -ENOMEM; +	return ret;  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_create, "LIBETH"); +EXPORT_SYMBOL_GPL(libeth_rx_fq_create);  /**   * libeth_rx_fq_destroy - destroy a &page_pool created by libeth @@ -194,22 +207,23 @@ EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_create, "LIBETH");   */  void libeth_rx_fq_destroy(struct libeth_fq *fq)  { +	xdp_unreg_page_pool(fq->pp);  	kvfree(fq->fqes);  	page_pool_destroy(fq->pp);  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, "LIBETH"); +EXPORT_SYMBOL_GPL(libeth_rx_fq_destroy);  /** - * libeth_rx_recycle_slow - recycle a libeth page from the NAPI context - * @page: page to recycle + * libeth_rx_recycle_slow - recycle libeth netmem + * @netmem: network memory to recycle   *   * To be used on exceptions or rare cases not requiring fast inline recycling.   */ -void libeth_rx_recycle_slow(struct page *page) +void __cold libeth_rx_recycle_slow(netmem_ref netmem)  { -	page_pool_recycle_direct(page->pp, page); +	page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false);  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, "LIBETH"); +EXPORT_SYMBOL_GPL(libeth_rx_recycle_slow);  /* Converting abstract packet type numbers into a software structure with   * the packet parameters to do O(1) lookup on Rx. @@ -251,7 +265,7 @@ void libeth_rx_pt_gen_hash_type(struct libeth_rx_pt *pt)  	pt->hash_type |= libeth_rx_pt_xdp_iprot[pt->inner_prot];  	pt->hash_type |= libeth_rx_pt_xdp_pl[pt->payload_layer];  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_pt_gen_hash_type, "LIBETH"); +EXPORT_SYMBOL_GPL(libeth_rx_pt_gen_hash_type);  /* Module */  | 
