Commit e154bb7a authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net-sysfs: convert netstat_show() to RCU

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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 004d1383
...@@ -34,7 +34,7 @@ static const char fmt_dec[] = "%d\n"; ...@@ -34,7 +34,7 @@ static const char fmt_dec[] = "%d\n";
static const char fmt_ulong[] = "%lu\n"; static const char fmt_ulong[] = "%lu\n";
static const char fmt_u64[] = "%llu\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) static inline int dev_isalive(const struct net_device *dev)
{ {
return READ_ONCE(dev->reg_state) <= NETREG_REGISTERED; return READ_ONCE(dev->reg_state) <= NETREG_REGISTERED;
...@@ -685,14 +685,14 @@ static ssize_t netstat_show(const struct device *d, ...@@ -685,14 +685,14 @@ static ssize_t netstat_show(const struct device *d,
WARN_ON(offset > sizeof(struct rtnl_link_stats64) || WARN_ON(offset > sizeof(struct rtnl_link_stats64) ||
offset % sizeof(u64) != 0); offset % sizeof(u64) != 0);
read_lock(&dev_base_lock); rcu_read_lock();
if (dev_isalive(dev)) { if (dev_isalive(dev)) {
struct rtnl_link_stats64 temp; struct rtnl_link_stats64 temp;
const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp); const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
ret = sysfs_emit(buf, fmt_u64, *(u64 *)(((u8 *)stats) + offset)); ret = sysfs_emit(buf, fmt_u64, *(u64 *)(((u8 *)stats) + offset));
} }
read_unlock(&dev_base_lock); rcu_read_unlock();
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment