Skip to content

Commit 1d22d30

Browse files
Stanislav Fomichevkuba-moo
Stanislav Fomichev
authored andcommitted
net: drop rtnl_lock for queue_mgmt operations
All drivers that use queue API are already converted to use netdev instance lock. Move netdev instance lock management to the netlink layer and drop rtnl_lock. Signed-off-by: Stanislav Fomichev <[email protected]> Reviewed-by: Mina Almasry. <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 10eef09 commit 1d22d30

File tree

5 files changed

+18
-23
lines changed

5 files changed

+18
-23
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11381,14 +11381,14 @@ static void bnxt_irq_affinity_notify(struct irq_affinity_notify *notify,
1138111381
if (pcie_tph_set_st_entry(irq->bp->pdev, irq->msix_nr, tag))
1138211382
return;
1138311383

11384-
rtnl_lock();
11384+
netdev_lock(irq->bp->dev);
1138511385
if (netif_running(irq->bp->dev)) {
1138611386
err = netdev_rx_queue_restart(irq->bp->dev, irq->ring_nr);
1138711387
if (err)
1138811388
netdev_err(irq->bp->dev,
1138911389
"RX queue restart failed: err=%d\n", err);
1139011390
}
11391-
rtnl_unlock();
11391+
netdev_unlock(irq->bp->dev);
1139211392
}
1139311393

1139411394
static void bnxt_irq_affinity_release(struct kref *ref)

drivers/net/netdevsim/netdev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ nsim_qreset_write(struct file *file, const char __user *data,
787787
if (ret != 2)
788788
return -EINVAL;
789789

790-
rtnl_lock();
790+
netdev_lock(ns->netdev);
791791
if (queue >= ns->netdev->real_num_rx_queues) {
792792
ret = -EINVAL;
793793
goto exit_unlock;
@@ -801,7 +801,7 @@ nsim_qreset_write(struct file *file, const char __user *data,
801801

802802
ret = count;
803803
exit_unlock:
804-
rtnl_unlock();
804+
netdev_unlock(ns->netdev);
805805
return ret;
806806
}
807807

net/core/devmem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
/* Device memory support */
2727

28-
/* Protected by rtnl_lock() */
2928
static DEFINE_XARRAY_FLAGS(net_devmem_dmabuf_bindings, XA_FLAGS_ALLOC1);
3029

3130
static const struct memory_provider_ops dmabuf_devmem_ops;
@@ -128,9 +127,10 @@ void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding)
128127
rxq->mp_params.mp_priv = NULL;
129128
rxq->mp_params.mp_ops = NULL;
130129

130+
netdev_lock(binding->dev);
131131
rxq_idx = get_netdev_rx_queue_index(rxq);
132-
133132
WARN_ON(netdev_rx_queue_restart(binding->dev, rxq_idx));
133+
netdev_unlock(binding->dev);
134134
}
135135

136136
xa_erase(&net_devmem_dmabuf_bindings, binding->id);

net/core/netdev-genl.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -860,12 +860,11 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
860860
}
861861

862862
mutex_lock(&priv->lock);
863-
rtnl_lock();
864863

865-
netdev = __dev_get_by_index(genl_info_net(info), ifindex);
864+
netdev = netdev_get_by_index_lock(genl_info_net(info), ifindex);
866865
if (!netdev || !netif_device_present(netdev)) {
867866
err = -ENODEV;
868-
goto err_unlock;
867+
goto err_unlock_sock;
869868
}
870869

871870
if (dev_xdp_prog_count(netdev)) {
@@ -918,15 +917,17 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
918917
if (err)
919918
goto err_unbind;
920919

921-
rtnl_unlock();
920+
netdev_unlock(netdev);
921+
922922
mutex_unlock(&priv->lock);
923923

924924
return 0;
925925

926926
err_unbind:
927927
net_devmem_unbind_dmabuf(binding);
928928
err_unlock:
929-
rtnl_unlock();
929+
netdev_unlock(netdev);
930+
err_unlock_sock:
930931
mutex_unlock(&priv->lock);
931932
err_genlmsg_free:
932933
nlmsg_free(rsp);
@@ -946,9 +947,7 @@ void netdev_nl_sock_priv_destroy(struct netdev_nl_sock *priv)
946947

947948
mutex_lock(&priv->lock);
948949
list_for_each_entry_safe(binding, temp, &priv->bindings, list) {
949-
rtnl_lock();
950950
net_devmem_unbind_dmabuf(binding);
951-
rtnl_unlock();
952951
}
953952
mutex_unlock(&priv->lock);
954953
}

net/core/netdev_rx_queue.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0-or-later
22

33
#include <linux/netdevice.h>
4+
#include <net/netdev_lock.h>
45
#include <net/netdev_queues.h>
56
#include <net/netdev_rx_queue.h>
67
#include <net/page_pool/memory_provider.h>
@@ -18,7 +19,7 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx)
1819
!qops->ndo_queue_mem_alloc || !qops->ndo_queue_start)
1920
return -EOPNOTSUPP;
2021

21-
ASSERT_RTNL();
22+
netdev_assert_locked(dev);
2223

2324
new_mem = kvzalloc(qops->ndo_queue_mem_size, GFP_KERNEL);
2425
if (!new_mem)
@@ -30,8 +31,6 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx)
3031
goto err_free_new_mem;
3132
}
3233

33-
netdev_lock(dev);
34-
3534
err = qops->ndo_queue_mem_alloc(dev, new_mem, rxq_idx);
3635
if (err)
3736
goto err_free_old_mem;
@@ -54,8 +53,6 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx)
5453

5554
qops->ndo_queue_mem_free(dev, old_mem);
5655

57-
netdev_unlock(dev);
58-
5956
kvfree(old_mem);
6057
kvfree(new_mem);
6158

@@ -80,7 +77,6 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx)
8077
qops->ndo_queue_mem_free(dev, new_mem);
8178

8279
err_free_old_mem:
83-
netdev_unlock(dev);
8480
kvfree(old_mem);
8581

8682
err_free_new_mem:
@@ -118,9 +114,9 @@ int net_mp_open_rxq(struct net_device *dev, unsigned ifq_idx,
118114
{
119115
int ret;
120116

121-
rtnl_lock();
117+
netdev_lock(dev);
122118
ret = __net_mp_open_rxq(dev, ifq_idx, p);
123-
rtnl_unlock();
119+
netdev_unlock(dev);
124120
return ret;
125121
}
126122

@@ -153,7 +149,7 @@ static void __net_mp_close_rxq(struct net_device *dev, unsigned ifq_idx,
153149
void net_mp_close_rxq(struct net_device *dev, unsigned ifq_idx,
154150
struct pp_memory_provider_params *old_p)
155151
{
156-
rtnl_lock();
152+
netdev_lock(dev);
157153
__net_mp_close_rxq(dev, ifq_idx, old_p);
158-
rtnl_unlock();
154+
netdev_unlock(dev);
159155
}

0 commit comments

Comments
 (0)