lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 5 Jan 2021 20:58:53 +0200 From: Vladimir Oltean <olteanv@...il.com> To: "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org> Cc: netdev@...r.kernel.org, Andrew Lunn <andrew@...n.ch>, Florian Fainelli <f.fainelli@...il.com>, Paul Gortmaker <paul.gortmaker@...driver.com>, Pablo Neira Ayuso <pablo@...filter.org>, Jiri Benc <jbenc@...hat.com>, Cong Wang <xiyou.wangcong@...il.com>, Jamal Hadi Salim <jhs@...atatu.com>, Stephen Hemminger <stephen@...workplumber.org>, Eric Dumazet <edumazet@...gle.com>, George McCollister <george.mccollister@...il.com>, Oleksij Rempel <o.rempel@...gutronix.de>, Jay Vosburgh <j.vosburgh@...il.com>, Veaceslav Falico <vfalico@...il.com>, Andy Gospodarek <andy@...yhouse.net>, Arnd Bergmann <arnd@...db.de>, Alexei Starovoitov <ast@...nel.org>, Andrii Nakryiko <andriin@...com>, Daniel Borkmann <daniel@...earbox.net>, Taehee Yoo <ap420073@...il.com>, Jiri Pirko <jiri@...lanox.com>, Björn Töpel <bjorn.topel@...el.com>, Paolo Abeni <pabeni@...hat.com>, Christian Brauner <christian.brauner@...ntu.com>, Florian Westphal <fw@...len.de>, linux-s390@...r.kernel.org, intel-wired-lan@...ts.osuosl.org, linux-parisc@...r.kernel.org, linux-scsi@...r.kernel.org, linux-usb@...r.kernel.org, dev@...nvswitch.org Subject: [RFC PATCH v2 net-next 03/12] net: procfs: hold netif_lists_lock when retrieving device statistics From: Vladimir Oltean <vladimir.oltean@....com> In the effort of making .ndo_get_stats64 be able to sleep, we need to ensure the callers of dev_get_stats do not use atomic context. The /proc/net/dev file uses an RCU read-side critical section to ensure the integrity of the list of network interfaces, because it iterates through all net devices in the netns to show their statistics. To offer the equivalent protection against an interface registering or deregistering, while also remaining in sleepable context, we can use the netns mutex for the interface lists. Cc: Cong Wang <xiyou.wangcong@...il.com> Cc: Eric Dumazet <edumazet@...gle.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@....com> --- net/core/net-procfs.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c index c714e6a9dad4..4784703c1e39 100644 --- a/net/core/net-procfs.c +++ b/net/core/net-procfs.c @@ -21,7 +21,7 @@ static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff unsigned int count = 0, offset = get_offset(*pos); h = &net->dev_index_head[get_bucket(*pos)]; - hlist_for_each_entry_rcu(dev, h, index_hlist) { + hlist_for_each_entry(dev, h, index_hlist) { if (++count == offset) return dev; } @@ -51,9 +51,11 @@ static inline struct net_device *dev_from_bucket(struct seq_file *seq, loff_t *p * in detail. */ static void *dev_seq_start(struct seq_file *seq, loff_t *pos) - __acquires(RCU) { - rcu_read_lock(); + struct net *net = seq_file_net(seq); + + netif_lists_lock(net); + if (!*pos) return SEQ_START_TOKEN; @@ -70,9 +72,10 @@ static void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) } static void dev_seq_stop(struct seq_file *seq, void *v) - __releases(RCU) { - rcu_read_unlock(); + struct net *net = seq_file_net(seq); + + netif_lists_unlock(net); } static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) -- 2.25.1
Powered by blists - more mailing lists