* [PATCH] RDMA/mana_ib: Use the correct net device for IB
2024-11-27 19:43 [PATCH 1/3] RDMA/core: Do not use netdev if it is a bonded slave longli
@ 2024-11-27 19:43 ` longli
2024-11-27 19:43 ` [PATCH 2/3] RDMA/core: Use upper_device_filter() to add upper IPs longli
2024-11-27 19:43 ` [PATCH 3/3] RDMA/core: Add default IP when a bonded slave is unlinked longli
2 siblings, 0 replies; 4+ messages in thread
From: longli @ 2024-11-27 19:43 UTC (permalink / raw)
To: Jason Gunthorpe, Leon Romanovsky, Ajay Sharma, Konstantin Taranov,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
Cc: linux-rdma, netdev, linux-kernel, linux-hyperv, Long Li, stable
From: Long Li <longli@microsoft.com>
mana_ib should not set the net device on its master device when it's
bonded. The main purpose of doing this is to get the correct GID, however
it makes it impossible to unload the master device from kernel, and move
to user-space (e.g. DPDK usage).
Fix this by using its VF device as net device. RoCE core will handle the
GID caching by looking for its correct master device.
Fixes: 1df03a4b4414 ("RDMA/mana_ib: Set correct device into ib")
Cc: stable@kernel.org
Signed-off-by: Long Li <longli@microsoft.com>
---
drivers/infiniband/hw/mana/device.c | 7 +++----
drivers/net/ethernet/microsoft/mana/mana_en.c | 16 +++-------------
include/net/mana/mana.h | 2 +-
3 files changed, 7 insertions(+), 18 deletions(-)
diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/mana/device.c
index 7ac01918ef7c..52784a7cf89a 100644
--- a/drivers/infiniband/hw/mana/device.c
+++ b/drivers/infiniband/hw/mana/device.c
@@ -84,18 +84,17 @@ static int mana_ib_probe(struct auxiliary_device *adev,
dev->ib_dev.num_comp_vectors = mdev->gdma_context->max_num_queues;
dev->ib_dev.dev.parent = mdev->gdma_context->dev;
- rcu_read_lock(); /* required to get primary netdev */
- ndev = mana_get_primary_netdev_rcu(mc, 0);
+ ndev = mana_get_primary_netdev(mc, 0);
if (!ndev) {
- rcu_read_unlock();
ret = -ENODEV;
ibdev_err(&dev->ib_dev, "Failed to get netdev for IB port 1");
goto free_ib_device;
}
+
ether_addr_copy(mac_addr, ndev->dev_addr);
addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, ndev->dev_addr);
+
ret = ib_device_set_netdev(&dev->ib_dev, ndev, 1);
- rcu_read_unlock();
if (ret) {
ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
goto free_ib_device;
diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
index 57ac732e7707..c0c5e2997a9d 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -3130,21 +3130,11 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
kfree(ac);
}
-struct net_device *mana_get_primary_netdev_rcu(struct mana_context *ac, u32 port_index)
+struct net_device *mana_get_primary_netdev(struct mana_context *ac, u32 port_index)
{
- struct net_device *ndev;
-
- RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
- "Taking primary netdev without holding the RCU read lock");
if (port_index >= ac->num_ports)
return NULL;
- /* When mana is used in netvsc, the upper netdevice should be returned. */
- if (ac->ports[port_index]->flags & IFF_SLAVE)
- ndev = netdev_master_upper_dev_get_rcu(ac->ports[port_index]);
- else
- ndev = ac->ports[port_index];
-
- return ndev;
+ return ac->ports[port_index];
}
-EXPORT_SYMBOL_NS(mana_get_primary_netdev_rcu, NET_MANA);
+EXPORT_SYMBOL_NS(mana_get_primary_netdev, NET_MANA);
diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h
index 0d00b24eacaf..770359ce7d3b 100644
--- a/include/net/mana/mana.h
+++ b/include/net/mana/mana.h
@@ -827,5 +827,5 @@ int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
u32 doorbell_pg_id);
void mana_uncfg_vport(struct mana_port_context *apc);
-struct net_device *mana_get_primary_netdev_rcu(struct mana_context *ac, u32 port_index);
+struct net_device *mana_get_primary_netdev(struct mana_context *ac, u32 port_index);
#endif /* _MANA_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 2/3] RDMA/core: Use upper_device_filter() to add upper IPs
2024-11-27 19:43 [PATCH 1/3] RDMA/core: Do not use netdev if it is a bonded slave longli
2024-11-27 19:43 ` [PATCH] RDMA/mana_ib: Use the correct net device for IB longli
@ 2024-11-27 19:43 ` longli
2024-11-27 19:43 ` [PATCH 3/3] RDMA/core: Add default IP when a bonded slave is unlinked longli
2 siblings, 0 replies; 4+ messages in thread
From: longli @ 2024-11-27 19:43 UTC (permalink / raw)
To: Jason Gunthorpe, Leon Romanovsky, Ajay Sharma, Konstantin Taranov,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
Cc: linux-rdma, netdev, linux-kernel, linux-hyperv, Long Li
From: Long Li <longli@microsoft.com>
add_cmd_upper_ips() is used to add upper IPs on a bonded slave. Its
filter function should be set to the same as upper_ips_del_cmd() in that
it looks for upper netdevs for GIDs.
Signed-off-by: Long Li <longli@microsoft.com>
---
drivers/infiniband/core/roce_gid_mgmt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/infiniband/core/roce_gid_mgmt.c b/drivers/infiniband/core/roce_gid_mgmt.c
index 27a3ffed11b9..827a50dbd308 100644
--- a/drivers/infiniband/core/roce_gid_mgmt.c
+++ b/drivers/infiniband/core/roce_gid_mgmt.c
@@ -689,7 +689,7 @@ static const struct netdev_event_work_cmd add_cmd = {
static const struct netdev_event_work_cmd add_cmd_upper_ips = {
.cb = add_netdev_upper_ips,
- .filter = is_eth_port_of_netdev_filter
+ .filter = upper_device_filter
};
static void
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 3/3] RDMA/core: Add default IP when a bonded slave is unlinked
2024-11-27 19:43 [PATCH 1/3] RDMA/core: Do not use netdev if it is a bonded slave longli
2024-11-27 19:43 ` [PATCH] RDMA/mana_ib: Use the correct net device for IB longli
2024-11-27 19:43 ` [PATCH 2/3] RDMA/core: Use upper_device_filter() to add upper IPs longli
@ 2024-11-27 19:43 ` longli
2 siblings, 0 replies; 4+ messages in thread
From: longli @ 2024-11-27 19:43 UTC (permalink / raw)
To: Jason Gunthorpe, Leon Romanovsky, Ajay Sharma, Konstantin Taranov,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
Cc: linux-rdma, netdev, linux-kernel, linux-hyperv, Long Li
From: Long Li <longli@microsoft.com>
When a bonded slave is unlikned, the current code doesn't add a default
GID for the new unlinked netdev.
Add a default GID for the netdev.
Signed-off-by: Long Li <longli@microsoft.com>
---
drivers/infiniband/core/roce_gid_mgmt.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/infiniband/core/roce_gid_mgmt.c b/drivers/infiniband/core/roce_gid_mgmt.c
index 827a50dbd308..3fa2740fa0d2 100644
--- a/drivers/infiniband/core/roce_gid_mgmt.c
+++ b/drivers/infiniband/core/roce_gid_mgmt.c
@@ -692,6 +692,11 @@ static const struct netdev_event_work_cmd add_cmd_upper_ips = {
.filter = upper_device_filter
};
+static const struct netdev_event_work_cmd add_default_gid_cmd = {
+ .cb = add_default_gids,
+ .filter = is_ndev_for_default_gid_filter,
+};
+
static void
ndev_event_unlink(struct netdev_notifier_changeupper_info *changeupper_info,
struct netdev_event_work_cmd *cmds)
@@ -704,7 +709,8 @@ ndev_event_unlink(struct netdev_notifier_changeupper_info *changeupper_info,
cmds[0] = upper_ips_del_cmd;
cmds[0].ndev = changeupper_info->upper_dev;
- cmds[1] = add_cmd;
+ cmds[1] = add_default_gid_cmd;
+ cmds[2] = add_cmd;
}
static const struct netdev_event_work_cmd bonding_default_add_cmd = {
@@ -751,11 +757,6 @@ static void netdevice_event_changeupper(struct net_device *event_ndev,
ndev_event_unlink(changeupper_info, cmds);
}
-static const struct netdev_event_work_cmd add_default_gid_cmd = {
- .cb = add_default_gids,
- .filter = is_ndev_for_default_gid_filter,
-};
-
static int netdevice_event(struct notifier_block *this, unsigned long event,
void *ptr)
{
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread