]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: bubble up taking netdev instance lock to callers of net_devmem_unbind_dmabuf()
authorJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 22:45:27 +0000 (15:45 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Mar 2025 17:04:49 +0000 (10:04 -0700)
A recent commit added taking the netdev instance lock
in netdev_nl_bind_rx_doit(), but didn't remove it in
net_devmem_unbind_dmabuf() which it calls from an error path.
Always expect the callers of net_devmem_unbind_dmabuf() to
hold the lock. This is consistent with net_devmem_bind_dmabuf().

(Not so) coincidentally this also protects mp_param with the instance
lock, which the rest of this series needs.

Fixes: 1d22d3060b9b ("net: drop rtnl_lock for queue_mgmt operations")
Reviewed-by: Mina Almasry <almasrymina@google.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250324224537.248800-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/devmem.c
net/core/netdev-genl.c

index 6802e82a4d03b6030f6df50ae3661f81e40bc101..ee145a2aa41c289d37e07b77d7f27a88d6414396 100644 (file)
@@ -128,12 +128,10 @@ void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding)
                rxq->mp_params.mp_priv = NULL;
                rxq->mp_params.mp_ops = NULL;
 
-               netdev_lock(binding->dev);
                rxq_idx = get_netdev_rx_queue_index(rxq);
 
                err = netdev_rx_queue_restart(binding->dev, rxq_idx);
                WARN_ON(err && err != -ENETDOWN);
-               netdev_unlock(binding->dev);
        }
 
        xa_erase(&net_devmem_dmabuf_bindings, binding->id);
index a186fea63c09e437f341e5eb29b2a8613a8972a9..9e4882a22407dcf1d9deedbacfc41c3a72fb7e6a 100644 (file)
@@ -947,7 +947,9 @@ void netdev_nl_sock_priv_destroy(struct netdev_nl_sock *priv)
 
        mutex_lock(&priv->lock);
        list_for_each_entry_safe(binding, temp, &priv->bindings, list) {
+               netdev_lock(binding->dev);
                net_devmem_unbind_dmabuf(binding);
+               netdev_unlock(binding->dev);
        }
        mutex_unlock(&priv->lock);
 }