* [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
@ 2026-08-10 17:54 Dragos Tatulea
2026-08-11 0:25 ` Stanislav Fomichev
[not found] ` <anpN3vJUig93aSB8@devvm29614.prn0.facebook.com>
0 siblings, 2 replies; 5+ messages in thread
From: Dragos Tatulea @ 2026-08-10 17:54 UTC (permalink / raw)
To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman
Cc: Dragos Tatulea, tariqt, netdev, linux-kernel
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@nvidia.com>
---
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();
+ xa_for_each(&net_devmem_dmabuf_bindings, id, binding) {
+ if (READ_ONCE(binding->dev) == dev &&
+ (!dma_dev || binding->attachment->dev == dma_dev)) {
+ found = true;
+ break;
+ }
+ }
+ rcu_read_unlock();
+
+ return found;
+}
+EXPORT_SYMBOL_GPL(netdev_has_dmabuf_binding);
+
void net_devmem_get_net_iov(struct net_iov *niov)
{
net_devmem_dmabuf_binding_get(net_devmem_iov_binding(niov));
--
2.54.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
2026-08-10 17:54 [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper Dragos Tatulea
@ 2026-08-11 0:25 ` Stanislav Fomichev
2026-08-11 10:47 ` Dragos Tatulea
[not found] ` <anpN3vJUig93aSB8@devvm29614.prn0.facebook.com>
1 sibling, 1 reply; 5+ messages in thread
From: Stanislav Fomichev @ 2026-08-11 0:25 UTC (permalink / raw)
To: Dragos Tatulea
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, tariqt, netdev, linux-kernel
On 08/10, Dragos Tatulea 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@nvidia.com>
> ---
> 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;
xmas tree. Other than that LGTM. Presumably it's better to ship via your
upcoming series to show the actual usage?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
[not found] ` <anpN3vJUig93aSB8@devvm29614.prn0.facebook.com>
@ 2026-08-11 7:24 ` Dragos Tatulea
2026-08-11 10:44 ` Dragos Tatulea
0 siblings, 1 reply; 5+ messages in thread
From: Dragos Tatulea @ 2026-08-11 7:24 UTC (permalink / raw)
To: bobbyeshleman
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, tariqt, netdev, linux-kernel
On 11.08.26 00:17, bobbyeshleman wrote:
> On Mon, Aug 10, 2026 at 08:54:45PM +0300, Dragos Tatulea wrote:> [...]
>> +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();
>> + xa_for_each(&net_devmem_dmabuf_bindings, id, binding) {
>> + if (READ_ONCE(binding->dev) == dev &&
>> + (!dma_dev || binding->attachment->dev == dma_dev)) {
>> + found = true;
>> + break;
>> + }
>> + }
>> + rcu_read_unlock();
>> +
>> + return found;
>> +}
>> +EXPORT_SYMBOL_GPL(netdev_has_dmabuf_binding);
>> +
>> void net_devmem_get_net_iov(struct net_iov *niov)
>> {
>> net_devmem_dmabuf_binding_get(net_devmem_iov_binding(niov));
>> --
>> 2.54.0
>>
>
> I think netdev_has_dmabuf_binding() can return false even when there
> exists one or more in-flight skbs (e.g., in sk_write_queue) backed by
> the txq binding (won't technically be inactive until the final reference
> is dropped and the binding is freed)? If so, can this still detect when
> it is safe to swap the underlying dma dev?
>
Oh, good point! I didn't realize that the binding is refcounted and can
outlive its xarray slot.
Thanks,
Dragos
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
2026-08-11 7:24 ` Dragos Tatulea
@ 2026-08-11 10:44 ` Dragos Tatulea
0 siblings, 0 replies; 5+ messages in thread
From: Dragos Tatulea @ 2026-08-11 10:44 UTC (permalink / raw)
To: bobbyeshleman, Bobby Eshleman
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, tariqt, netdev, linux-kernel
On 11.08.26 09:24, Dragos Tatulea wrote:
>
>
> On 11.08.26 00:17, bobbyeshleman wrote:
>> On Mon, Aug 10, 2026 at 08:54:45PM +0300, Dragos Tatulea wrote:> [...]
>>> +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();
>>> + xa_for_each(&net_devmem_dmabuf_bindings, id, binding) {
>>> + if (READ_ONCE(binding->dev) == dev &&
>>> + (!dma_dev || binding->attachment->dev == dma_dev)) {
>>> + found = true;
>>> + break;
>>> + }
>>> + }
>>> + rcu_read_unlock();
>>> +
>>> + return found;
>>> +}
>>> +EXPORT_SYMBOL_GPL(netdev_has_dmabuf_binding);
>>> +
>>> void net_devmem_get_net_iov(struct net_iov *niov)
>>> {
>>> net_devmem_dmabuf_binding_get(net_devmem_iov_binding(niov));
>>> --
>>> 2.54.0
>>>
>>
>> I think netdev_has_dmabuf_binding() can return false even when there
>> exists one or more in-flight skbs (e.g., in sk_write_queue) backed by
>> the txq binding (won't technically be inactive until the final reference
>> is dropped and the binding is freed)? If so, can this still detect when
>> it is safe to swap the underlying dma dev?
>>
> Oh, good point! I didn't realize that the binding is refcounted and can
> outlive its xarray slot.
>
I can only think of adding another list that tracks bindings for their
lifetime or between xarray erasure and deletion. Not too happy about it
though.
There's also the possibility of iterating over dmabufs and their attachment.
But this requires a function in dmabuf to scan the dmabufs and attachments
under the internal lock similar to dma_buf_debug_show(). But I don't think
that will be accepted. So this is even worse.
Thanks,
Dragos
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper
2026-08-11 0:25 ` Stanislav Fomichev
@ 2026-08-11 10:47 ` Dragos Tatulea
0 siblings, 0 replies; 5+ messages in thread
From: Dragos Tatulea @ 2026-08-11 10:47 UTC (permalink / raw)
To: Stanislav Fomichev
Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman, tariqt, netdev, linux-kernel
On 11.08.26 02:25, Stanislav Fomichev wrote:
> On 08/10, Dragos Tatulea 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@nvidia.com>
>> ---
>> 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;
>
> xmas tree. Other than that LGTM.
Seems like Bobby found a valid corner case that needs to be handled.
> Presumably it's better to ship via your upcoming series to show the actual usage?
I will do that eventually, but would like to get some ACKs about this bit
so that Tariq doesn't have to re-send the whole series every time.
Thanks,
Dragos
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-11 10:47 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10 17:54 [PATCH net-next] net: devmem: add netdev_has_dmabuf_binding() helper Dragos Tatulea
2026-08-11 0:25 ` Stanislav Fomichev
2026-08-11 10:47 ` Dragos Tatulea
[not found] ` <anpN3vJUig93aSB8@devvm29614.prn0.facebook.com>
2026-08-11 7:24 ` Dragos Tatulea
2026-08-11 10:44 ` Dragos Tatulea
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox