diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2023-07-28 11:36:00 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2023-07-28 11:36:00 -0700 |
| commit | 5bdc312c1d06fb4ef02bd62fd077e4fa722012e6 (patch) | |
| tree | b977b7a1bda1dfea681cdcc02acdfd6f51ec7d41 /net/core/netdev-genl.c | |
| parent | 083476a2023ce64991e17565707e205a1bf78d63 (diff) | |
| parent | 84e00d9bd4e472bd9b145ed40dbd132dd7a15462 (diff) | |
| download | linux-5bdc312c1d06fb4ef02bd62fd077e4fa722012e6.tar.gz linux-5bdc312c1d06fb4ef02bd62fd077e4fa722012e6.tar.bz2 linux-5bdc312c1d06fb4ef02bd62fd077e4fa722012e6.zip | |
Merge branch 'net-store-netdevs-in-an-xarray'
Jakub Kicinski says:
====================
net: store netdevs in an xarray
One of more annoying developer experience gaps we have in netlink
is iterating over netdevs. It's painful. Add an xarray to make
it trivial.
v1: https://lore.kernel.org/all/20230722014237.4078962-1-kuba@kernel.org/
====================
Link: https://lore.kernel.org/r/20230726185530.2247698-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/core/netdev-genl.c')
| -rw-r--r-- | net/core/netdev-genl.c | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c index 65ef4867fc49..797c813c7c77 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -101,43 +101,22 @@ int netdev_nl_dev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); struct net_device *netdev; - int idx = 0, s_idx; - int h, s_h; - int err; - - s_h = cb->args[0]; - s_idx = cb->args[1]; + int err = 0; rtnl_lock(); - - for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { - struct hlist_head *head; - - idx = 0; - head = &net->dev_index_head[h]; - hlist_for_each_entry(netdev, head, index_hlist) { - if (idx < s_idx) - goto cont; - err = netdev_nl_dev_fill(netdev, skb, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, 0, - NETDEV_CMD_DEV_GET); - if (err < 0) - break; -cont: - idx++; - } + for_each_netdev_dump(net, netdev, cb->args[0]) { + err = netdev_nl_dev_fill(netdev, skb, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, 0, + NETDEV_CMD_DEV_GET); + if (err < 0) + break; } - rtnl_unlock(); if (err != -EMSGSIZE) return err; - cb->args[1] = idx; - cb->args[0] = h; - cb->seq = net->dev_base_seq; - return skb->len; } |
