> -----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]>

Reply via email to