Skip to content

Commit 7566752

Browse files
chiarameiohasrleon
authored andcommitted
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 <[email protected]> Link: https://patch.msgid.link/093c978ef2766fd3ab4ff8798eeb68f2f11582f6.1730367038.git.leon@kernel.org Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 7c891a4 commit 7566752

File tree

3 files changed

+78
-2
lines changed

3 files changed

+78
-2
lines changed

drivers/infiniband/core/device.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ int ib_device_rename(struct ib_device *ibdev, const char *name)
437437
client->rename(ibdev, client_data);
438438
}
439439
up_read(&ibdev->client_data_rwsem);
440+
rdma_nl_notify_event(ibdev, 0, RDMA_RENAME_EVENT);
440441
up_read(&devices_rwsem);
441442
return 0;
442443
}
@@ -2853,6 +2854,40 @@ static const struct rdma_nl_cbs ibnl_ls_cb_table[RDMA_NL_LS_NUM_OPS] = {
28532854
},
28542855
};
28552856

2857+
static int ib_netdevice_event(struct notifier_block *this,
2858+
unsigned long event, void *ptr)
2859+
{
2860+
struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
2861+
struct net_device *ib_ndev;
2862+
struct ib_device *ibdev;
2863+
u32 port;
2864+
2865+
switch (event) {
2866+
case NETDEV_CHANGENAME:
2867+
ibdev = ib_device_get_by_netdev(ndev, RDMA_DRIVER_UNKNOWN);
2868+
if (!ibdev)
2869+
return NOTIFY_DONE;
2870+
2871+
rdma_for_each_port(ibdev, port) {
2872+
ib_ndev = ib_device_get_netdev(ibdev, port);
2873+
if (ndev == ib_ndev)
2874+
rdma_nl_notify_event(ibdev, port,
2875+
RDMA_NETDEV_RENAME_EVENT);
2876+
dev_put(ib_ndev);
2877+
}
2878+
ib_device_put(ibdev);
2879+
break;
2880+
default:
2881+
break;
2882+
}
2883+
2884+
return NOTIFY_DONE;
2885+
}
2886+
2887+
static struct notifier_block nb_netdevice = {
2888+
.notifier_call = ib_netdevice_event,
2889+
};
2890+
28562891
static int __init ib_core_init(void)
28572892
{
28582893
int ret = -ENOMEM;
@@ -2924,6 +2959,8 @@ static int __init ib_core_init(void)
29242959
goto err_parent;
29252960
}
29262961

2962+
register_netdevice_notifier(&nb_netdevice);
2963+
29272964
return 0;
29282965

29292966
err_parent:
@@ -2953,6 +2990,7 @@ static int __init ib_core_init(void)
29532990

29542991
static void __exit ib_core_cleanup(void)
29552992
{
2993+
unregister_netdevice_notifier(&nb_netdevice);
29562994
roce_gid_mgmt_cleanup();
29572995
rdma_nl_unregister(RDMA_NL_LS);
29582996
nldev_exit();

drivers/infiniband/core/nldev.c

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2729,6 +2729,25 @@ static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {
27292729
},
27302730
};
27312731

2732+
static int fill_mon_netdev_rename(struct sk_buff *msg,
2733+
struct ib_device *device, u32 port,
2734+
const struct net *net)
2735+
{
2736+
struct net_device *netdev = ib_device_get_netdev(device, port);
2737+
int ret = 0;
2738+
2739+
if (!netdev || !net_eq(dev_net(netdev), net))
2740+
goto out;
2741+
2742+
ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_NDEV_INDEX, netdev->ifindex);
2743+
if (ret)
2744+
goto out;
2745+
ret = nla_put_string(msg, RDMA_NLDEV_ATTR_NDEV_NAME, netdev->name);
2746+
out:
2747+
dev_put(netdev);
2748+
return ret;
2749+
}
2750+
27322751
static int fill_mon_netdev_association(struct sk_buff *msg,
27332752
struct ib_device *device, u32 port,
27342753
const struct net *net)
@@ -2793,6 +2812,18 @@ static void rdma_nl_notify_err_msg(struct ib_device *device, u32 port_num,
27932812
"Failed to send RDMA monitor netdev detach event: port %d\n",
27942813
port_num);
27952814
break;
2815+
case RDMA_RENAME_EVENT:
2816+
dev_warn_ratelimited(&device->dev,
2817+
"Failed to send RDMA monitor rename device event\n");
2818+
break;
2819+
2820+
case RDMA_NETDEV_RENAME_EVENT:
2821+
netdev = ib_device_get_netdev(device, port_num);
2822+
dev_warn_ratelimited(&device->dev,
2823+
"Failed to send RDMA monitor netdev rename event: port %d netdev %d\n",
2824+
port_num, netdev->ifindex);
2825+
dev_put(netdev);
2826+
break;
27962827
default:
27972828
break;
27982829
}
@@ -2820,14 +2851,19 @@ int rdma_nl_notify_event(struct ib_device *device, u32 port_num,
28202851
switch (type) {
28212852
case RDMA_REGISTER_EVENT:
28222853
case RDMA_UNREGISTER_EVENT:
2854+
case RDMA_RENAME_EVENT:
28232855
ret = fill_nldev_handle(skb, device);
28242856
if (ret)
28252857
goto err_free;
28262858
break;
28272859
case RDMA_NETDEV_ATTACH_EVENT:
28282860
case RDMA_NETDEV_DETACH_EVENT:
2829-
ret = fill_mon_netdev_association(skb, device,
2830-
port_num, net);
2861+
ret = fill_mon_netdev_association(skb, device, port_num, net);
2862+
if (ret)
2863+
goto err_free;
2864+
break;
2865+
case RDMA_NETDEV_RENAME_EVENT:
2866+
ret = fill_mon_netdev_rename(skb, device, port_num, net);
28312867
if (ret)
28322868
goto err_free;
28332869
break;

include/uapi/rdma/rdma_netlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,8 @@ enum rdma_nl_notify_event_type {
638638
RDMA_UNREGISTER_EVENT,
639639
RDMA_NETDEV_ATTACH_EVENT,
640640
RDMA_NETDEV_DETACH_EVENT,
641+
RDMA_RENAME_EVENT,
642+
RDMA_NETDEV_RENAME_EVENT,
641643
};
642644

643645
#endif /* _UAPI_RDMA_NETLINK_H */

0 commit comments

Comments
 (0)