net-sysfs: convert netstat_show() to RCU
authorEric Dumazet <edumazet@google.com>
Tue, 13 Feb 2024 06:32:40 +0000 (06:32 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Feb 2024 11:20:13 +0000 (11:20 +0000)
dev_get_stats() can be called from RCU, there is no need
to acquire dev_base_lock.

Change dev_isalive() comment to reflect we no longer use
dev_base_lock from net/core/net-sysfs.c

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/net-sysfs.c

index c5d164b..946caef 100644 (file)
@@ -34,7 +34,7 @@ static const char fmt_dec[] = "%d\n";
 static const char fmt_ulong[] = "%lu\n";
 static const char fmt_u64[] = "%llu\n";
 
-/* Caller holds RTNL, RCU or dev_base_lock */
+/* Caller holds RTNL or RCU */
 static inline int dev_isalive(const struct net_device *dev)
 {
        return READ_ONCE(dev->reg_state) <= NETREG_REGISTERED;
@@ -685,14 +685,14 @@ static ssize_t netstat_show(const struct device *d,
        WARN_ON(offset > sizeof(struct rtnl_link_stats64) ||
                offset % sizeof(u64) != 0);
 
-       read_lock(&dev_base_lock);
+       rcu_read_lock();
        if (dev_isalive(dev)) {
                struct rtnl_link_stats64 temp;
                const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
 
                ret = sysfs_emit(buf, fmt_u64, *(u64 *)(((u8 *)stats) + offset));
        }
-       read_unlock(&dev_base_lock);
+       rcu_read_unlock();
        return ret;
 }