mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
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:
parent
7c891a4dbc
commit
7566752e4d
@ -437,6 +437,7 @@ int ib_device_rename(struct ib_device *ibdev, const char *name)
|
||||
client->rename(ibdev, client_data);
|
||||
}
|
||||
up_read(&ibdev->client_data_rwsem);
|
||||
rdma_nl_notify_event(ibdev, 0, RDMA_RENAME_EVENT);
|
||||
up_read(&devices_rwsem);
|
||||
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)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
@ -2924,6 +2959,8 @@ static int __init ib_core_init(void)
|
||||
goto err_parent;
|
||||
}
|
||||
|
||||
register_netdevice_notifier(&nb_netdevice);
|
||||
|
||||
return 0;
|
||||
|
||||
err_parent:
|
||||
@ -2953,6 +2990,7 @@ err:
|
||||
|
||||
static void __exit ib_core_cleanup(void)
|
||||
{
|
||||
unregister_netdevice_notifier(&nb_netdevice);
|
||||
roce_gid_mgmt_cleanup();
|
||||
rdma_nl_unregister(RDMA_NL_LS);
|
||||
nldev_exit();
|
||||
|
@ -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,
|
||||
struct ib_device *device, u32 port,
|
||||
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",
|
||||
port_num);
|
||||
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:
|
||||
break;
|
||||
}
|
||||
@ -2820,14 +2851,19 @@ int rdma_nl_notify_event(struct ib_device *device, u32 port_num,
|
||||
switch (type) {
|
||||
case RDMA_REGISTER_EVENT:
|
||||
case RDMA_UNREGISTER_EVENT:
|
||||
case RDMA_RENAME_EVENT:
|
||||
ret = fill_nldev_handle(skb, device);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
break;
|
||||
case RDMA_NETDEV_ATTACH_EVENT:
|
||||
case RDMA_NETDEV_DETACH_EVENT:
|
||||
ret = fill_mon_netdev_association(skb, device,
|
||||
port_num, net);
|
||||
ret = fill_mon_netdev_association(skb, device, 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)
|
||||
goto err_free;
|
||||
break;
|
||||
|
@ -638,6 +638,8 @@ enum rdma_nl_notify_event_type {
|
||||
RDMA_UNREGISTER_EVENT,
|
||||
RDMA_NETDEV_ATTACH_EVENT,
|
||||
RDMA_NETDEV_DETACH_EVENT,
|
||||
RDMA_RENAME_EVENT,
|
||||
RDMA_NETDEV_RENAME_EVENT,
|
||||
};
|
||||
|
||||
#endif /* _UAPI_RDMA_NETLINK_H */
|
||||
|
Loading…
Reference in New Issue
Block a user