]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/core: Implement RoCE GID port rescan and export delete function
authorChiara Meiohas <cmeiohas@nvidia.com>
Thu, 31 Oct 2024 13:36:51 +0000 (15:36 +0200)
committerLeon Romanovsky <leon@kernel.org>
Mon, 4 Nov 2024 11:57:21 +0000 (06:57 -0500)
rdma_roce_rescan_port() scans all network devices in
the system and adds the gids if relevant to the RoCE device
port. When not in bonding mode it adds the GIDs of the
netdevice in this port. When in bonding mode it adds the
GIDs of both the port's netdevice and the bond master
netdevice.

Export roce_del_all_netdev_gids(), which  removes all GIDs
associated with a specific netdevice for a given port.

Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
Link: https://patch.msgid.link/674d498da4637a1503ff1367e28bd09ff942fd5e.1730381292.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/core/roce_gid_mgmt.c
include/rdma/ib_verbs.h

index d5131b3ba8ab04d836764dfd7141868da01bff27..a9f2c6b1b29ed2b537bd6d7feec7d3a18e63d94b 100644 (file)
@@ -515,6 +515,27 @@ void rdma_roce_rescan_device(struct ib_device *ib_dev)
 }
 EXPORT_SYMBOL(rdma_roce_rescan_device);
 
+/**
+ * rdma_roce_rescan_port - Rescan all of the network devices in the system
+ * and add their gids if relevant to the port of the RoCE device.
+ *
+ * @ib_dev: IB device
+ * @port: Port number
+ */
+void rdma_roce_rescan_port(struct ib_device *ib_dev, u32 port)
+{
+       struct net_device *ndev = NULL;
+
+       if (rdma_protocol_roce(ib_dev, port)) {
+               ndev = ib_device_get_netdev(ib_dev, port);
+               if (!ndev)
+                       return;
+               enum_all_gids_of_dev_cb(ib_dev, port, ndev, ndev);
+               dev_put(ndev);
+       }
+}
+EXPORT_SYMBOL(rdma_roce_rescan_port);
+
 static void callback_for_addr_gid_device_scan(struct ib_device *device,
                                              u32 port,
                                              struct net_device *rdma_ndev,
@@ -575,16 +596,17 @@ static void handle_netdev_upper(struct ib_device *ib_dev, u32 port,
        }
 }
 
-static void _roce_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
-                                     struct net_device *event_ndev)
+void roce_del_all_netdev_gids(struct ib_device *ib_dev,
+                             u32 port, struct net_device *ndev)
 {
-       ib_cache_gid_del_all_netdev_gids(ib_dev, port, event_ndev);
+       ib_cache_gid_del_all_netdev_gids(ib_dev, port, ndev);
 }
+EXPORT_SYMBOL(roce_del_all_netdev_gids);
 
 static void del_netdev_upper_ips(struct ib_device *ib_dev, u32 port,
                                 struct net_device *rdma_ndev, void *cookie)
 {
-       handle_netdev_upper(ib_dev, port, cookie, _roce_del_all_netdev_gids);
+       handle_netdev_upper(ib_dev, port, cookie, roce_del_all_netdev_gids);
 }
 
 static void add_netdev_upper_ips(struct ib_device *ib_dev, u32 port,
index 9cb8b5fe7eee4c91f3157088246a8ae4f1c212a8..67551133b5228eb2d773862ddad91719b685b7f9 100644 (file)
@@ -4734,6 +4734,9 @@ ib_get_vector_affinity(struct ib_device *device, int comp_vector)
  * @device:         the rdma device
  */
 void rdma_roce_rescan_device(struct ib_device *ibdev);
+void rdma_roce_rescan_port(struct ib_device *ib_dev, u32 port);
+void roce_del_all_netdev_gids(struct ib_device *ib_dev,
+                             u32 port, struct net_device *ndev);
 
 struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile);