netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration.
@ 2025-01-06  7:07 Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier() Kuniyuki Iwashima
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-06  7:07 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

This series adds per-netns RTNL for registration of the global
and per-netns netdev notifiers.


Changes:
  v2:
    * Drop patch 1 (leave global netdev_chain raw_notifier as is)

  v1: https://lore.kernel.org/netdev/20250104063735.36945-1-kuniyu@amazon.com/


Kuniyuki Iwashima (3):
  net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier().
  net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net().
  net: Hold rtnl_net_lock() in
    (un)?register_netdevice_notifier_dev_net().

 net/core/dev.c | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

-- 
2.39.5 (Apple Git-154)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 net-next 1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier().
  2025-01-06  7:07 [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration Kuniyuki Iwashima
@ 2025-01-06  7:07 ` Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 2/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net() Kuniyuki Iwashima
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-06  7:07 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

(un)?register_netdevice_notifier() hold pernet_ops_rwsem and RTNL,
iterate all netns, and trigger the notifier for all netdev.

Let's hold __rtnl_net_lock() before triggering the notifier.

Note that we will need protection for netdev_chain when RTNL is
removed.  (e.g. blocking_notifier conversion [0] with a lockdep
annotation [1])

Link: https://lore.kernel.org/netdev/20250104063735.36945-2-kuniyu@amazon.com/ [0]
Link: https://lore.kernel.org/netdev/20250105075957.67334-1-kuniyu@amazon.com/ [1]
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
 net/core/dev.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index e7223972b9aa..0096a81b474f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1769,14 +1769,19 @@ int register_netdevice_notifier(struct notifier_block *nb)
 
 	/* Close race with setup_net() and cleanup_net() */
 	down_write(&pernet_ops_rwsem);
+
+	/* When RTNL is removed, we need protection for netdev_chain. */
 	rtnl_lock();
+
 	err = raw_notifier_chain_register(&netdev_chain, nb);
 	if (err)
 		goto unlock;
 	if (dev_boot_phase)
 		goto unlock;
 	for_each_net(net) {
+		__rtnl_net_lock(net);
 		err = call_netdevice_register_net_notifiers(nb, net);
+		__rtnl_net_unlock(net);
 		if (err)
 			goto rollback;
 	}
@@ -1787,8 +1792,11 @@ int register_netdevice_notifier(struct notifier_block *nb)
 	return err;
 
 rollback:
-	for_each_net_continue_reverse(net)
+	for_each_net_continue_reverse(net) {
+		__rtnl_net_lock(net);
 		call_netdevice_unregister_net_notifiers(nb, net);
+		__rtnl_net_unlock(net);
+	}
 
 	raw_notifier_chain_unregister(&netdev_chain, nb);
 	goto unlock;
@@ -1821,8 +1829,11 @@ int unregister_netdevice_notifier(struct notifier_block *nb)
 	if (err)
 		goto unlock;
 
-	for_each_net(net)
+	for_each_net(net) {
+		__rtnl_net_lock(net);
 		call_netdevice_unregister_net_notifiers(nb, net);
+		__rtnl_net_unlock(net);
+	}
 
 unlock:
 	rtnl_unlock();
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 net-next 2/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net().
  2025-01-06  7:07 [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier() Kuniyuki Iwashima
@ 2025-01-06  7:07 ` Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 3/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net() Kuniyuki Iwashima
  2025-01-08  2:10 ` [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration patchwork-bot+netdevbpf
  3 siblings, 0 replies; 5+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-06  7:07 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

(un)?register_netdevice_notifier_net() hold RTNL before triggering the
notifier for all netdev in the netns.

Let's convert the RTNL to rtnl_net_lock().

Note that the per-netns netdev notifier is protected by per-netns RTNL.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
 net/core/dev.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 0096a81b474f..6212c8b91fce 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1897,9 +1897,10 @@ int register_netdevice_notifier_net(struct net *net, struct notifier_block *nb)
 {
 	int err;
 
-	rtnl_lock();
+	rtnl_net_lock(net);
 	err = __register_netdevice_notifier_net(net, nb, false);
-	rtnl_unlock();
+	rtnl_net_unlock(net);
+
 	return err;
 }
 EXPORT_SYMBOL(register_netdevice_notifier_net);
@@ -1925,9 +1926,10 @@ int unregister_netdevice_notifier_net(struct net *net,
 {
 	int err;
 
-	rtnl_lock();
+	rtnl_net_lock(net);
 	err = __unregister_netdevice_notifier_net(net, nb);
-	rtnl_unlock();
+	rtnl_net_unlock(net);
+
 	return err;
 }
 EXPORT_SYMBOL(unregister_netdevice_notifier_net);
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 net-next 3/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net().
  2025-01-06  7:07 [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier() Kuniyuki Iwashima
  2025-01-06  7:07 ` [PATCH v2 net-next 2/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net() Kuniyuki Iwashima
@ 2025-01-06  7:07 ` Kuniyuki Iwashima
  2025-01-08  2:10 ` [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration patchwork-bot+netdevbpf
  3 siblings, 0 replies; 5+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-06  7:07 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

(un)?register_netdevice_notifier_dev_net() hold RTNL before triggering
the notifier for all netdev in the netns.

Let's convert the RTNL to rtnl_net_lock().

Note that move_netdevice_notifiers_dev_net() is assumed to be (but not
yet) protected by per-netns RTNL of both src and dst netns; we need to
convert wireless and hyperv drivers that call dev_change_net_namespace().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
 net/core/dev.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 6212c8b91fce..5086b5b55409 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1946,15 +1946,17 @@ int register_netdevice_notifier_dev_net(struct net_device *dev,
 					struct notifier_block *nb,
 					struct netdev_net_notifier *nn)
 {
+	struct net *net = dev_net(dev);
 	int err;
 
-	rtnl_lock();
-	err = __register_netdevice_notifier_net(dev_net(dev), nb, false);
+	rtnl_net_lock(net);
+	err = __register_netdevice_notifier_net(net, nb, false);
 	if (!err) {
 		nn->nb = nb;
 		list_add(&nn->list, &dev->net_notifier_list);
 	}
-	rtnl_unlock();
+	rtnl_net_unlock(net);
+
 	return err;
 }
 EXPORT_SYMBOL(register_netdevice_notifier_dev_net);
@@ -1963,12 +1965,14 @@ int unregister_netdevice_notifier_dev_net(struct net_device *dev,
 					  struct notifier_block *nb,
 					  struct netdev_net_notifier *nn)
 {
+	struct net *net = dev_net(dev);
 	int err;
 
-	rtnl_lock();
+	rtnl_net_lock(net);
 	list_del(&nn->list);
-	err = __unregister_netdevice_notifier_net(dev_net(dev), nb);
-	rtnl_unlock();
+	err = __unregister_netdevice_notifier_net(net, nb);
+	rtnl_net_unlock(net);
+
 	return err;
 }
 EXPORT_SYMBOL(unregister_netdevice_notifier_dev_net);
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration.
  2025-01-06  7:07 [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration Kuniyuki Iwashima
                   ` (2 preceding siblings ...)
  2025-01-06  7:07 ` [PATCH v2 net-next 3/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net() Kuniyuki Iwashima
@ 2025-01-08  2:10 ` patchwork-bot+netdevbpf
  3 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-01-08  2:10 UTC (permalink / raw)
  To: Kuniyuki Iwashima; +Cc: davem, edumazet, kuba, pabeni, horms, kuni1840, netdev

Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 6 Jan 2025 16:07:48 +0900 you wrote:
> This series adds per-netns RTNL for registration of the global
> and per-netns netdev notifiers.
> 
> 
> Changes:
>   v2:
>     * Drop patch 1 (leave global netdev_chain raw_notifier as is)
> 
> [...]

Here is the summary with links:
  - [v2,net-next,1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier().
    https://git.kernel.org/netdev/net-next/c/a239e0625097
  - [v2,net-next,2/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net().
    https://git.kernel.org/netdev/net-next/c/ca779f40654a
  - [v2,net-next,3/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net().
    https://git.kernel.org/netdev/net-next/c/7fb1073300a2

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-01-08  2:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-06  7:07 [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration Kuniyuki Iwashima
2025-01-06  7:07 ` [PATCH v2 net-next 1/3] net: Hold __rtnl_net_lock() in (un)?register_netdevice_notifier() Kuniyuki Iwashima
2025-01-06  7:07 ` [PATCH v2 net-next 2/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_net() Kuniyuki Iwashima
2025-01-06  7:07 ` [PATCH v2 net-next 3/3] net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net() Kuniyuki Iwashima
2025-01-08  2:10 ` [PATCH v2 net-next 0/3] net: Hold per-netns RTNL during netdev notifier registration patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).