RDMA/nldev: Add IB device and net device rename events

Implement event sending for IB device rename and IB device
port associated netdevice rename.

In iproute2, rdma monitor displays the IB device name, port
and the netdevice name when displaying event info. Since
users can modiy these names, we track and notify on renaming
events.

Note: In order to receive netdevice rename events, drivers
must use the ib_device_set_netdev() API when attaching net
devices to IB devices.

$ rdma monitor
$ rmmod mlx5_ib
[UNREGISTER]	dev 1  rocep8s0f1
[UNREGISTER]	dev 0  rocep8s0f0

$ modprobe mlx5_ib
[REGISTER]	dev 2  mlx5_0
[NETDEV_ATTACH]	dev 2  mlx5_0 port 1 netdev 4 eth2
[REGISTER]	dev 3  mlx5_1
[NETDEV_ATTACH]	dev 3  mlx5_1 port 1 netdev 5 eth3
[RENAME]	dev 2  rocep8s0f0
[RENAME]	dev 3  rocep8s0f1

$ devlink dev eswitch set pci/0000:08:00.0 mode switchdev
[UNREGISTER]	dev 2  rocep8s0f0
[REGISTER]	dev 4  mlx5_0
[NETDEV_ATTACH]	dev 4  mlx5_0 port 30 netdev 4 eth2
[RENAME]	dev 4  rdmap8s0f0

$ echo 4 > /sys/class/net/eth2/device/sriov_numvfs
[NETDEV_ATTACH]	dev 4  rdmap8s0f0 port 2 netdev 7 eth4
[NETDEV_ATTACH]	dev 4  rdmap8s0f0 port 3 netdev 8 eth5
[NETDEV_ATTACH]	dev 4  rdmap8s0f0 port 4 netdev 9 eth6
[NETDEV_ATTACH]	dev 4  rdmap8s0f0 port 5 netdev 10 eth7
[REGISTER]	dev 5  mlx5_0
[NETDEV_ATTACH]	dev 5  mlx5_0 port 1 netdev 11 eth8
[REGISTER]	dev 6  mlx5_1
[NETDEV_ATTACH]	dev 6  mlx5_1 port 1 netdev 12 eth9
[RENAME]	dev 5  rocep8s0f0v0
[RENAME]	dev 6  rocep8s0f0v1
[REGISTER]	dev 7  mlx5_0
[NETDEV_ATTACH]	dev 7  mlx5_0 port 1 netdev 13 eth10
[RENAME]	dev 7  rocep8s0f0v2
[REGISTER]	dev 8  mlx5_0
[NETDEV_ATTACH]	dev 8  mlx5_0 port 1 netdev 14 eth11
[RENAME]	dev 8  rocep8s0f0v3

$ ip link set eth2 name myeth2
[NETDEV_RENAME]	 netdev 4 myeth2

$ ip link set eth1 name myeth1

** no events received, because eth1 is not attached to
   an IB device **

Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
Link: https://patch.msgid.link/093c978ef2766fd3ab4ff8798eeb68f2f11582f6.1730367038.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Chiara Meiohas 2024-10-31 11:31:14 +02:00 committed by Leon Romanovsky
parent 7c891a4dbc
commit 7566752e4d
3 changed files with 78 additions and 2 deletions

View File

@ -437,6 +437,7 @@ int ib_device_rename(struct ib_device *ibdev, const char *name)
client->rename(ibdev, client_data); client->rename(ibdev, client_data);
} }
up_read(&ibdev->client_data_rwsem); up_read(&ibdev->client_data_rwsem);
rdma_nl_notify_event(ibdev, 0, RDMA_RENAME_EVENT);
up_read(&devices_rwsem); up_read(&devices_rwsem);
return 0; return 0;
} }
@ -2853,6 +2854,40 @@ static const struct rdma_nl_cbs ibnl_ls_cb_table[RDMA_NL_LS_NUM_OPS] = {
}, },
}; };
static int ib_netdevice_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
struct net_device *ib_ndev;
struct ib_device *ibdev;
u32 port;
switch (event) {
case NETDEV_CHANGENAME:
ibdev = ib_device_get_by_netdev(ndev, RDMA_DRIVER_UNKNOWN);
if (!ibdev)
return NOTIFY_DONE;
rdma_for_each_port(ibdev, port) {
ib_ndev = ib_device_get_netdev(ibdev, port);
if (ndev == ib_ndev)
rdma_nl_notify_event(ibdev, port,
RDMA_NETDEV_RENAME_EVENT);
dev_put(ib_ndev);
}
ib_device_put(ibdev);
break;
default:
break;
}
return NOTIFY_DONE;
}
static struct notifier_block nb_netdevice = {
.notifier_call = ib_netdevice_event,
};
static int __init ib_core_init(void) static int __init ib_core_init(void)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
@ -2924,6 +2959,8 @@ static int __init ib_core_init(void)
goto err_parent; goto err_parent;
} }
register_netdevice_notifier(&nb_netdevice);
return 0; return 0;
err_parent: err_parent:
@ -2953,6 +2990,7 @@ static int __init ib_core_init(void)
static void __exit ib_core_cleanup(void) static void __exit ib_core_cleanup(void)
{ {
unregister_netdevice_notifier(&nb_netdevice);
roce_gid_mgmt_cleanup(); roce_gid_mgmt_cleanup();
rdma_nl_unregister(RDMA_NL_LS); rdma_nl_unregister(RDMA_NL_LS);
nldev_exit(); nldev_exit();

View File

@ -2729,6 +2729,25 @@ static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {
}, },
}; };
static int fill_mon_netdev_rename(struct sk_buff *msg,
struct ib_device *device, u32 port,
const struct net *net)
{
struct net_device *netdev = ib_device_get_netdev(device, port);
int ret = 0;
if (!netdev || !net_eq(dev_net(netdev), net))
goto out;
ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_NDEV_INDEX, netdev->ifindex);
if (ret)
goto out;
ret = nla_put_string(msg, RDMA_NLDEV_ATTR_NDEV_NAME, netdev->name);
out:
dev_put(netdev);
return ret;
}
static int fill_mon_netdev_association(struct sk_buff *msg, static int fill_mon_netdev_association(struct sk_buff *msg,
struct ib_device *device, u32 port, struct ib_device *device, u32 port,
const struct net *net) const struct net *net)
@ -2793,6 +2812,18 @@ static void rdma_nl_notify_err_msg(struct ib_device *device, u32 port_num,
"Failed to send RDMA monitor netdev detach event: port %d\n", "Failed to send RDMA monitor netdev detach event: port %d\n",
port_num); port_num);
break; break;
case RDMA_RENAME_EVENT:
dev_warn_ratelimited(&device->dev,
"Failed to send RDMA monitor rename device event\n");
break;
case RDMA_NETDEV_RENAME_EVENT:
netdev = ib_device_get_netdev(device, port_num);
dev_warn_ratelimited(&device->dev,
"Failed to send RDMA monitor netdev rename event: port %d netdev %d\n",
port_num, netdev->ifindex);
dev_put(netdev);
break;
default: default:
break; break;
} }
@ -2820,14 +2851,19 @@ int rdma_nl_notify_event(struct ib_device *device, u32 port_num,
switch (type) { switch (type) {
case RDMA_REGISTER_EVENT: case RDMA_REGISTER_EVENT:
case RDMA_UNREGISTER_EVENT: case RDMA_UNREGISTER_EVENT:
case RDMA_RENAME_EVENT:
ret = fill_nldev_handle(skb, device); ret = fill_nldev_handle(skb, device);
if (ret) if (ret)
goto err_free; goto err_free;
break; break;
case RDMA_NETDEV_ATTACH_EVENT: case RDMA_NETDEV_ATTACH_EVENT:
case RDMA_NETDEV_DETACH_EVENT: case RDMA_NETDEV_DETACH_EVENT:
ret = fill_mon_netdev_association(skb, device, ret = fill_mon_netdev_association(skb, device, port_num, net);
port_num, net); if (ret)
goto err_free;
break;
case RDMA_NETDEV_RENAME_EVENT:
ret = fill_mon_netdev_rename(skb, device, port_num, net);
if (ret) if (ret)
goto err_free; goto err_free;
break; break;

View File

@ -638,6 +638,8 @@ enum rdma_nl_notify_event_type {
RDMA_UNREGISTER_EVENT, RDMA_UNREGISTER_EVENT,
RDMA_NETDEV_ATTACH_EVENT, RDMA_NETDEV_ATTACH_EVENT,
RDMA_NETDEV_DETACH_EVENT, RDMA_NETDEV_DETACH_EVENT,
RDMA_RENAME_EVENT,
RDMA_NETDEV_RENAME_EVENT,
}; };
#endif /* _UAPI_RDMA_NETLINK_H */ #endif /* _UAPI_RDMA_NETLINK_H */