[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250513081922.525716-1-mbloch@nvidia.com>
Date: Tue, 13 May 2025 11:19:22 +0300
From: Mark Bloch <mbloch@...dia.com>
To: Jay Vosburgh <jv@...sburgh.net>, "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, "Eric
Dumazet" <edumazet@...gle.com>, Andrew Lunn <andrew+netdev@...n.ch>
CC: Tariq Toukan <tariqt@...dia.com>, <netdev@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, Shay Drory <shayd@...dia.com>, Mark Bloch
<mbloch@...dia.com>
Subject: [PATCH net-next] net: Look for bonding slaves in the bond's network namespace
From: Shay Drory <shayd@...dia.com>
Update the for_each_netdev_in_bond_rcu macro to iterate through network
devices in the bond's network namespace instead of always using
init_net. This change is safe because:
1. **Bond-Slave Namespace Relationship**: A bond device and its slaves
must reside in the same network namespace. The bond device's
namespace is established at creation time and cannot change.
2. **Slave Movement Implications**: Any attempt to move a slave device
to a different namespace automatically removes it from the bond, as
per kernel networking stack rules.
This maintains the invariant that slaves must exist in the same
namespace as their bond.
This change is part of an effort to enable Link Aggregation (LAG) to
work properly inside custom network namespaces. Previously, the macro
would only find slave devices in the initial network namespace,
preventing proper bonding functionality in custom namespaces.
Signed-off-by: Shay Drory <shayd@...dia.com>
Signed-off-by: Mark Bloch <mbloch@...dia.com>
---
include/linux/netdevice.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 773167508c82..d584faa2dc4b 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3266,7 +3266,7 @@ int call_netdevice_notifiers_info(unsigned long val,
#define for_each_netdev_continue_rcu(net, d) \
list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list)
#define for_each_netdev_in_bond_rcu(bond, slave) \
- for_each_netdev_rcu(&init_net, slave) \
+ for_each_netdev_rcu(dev_net_rcu(bond), slave) \
if (netdev_master_upper_dev_get_rcu(slave) == (bond))
#define net_device_entry(lh) list_entry(lh, struct net_device, dev_list)
base-commit: e39d14a760c039af0653e3df967e7525413924a0
--
2.34.1
Powered by blists - more mailing lists