RDMA/core: Create "issm*" device nodes only when SMI is supported
authorMark Zhang <markzhang@nvidia.com>
Sun, 16 Jun 2024 16:08:33 +0000 (19:08 +0300)
committerLeon Romanovsky <leonro@nvidia.com>
Mon, 1 Jul 2024 12:10:15 +0000 (15:10 +0300)
For an IB port create it's issm device node only when it has SMI
capability. In following patches mlx5 is going to support IB devices
without this cap.

Signed-off-by: Mark Zhang <markzhang@nvidia.com>
Link: https://lore.kernel.org/r/359f73c9a388d5e3ae971e40d8507888b1ba6f93.1718553901.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
drivers/infiniband/core/user_mad.c

index 2ed749f50a29ff6c32ac7a38046d249ca694b3da..f760dfffa1886bc7b687912960a5e930d0793444 100644 (file)
@@ -1321,15 +1321,17 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
        if (ret)
                goto err_cdev;
 
-       ib_umad_init_port_dev(&port->sm_dev, port, device);
-       port->sm_dev.devt = base_issm;
-       dev_set_name(&port->sm_dev, "issm%d", port->dev_num);
-       cdev_init(&port->sm_cdev, &umad_sm_fops);
-       port->sm_cdev.owner = THIS_MODULE;
-
-       ret = cdev_device_add(&port->sm_cdev, &port->sm_dev);
-       if (ret)
-               goto err_dev;
+       if (rdma_cap_ib_smi(device, port_num)) {
+               ib_umad_init_port_dev(&port->sm_dev, port, device);
+               port->sm_dev.devt = base_issm;
+               dev_set_name(&port->sm_dev, "issm%d", port->dev_num);
+               cdev_init(&port->sm_cdev, &umad_sm_fops);
+               port->sm_cdev.owner = THIS_MODULE;
+
+               ret = cdev_device_add(&port->sm_cdev, &port->sm_dev);
+               if (ret)
+                       goto err_dev;
+       }
 
        return 0;
 
@@ -1345,9 +1347,13 @@ err_cdev:
 static void ib_umad_kill_port(struct ib_umad_port *port)
 {
        struct ib_umad_file *file;
+       bool has_smi = false;
        int id;
 
-       cdev_device_del(&port->sm_cdev, &port->sm_dev);
+       if (rdma_cap_ib_smi(port->ib_dev, port->port_num)) {
+               cdev_device_del(&port->sm_cdev, &port->sm_dev);
+               has_smi = true;
+       }
        cdev_device_del(&port->cdev, &port->dev);
 
        mutex_lock(&port->file_mutex);
@@ -1373,7 +1379,8 @@ static void ib_umad_kill_port(struct ib_umad_port *port)
        ida_free(&umad_ida, port->dev_num);
 
        /* balances device_initialize() */
-       put_device(&port->sm_dev);
+       if (has_smi)
+               put_device(&port->sm_dev);
        put_device(&port->dev);
 }