> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Larysa Zaremba
> Sent: Monday, March 23, 2026 6:41 PM
> To: [email protected]; Nguyen, Anthony L
> <[email protected]>
> Cc: Lobakin, Aleksander <[email protected]>; Samudrala,
> Sridhar <[email protected]>; Singhai, Anjali
> <[email protected]>; Michal Swiatkowski
> <[email protected]>; Zaremba, Larysa
> <[email protected]>; Fijalkowski, Maciej
> <[email protected]>; Tantilov, Emil S
> <[email protected]>; Chittim, Madhu <[email protected]>;
> Hay, Joshua A <[email protected]>; Keller, Jacob E
> <[email protected]>; Shanmugam, Jayaprakash
> <[email protected]>; Jiri Pirko <[email protected]>;
> David S. Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni
> <[email protected]>; Simon Horman <[email protected]>; Jonathan Corbet
> <[email protected]>; Richard Cochran <[email protected]>; Kitszel,
> Przemyslaw <[email protected]>; Andrew Lunn
> <[email protected]>; [email protected]; linux-
> [email protected]; [email protected]
> Subject: [Intel-wired-lan] [PATCH iwl-next v6 03/14] libeth: allow to
> create fill queues without NAPI
>
> From: Pavan Kumar Linga <[email protected]>
>
> Control queues can utilize libeth_rx fill queues, despite working
> outside of NAPI context. The only problem is standard fill queues
> requiring NAPI that provides them with the device pointer.
>
> Introduce a way to provide the device directly without using NAPI.
>
> Suggested-by: Alexander Lobakin <[email protected]>
> Reviewed-by: Maciej Fijalkowski <[email protected]>
> Signed-off-by: Pavan Kumar Linga <[email protected]>
> Signed-off-by: Larysa Zaremba <[email protected]>
> Tested-by: Bharath R <[email protected]>
> Tested-by: Samuel Salin <[email protected]>
> Signed-off-by: Tony Nguyen <[email protected]>
> ---
> drivers/net/ethernet/intel/libeth/rx.c | 12 ++++++++----
> include/net/libeth/rx.h | 4 +++-
> 2 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/libeth/rx.c
> b/drivers/net/ethernet/intel/libeth/rx.c
> index 62521a1f4ec9..0c1a565a1b3a 100644
> --- a/drivers/net/ethernet/intel/libeth/rx.c
> +++ b/drivers/net/ethernet/intel/libeth/rx.c
> @@ -145,25 +145,29 @@ static bool libeth_rx_page_pool_params_zc(struct
> libeth_fq *fq,
> /**
> * libeth_rx_fq_create - create a PP with the default libeth settings
> * @fq: buffer queue struct to fill
> - * @napi: &napi_struct covering this PP (no usage outside its poll
> loops)
> + * @napi_dev: &napi_struct for NAPI (data) queues, &device for others
> *
> * Return: %0 on success, -%errno on failure.
> */
> -int libeth_rx_fq_create(struct libeth_fq *fq, struct napi_struct
> *napi)
> +int libeth_rx_fq_create(struct libeth_fq *fq, void *napi_dev)
> {
> + struct napi_struct *napi = fq->no_napi ? NULL : napi_dev;
> struct page_pool_params pp = {
> .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV,
> .order = LIBETH_RX_PAGE_ORDER,
> .pool_size = fq->count,
> .nid = fq->nid,
> - .dev = napi->dev->dev.parent,
> - .netdev = napi->dev,
> + .dev = napi ? napi->dev->dev.parent : napi_dev,
> + .netdev = napi ? napi->dev : NULL,
> .napi = napi,
> };
> struct libeth_fqe *fqes;
> struct page_pool *pool;
> int ret;
>
> + if (!pp.netdev && fq->type == LIBETH_FQE_MTU)
> + return -EINVAL;
> +
> pp.dma_dir = fq->xdp ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE;
>
> if (!fq->hsplit)
> diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h index
> 5d991404845e..0e736846c5e8 100644
> --- a/include/net/libeth/rx.h
> +++ b/include/net/libeth/rx.h
> @@ -69,6 +69,7 @@ enum libeth_fqe_type {
> * @type: type of the buffers this queue has
> * @hsplit: flag whether header split is enabled
> * @xdp: flag indicating whether XDP is enabled
> + * @no_napi: the queue is not a data queue and does not have NAPI
> * @buf_len: HW-writeable length per each buffer
> * @nid: ID of the closest NUMA node with memory
> */
> @@ -85,12 +86,13 @@ struct libeth_fq {
> enum libeth_fqe_type type:2;
> bool hsplit:1;
> bool xdp:1;
> + bool no_napi:1;
>
> u32 buf_len;
> int nid;
> };
>
> -int libeth_rx_fq_create(struct libeth_fq *fq, struct napi_struct
> *napi);
> +int libeth_rx_fq_create(struct libeth_fq *fq, void *napi_dev);
> void libeth_rx_fq_destroy(struct libeth_fq *fq);
>
> /**
> --
> 2.47.0
Reviewed-by: Aleksandr Loktionov <[email protected]>