rtnetlink: provide RCU protection to rtnl_fill_prop_list()
authorEric Dumazet <edumazet@google.com>
Thu, 22 Feb 2024 10:50:21 +0000 (10:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Feb 2024 11:46:13 +0000 (11:46 +0000)
We want to be able to run rtnl_fill_ifinfo() under RCU protection
instead of RTNL in the future.

dev->name_node items are already rcu protected.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/rtnetlink.c

index 2d83ab76a3c95c3200016a404e740bb058f23ada..39f17d0b6ceaa9fcf29905ab0a97645a4e831990 100644 (file)
@@ -1699,7 +1699,7 @@ static int rtnl_fill_alt_ifnames(struct sk_buff *skb,
        struct netdev_name_node *name_node;
        int count = 0;
 
-       list_for_each_entry(name_node, &dev->name_node->list, list) {
+       list_for_each_entry_rcu(name_node, &dev->name_node->list, list) {
                if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name))
                        return -EMSGSIZE;
                count++;
@@ -1707,6 +1707,7 @@ static int rtnl_fill_alt_ifnames(struct sk_buff *skb,
        return count;
 }
 
+/* RCU protected. */
 static int rtnl_fill_prop_list(struct sk_buff *skb,
                               const struct net_device *dev)
 {
@@ -1927,11 +1928,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
                goto nla_put_failure_rcu;
        if (rtnl_fill_link_ifmap(skb, dev))
                goto nla_put_failure_rcu;
-
-       rcu_read_unlock();
-
        if (rtnl_fill_prop_list(skb, dev))
-               goto nla_put_failure;
+               goto nla_put_failure_rcu;
+       rcu_read_unlock();
 
        if (dev->dev.parent &&
            nla_put_string(skb, IFLA_PARENT_DEV_NAME,