Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
From: Mina Almasry
Date: Tue Aug 11 2026 - 13:28:07 EST
On Mon, Aug 10, 2026 at 1:59 PM Dragos Tatulea <dtatulea@xxxxxxxxxx> wrote:
>
> Currently there is no way to check if there is a dmabuf bound on a TX
> queue. RX side has netif_rxq_has_unreadable_mp() which gives a hint of
> it.
>
> To help with that, this patch add a helper to check whether a devmem
> dmabuf binding is active on a given netdev, optionally filtered by the
> DMA device the dmabuf was mapped against.
>
> This API is necessary for the upcoming support of data direct in mlx5e
> to allow blocking accidental swapping of DMA devices while devmem is active.
>
> Signed-off-by: Dragos Tatulea <dtatulea@xxxxxxxxxx>
> ---
> include/net/netmem.h | 19 +++++++++++++++++++
> net/core/devmem.c | 20 ++++++++++++++++++++
> 2 files changed, 39 insertions(+)
>
> diff --git a/include/net/netmem.h b/include/net/netmem.h
> index bccacd21b6c3..0e332e04ea16 100644
> --- a/include/net/netmem.h
> +++ b/include/net/netmem.h
> @@ -363,16 +363,35 @@ static inline unsigned long netmem_get_dma_addr(netmem_ref netmem)
> return netmem_to_nmdesc(netmem)->dma_addr;
> }
>
> +struct net_device;
> +
> #if defined(CONFIG_NET_DEVMEM)
> static inline bool net_is_devmem_iov(const struct net_iov *niov)
> {
> return niov->type == NET_IOV_DMABUF;
> }
> +
> +/**
> + * netdev_has_dmabuf_binding - is there a dmabuf binding for a
> + * given @dev and @dma_dev
> + *
> + * @dev: netdev to check bindings
> + * @dma_dev: dma device to check, when NULL it will not be checked
> + *
> + * Return: true if a binding is found under @dev and possibily @dma_dev
> + */
> +bool netdev_has_dmabuf_binding(struct net_device *dev, struct device *dma_dev);
> #else
> static inline bool net_is_devmem_iov(const struct net_iov *niov)
> {
> return false;
> }
> +
> +static inline bool netdev_has_dmabuf_binding(struct net_device *dev,
> + struct device *dma_dev)
> +{
> + return false;
> +}
> #endif
>
> void __get_netmem(netmem_ref netmem);
> diff --git a/net/core/devmem.c b/net/core/devmem.c
> index 957d6b96216b..f13a0e343684 100644
> --- a/net/core/devmem.c
> +++ b/net/core/devmem.c
> @@ -364,6 +364,26 @@ struct net_devmem_dmabuf_binding *net_devmem_lookup_dmabuf(u32 id)
> return binding;
> }
>
> +bool netdev_has_dmabuf_binding(struct net_device *dev, struct device *dma_dev)
> +{
> + struct net_devmem_dmabuf_binding *binding;
> + unsigned long id;
> + bool found = false;
> +
> + rcu_read_lock();
Why do you need rcu locking? I thought xarrays handle concurrency
inside their helpers.
--
Thanks,
Mina