]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/rxe: Make rping work with tun device
authorZhu Yanjun <yanjun.zhu@linux.dev>
Sun, 19 Jan 2025 17:28:31 +0000 (18:28 +0100)
committerLeon Romanovsky <leon@kernel.org>
Mon, 3 Feb 2025 11:38:43 +0000 (06:38 -0500)
Because the type of tun device is ARPHRD_NONE, in cma, ARPHRD_NONE is
not recognized. To RXE device, just as SIW does, ARPHRD_NONE is added
to support.

Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Link: https://patch.msgid.link/20250119172831.3123110-4-yanjun.zhu@linux.dev
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/core/cma.c

index 91db10515d7472ada068f100874371c8e3bac57d..fedcdb56fb6b7c95819a43e6ac0cd3dad69e9815 100644 (file)
@@ -739,12 +739,26 @@ cma_validate_port(struct ib_device *device, u32 port,
                goto out;
        }
 
-       if (dev_type == ARPHRD_ETHER && rdma_protocol_roce(device, port)) {
-               ndev = dev_get_by_index(dev_addr->net, bound_if_index);
-               if (!ndev)
-                       goto out;
+       /*
+        * For a RXE device, it should work with TUN device and normal ethernet
+        * devices. Use driver_id to check if a device is a RXE device or not.
+        * ARPHDR_NONE means a TUN device.
+        */
+       if (device->ops.driver_id == RDMA_DRIVER_RXE) {
+               if ((dev_type == ARPHRD_NONE || dev_type == ARPHRD_ETHER)
+                       && rdma_protocol_roce(device, port)) {
+                       ndev = dev_get_by_index(dev_addr->net, bound_if_index);
+                       if (!ndev)
+                               goto out;
+               }
        } else {
-               gid_type = IB_GID_TYPE_IB;
+               if (dev_type == ARPHRD_ETHER && rdma_protocol_roce(device, port)) {
+                       ndev = dev_get_by_index(dev_addr->net, bound_if_index);
+                       if (!ndev)
+                               goto out;
+               } else {
+                       gid_type = IB_GID_TYPE_IB;
+               }
        }
 
        sgid_attr = rdma_find_gid_by_port(device, gid, gid_type, port, ndev);