RDMA/siw,rxe: Make emulated devices virtual in the device tree
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 6 Nov 2020 14:00:49 +0000 (10:00 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 23 Nov 2020 20:14:31 +0000 (16:14 -0400)
This moves siw and rxe to be virtual devices in the device tree:

lrwxrwxrwx 1 root root 0 Nov  6 13:55 /sys/class/infiniband/rxe0 -> ../../devices/virtual/infiniband/rxe0/

Previously they were trying to parent themselves to the physical device of
their attached netdev, which doesn't make alot of sense.

My hope is this will solve some weird syzkaller hits related to sysfs as
it could be possible that the parent of a netdev is another netdev, eg
under bonding or some other syzkaller found netdev configuration.

Nesting a ib_device under anything but a physical device is going to cause
inconsistencies in sysfs during destructions.

Link: https://lore.kernel.org/r/0-v1-dcbfc68c4b4a+d6-virtual_dev_jgg@nvidia.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_net.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/sw/siw/siw_main.c

index ee3cf3af7caba59aef7a8b5097c951b5444e32a8..c4b06ced30a75b1b7441d130adfaa3a6d7bc1d8d 100644 (file)
 
 static struct rxe_recv_sockets recv_sockets;
 
-struct device *rxe_dma_device(struct rxe_dev *rxe)
-{
-       struct net_device *ndev;
-
-       ndev = rxe->ndev;
-
-       return ndev->dev.parent;
-}
-
 int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
 {
        int err;
index a2bd91aaa5de956cc1cb777340ff475dc6aff168..2fbea2b2d72a178a2ddd89c26ef82140f113f7b2 100644 (file)
@@ -1134,7 +1134,6 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
        dev->node_type = RDMA_NODE_IB_CA;
        dev->phys_port_cnt = 1;
        dev->num_comp_vectors = num_possible_cpus();
-       dev->dev.parent = rxe_dma_device(rxe);
        dev->local_dma_lkey = 0;
        addrconf_addr_eui48((unsigned char *)&dev->node_guid,
                            rxe->ndev->dev_addr);
index d9de062852c4f92b902246b6574580449b0a7ed9..ee95cf29179d2df6aa76f59e4779a34abb86b767 100644 (file)
@@ -305,24 +305,8 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
 {
        struct siw_device *sdev = NULL;
        struct ib_device *base_dev;
-       struct device *parent = netdev->dev.parent;
        int rv;
 
-       if (!parent) {
-               /*
-                * The loopback device has no parent device,
-                * so it appears as a top-level device. To support
-                * loopback device connectivity, take this device
-                * as the parent device. Skip all other devices
-                * w/o parent device.
-                */
-               if (netdev->type != ARPHRD_LOOPBACK) {
-                       pr_warn("siw: device %s error: no parent device\n",
-                               netdev->name);
-                       return NULL;
-               }
-               parent = &netdev->dev;
-       }
        sdev = ib_alloc_device(siw_device, base_dev);
        if (!sdev)
                return NULL;
@@ -359,7 +343,6 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
         * per physical port.
         */
        base_dev->phys_port_cnt = 1;
-       base_dev->dev.parent = parent;
        base_dev->num_comp_vectors = num_possible_cpus();
 
        xa_init_flags(&sdev->qp_xa, XA_FLAGS_ALLOC1);
@@ -401,7 +384,7 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
        atomic_set(&sdev->num_mr, 0);
        atomic_set(&sdev->num_pd, 0);
 
-       sdev->numa_node = dev_to_node(parent);
+       sdev->numa_node = dev_to_node(&netdev->dev);
        spin_lock_init(&sdev->lock);
 
        return sdev;