Thread (6 messages) 6 messages, 3 authors, 2025-02-07

Re: for_each_netdev_rcu() protected by RTNL and CONFIG_PROVE_RCU_LIST

From: Breno Leitao <leitao@debian.org>
Date: 2025-02-07 10:46:26

Hello Kuniyuki,

On Fri, Feb 07, 2025 at 12:38:22PM +0900, Kuniyuki Iwashima wrote:
From: Breno Leitao <leitao@debian.org>
Date: Thu, 6 Feb 2025 07:51:55 -0800
quoted
Are there better approaches to silence these warnings when RTNL is held?
Any suggestions would be appreciated.
We can't use lockdep_rtnl_net_is_held() there yet because most users are
not converted to per-netns RTNL, so it will complain loudly.
Right, so, I understand the best approach is to leverage
lockdep_rtnl_is_held() only right now. Something as:

	diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
	index 1dcc76af75203..0deee1313f23a 100644
	--- a/include/linux/netdevice.h
	+++ b/include/linux/netdevice.h
	@@ -3217,7 +3217,8 @@ int call_netdevice_notifiers_info(unsigned long val,
	#define for_each_netdev_reverse(net, d)        \
			list_for_each_entry_reverse(d, &(net)->dev_base_head, dev_list)
	#define for_each_netdev_rcu(net, d)            \
	-               list_for_each_entry_rcu(d, &(net)->dev_base_head, dev_list)
	+               list_for_each_entry_rcu(d, &(net)->dev_base_head, dev_list, \
	+                                       lockdep_rtnl_is_held())
	#define for_each_netdev_safe(net, d, n)        \
			list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list)
	#define for_each_netdev_continue(net, d)               \

Which brings another problem:

lockdep_rtnl_is_held() is defined in include/linux/rtnetlink.h, so,
we'll need to include 'linux/rtnetlink.h' in linux/netdevice.h, which
doesn't seem correct (!?).

Otherwise drivers using for_each_netdev_rcu() will not be able to find
lockdep_rtnl_is_held().

I suppose we will need to move some of definitions around, but, I am
confident in which way.

--breno
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help