Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
Dragos Tatulea <[email protected]>
| Newsgroups | org.kernel.vger.netdev,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 11.08.26 19:25, Mina Almasry wrote: > On Mon, Aug 10, 2026 at 1:59 PM Dragos Tatulea <[email protected]> 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 <[email protected]> >> --- >> 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. > Not needed. Monkey see monkey do from net_devmem_lookup_dmabuf(). Will drop. Thank, Dragos