net: devmem: fix DMA direction on unmapping
authorJakub Kicinski <kuba@kernel.org>
Fri, 1 Aug 2025 01:13:35 +0000 (18:13 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 5 Aug 2025 00:15:38 +0000 (17:15 -0700)
Looks like we always unmap the DMA_BUF with DMA_FROM_DEVICE direction.
While at it unexport __net_devmem_dmabuf_binding_free(), it's internal.

Found by code inspection.

Fixes: bd61848900bf ("net: devmem: Implement TX path")
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250801011335.2267515-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/devmem.c
net/core/devmem.h

index b3a62ca0df653aa754b87c77780e9729d8d006c6..24c591ab38aec152fd1595880263a596300fe09a 100644 (file)
@@ -70,14 +70,13 @@ void __net_devmem_dmabuf_binding_free(struct work_struct *wq)
                gen_pool_destroy(binding->chunk_pool);
 
        dma_buf_unmap_attachment_unlocked(binding->attachment, binding->sgt,
-                                         DMA_FROM_DEVICE);
+                                         binding->direction);
        dma_buf_detach(binding->dmabuf, binding->attachment);
        dma_buf_put(binding->dmabuf);
        xa_destroy(&binding->bound_rxqs);
        kvfree(binding->tx_vec);
        kfree(binding);
 }
-EXPORT_SYMBOL(__net_devmem_dmabuf_binding_free);
 
 struct net_iov *
 net_devmem_alloc_dmabuf(struct net_devmem_dmabuf_binding *binding)
@@ -208,6 +207,7 @@ net_devmem_bind_dmabuf(struct net_device *dev,
        mutex_init(&binding->lock);
 
        binding->dmabuf = dmabuf;
+       binding->direction = direction;
 
        binding->attachment = dma_buf_attach(binding->dmabuf, dev->dev.parent);
        if (IS_ERR(binding->attachment)) {
@@ -312,7 +312,7 @@ err_tx_vec:
        kvfree(binding->tx_vec);
 err_unmap:
        dma_buf_unmap_attachment_unlocked(binding->attachment, binding->sgt,
-                                         DMA_FROM_DEVICE);
+                                         direction);
 err_detach:
        dma_buf_detach(dmabuf, binding->attachment);
 err_free_binding:
index 0a3b28ba5c1377de678dd4a0dd3743ea80f4fcb2..41cd6e1c914128b3dca73d224b7d15bb6ead54cb 100644 (file)
@@ -56,6 +56,9 @@ struct net_devmem_dmabuf_binding {
         */
        u32 id;
 
+       /* DMA direction, FROM_DEVICE for Rx binding, TO_DEVICE for Tx. */
+       enum dma_data_direction direction;
+
        /* Array of net_iov pointers for this binding, sorted by virtual
         * address. This array is convenient to map the virtual addresses to
         * net_iovs in the TX path.
@@ -165,10 +168,6 @@ static inline void net_devmem_put_net_iov(struct net_iov *niov)
 {
 }
 
-static inline void __net_devmem_dmabuf_binding_free(struct work_struct *wq)
-{
-}
-
 static inline struct net_devmem_dmabuf_binding *
 net_devmem_bind_dmabuf(struct net_device *dev,
                       enum dma_data_direction direction,