IB/uverbs: Extend uverbs_ioctl header with driver_id
authorMatan Barak <matanb@mellanox.com>
Mon, 19 Mar 2018 13:02:34 +0000 (15:02 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 19 Mar 2018 20:45:17 +0000 (14:45 -0600)
Extending uverbs_ioctl header with driver_id and another reserved
field. driver_id should be used in order to identify the driver.
Since every driver could have its own parsing tree, this is necessary
for strace support.
Downstream patches take off the EXPERIMENTAL flag from the ioctl() IB
support and thus we add some reserved fields for future usage.

Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
21 files changed:
drivers/infiniband/core/uverbs_ioctl.c
drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/cxgb3/iwch_provider.c
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/nes/nes_verbs.c
drivers/infiniband/hw/ocrdma/ocrdma_main.c
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qib/qib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_main.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
drivers/infiniband/sw/rdmavt/vt.c
drivers/infiniband/sw/rxe/rxe_verbs.c
include/rdma/ib_verbs.h
include/rdma/rdma_vt.h
include/uapi/rdma/rdma_user_ioctl_cmds.h

index 339b851450446567d34780aec5779d0aa76fedeb..7016e729f139fd527ad381a2c49a38522cc0ee96 100644 (file)
@@ -246,6 +246,9 @@ static long ib_uverbs_cmd_verbs(struct ib_device *ib_dev,
        size_t ctx_size;
        uintptr_t data[UVERBS_OPTIMIZE_USING_STACK_SZ / sizeof(uintptr_t)];
 
+       if (hdr->driver_id != ib_dev->driver_id)
+               return -EINVAL;
+
        object_spec = uverbs_get_object(ib_dev, hdr->object_id);
        if (!object_spec)
                return -EPROTONOSUPPORT;
@@ -350,7 +353,7 @@ long ib_uverbs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                        goto out;
                }
 
-               if (hdr.reserved) {
+               if (hdr.reserved1 || hdr.reserved2) {
                        err = -EPROTONOSUPPORT;
                        goto out;
                }
index f6e361750466f50acab01a4f1a397260e3a84472..abe0be8b5ddcda0a5040d5893085303e9961b77c 100644 (file)
@@ -619,6 +619,7 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
        ibdev->get_hw_stats             = bnxt_re_ib_get_hw_stats;
        ibdev->alloc_hw_stats           = bnxt_re_ib_alloc_hw_stats;
 
+       ibdev->driver_id = RDMA_DRIVER_BNXT_RE;
        return ib_register_device(ibdev, NULL);
 }
 
index a578ca559e112920f23d84606564a6e1b60972fc..1804b6c4a6ec13415a9075e32a9f059c03e30968 100644 (file)
@@ -1439,6 +1439,7 @@ int iwch_register_device(struct iwch_dev *dev)
        memcpy(dev->ibdev.iwcm->ifname, dev->rdev.t3cdev_p->lldev->name,
               sizeof(dev->ibdev.iwcm->ifname));
 
+       dev->ibdev.driver_id = RDMA_DRIVER_CXGB3;
        ret = ib_register_device(&dev->ibdev, NULL);
        if (ret)
                goto bail1;
index 42568a4df3f83fe8f000a9b3d2aaa7c5d89a23f8..dc4eabd85f54c0dabf26f89ac497b975c94917a2 100644 (file)
@@ -629,6 +629,7 @@ void c4iw_register_device(struct work_struct *work)
        memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name,
               sizeof(dev->ibdev.iwcm->ifname));
 
+       dev->ibdev.driver_id = RDMA_DRIVER_CXGB4;
        ret = ib_register_device(&dev->ibdev, NULL);
        if (ret)
                goto err_kfree_iwcm;
index 471d55c5006689303208e5770247bda8733e5cad..c8cf4d4984d3439773e3d04d1cfebd664d686378 100644 (file)
@@ -1960,7 +1960,7 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd)
                              i,
                              ppd->pkeys);
 
-       ret = rvt_register_device(&dd->verbs_dev.rdi);
+       ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_HFI1);
        if (ret)
                goto err_verbs_txreq;
 
index 6e48b1f507cf3df5198fbfb39089b1abfb82bbce..83e21f696bbc78a8d3b53038924cfd0848103641 100644 (file)
@@ -526,6 +526,7 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
        /* OTHERS */
        ib_dev->get_port_immutable      = hns_roce_port_immutable;
 
+       ib_dev->driver_id = RDMA_DRIVER_HNS;
        ret = ib_register_device(ib_dev, NULL);
        if (ret) {
                dev_err(dev, "ib_register_device failed!\n");
index 60e004d2100e893cea0a6f07a59e997534a4ae5e..40e4f5ab2b46b15abd21081b3bc4f9d2145f4c63 100644 (file)
@@ -2927,6 +2927,7 @@ int i40iw_register_rdma_device(struct i40iw_device *iwdev)
                return -ENOMEM;
        iwibdev = iwdev->iwibdev;
 
+       iwibdev->ibdev.driver_id = RDMA_DRIVER_I40IW;
        ret = ib_register_device(&iwibdev->ibdev, NULL);
        if (ret)
                goto error;
index b9befda1eb273536cc4ee9a35e092ea792ad7e99..d1be3231f4f0b7c5e947ce3d04717d367ea302a2 100644 (file)
@@ -2955,6 +2955,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
        if (mlx4_ib_alloc_diag_counters(ibdev))
                goto err_steer_free_bitmap;
 
+       ibdev->ib_dev.driver_id = RDMA_DRIVER_MLX4;
        if (ib_register_device(&ibdev->ib_dev, NULL))
                goto err_diag_counters;
 
index d06aae9aa600eb0b7959d46bf6ca5eca5a819c80..6b50711df786b30bcad633914ce0292638a9048c 100644 (file)
@@ -4779,6 +4779,7 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
        dev->ib_dev.uverbs_ex_cmd_mask |=
                        (1ull << IB_USER_VERBS_EX_CMD_CREATE_FLOW) |
                        (1ull << IB_USER_VERBS_EX_CMD_DESTROY_FLOW);
+       dev->ib_dev.driver_id = RDMA_DRIVER_MLX5;
 
        err = init_node_data(dev);
        if (err)
index 6fee7795d1c8a8d58157c77099d3d80a96a19e7d..541f237965c750dee9c81616d0213e7e32ad93fa 100644 (file)
@@ -1295,6 +1295,7 @@ int mthca_register_device(struct mthca_dev *dev)
 
        mutex_init(&dev->cap_mask_mutex);
 
+       dev->ib_dev.driver_id = RDMA_DRIVER_MTHCA;
        ret = ib_register_device(&dev->ib_dev, NULL);
        if (ret)
                return ret;
index 162475aeeedd7ffd30ca0478e9bcbe0c16204e54..1040a6e34230d4cf2a4be130e25ef6c808f0c8fd 100644 (file)
@@ -3854,6 +3854,7 @@ int nes_register_ofa_device(struct nes_ib_device *nesibdev)
        struct nes_adapter *nesadapter = nesdev->nesadapter;
        int i, ret;
 
+       nesvnic->nesibdev->ibdev.driver_id = RDMA_DRIVER_NES;
        ret = ib_register_device(&nesvnic->nesibdev->ibdev, NULL);
        if (ret) {
                return ret;
index 42dc0de54cb837a22ddd1d9f4cf58155587a583f..4547aa28d4aeca8f25e89b22168169aecba89af1 100644 (file)
@@ -215,6 +215,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)
                dev->ibdev.destroy_srq = ocrdma_destroy_srq;
                dev->ibdev.post_srq_recv = ocrdma_post_srq_recv;
        }
+       dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA;
        return ib_register_device(&dev->ibdev, NULL);
 }
 
index db4bf97c0e156cdda65f09934bd48f7b0e4a5de4..f865c0991ad92232a0e32ad83bdcfb7ce6b349cc 100644 (file)
@@ -257,6 +257,7 @@ static int qedr_register_device(struct qedr_dev *dev)
        dev->ibdev.get_link_layer = qedr_link_layer;
        dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str;
 
+       dev->ibdev.driver_id = RDMA_DRIVER_QEDR;
        return ib_register_device(&dev->ibdev, NULL);
 }
 
index fabee760407e808fa58f441e9b136526de9c43da..3977abbc83ad608ef4af4c63961cc47d91d583f7 100644 (file)
@@ -1646,7 +1646,7 @@ int qib_register_ib_device(struct qib_devdata *dd)
                              dd->rcd[ctxt]->pkeys);
        }
 
-       ret = rvt_register_device(&dd->verbs_dev.rdi);
+       ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_QIB);
        if (ret)
                goto err_tx;
 
index f45e99a938e099805e4c1fd253506af99020df52..aed1ca390e305925c9c49ee6901fed0de7b6f0c4 100644 (file)
@@ -433,6 +433,7 @@ static void *usnic_ib_device_add(struct pci_dev *dev)
        us_ibdev->ib_dev.get_dev_fw_str     = usnic_get_dev_fw_str;
 
 
+       us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC;
        if (ib_register_device(&us_ibdev->ib_dev, NULL))
                goto err_fwd_dealloc;
 
index d650a9fcde242d8801f59ec675b0129393c34529..4834460e2a0bdb8cbca053e539bd6c2fb6185a42 100644 (file)
@@ -276,6 +276,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
                if (!dev->srq_tbl)
                        goto err_qp_free;
        }
+       dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA;
        spin_lock_init(&dev->srq_tbl_lock);
 
        ret = ib_register_device(&dev->ib_dev, NULL);
index a67b0ddc2230ba8e07732df94262a06bae81240c..434199d0bc96ca149184605be52747aec6518393 100644 (file)
@@ -730,7 +730,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
  *
  * Return: 0 on success otherwise an errno.
  */
-int rvt_register_device(struct rvt_dev_info *rdi)
+int rvt_register_device(struct rvt_dev_info *rdi, u32 driver_id)
 {
        int ret = 0, i;
 
@@ -831,6 +831,7 @@ int rvt_register_device(struct rvt_dev_info *rdi)
        rdi->ibdev.node_type = RDMA_NODE_IB_CA;
        rdi->ibdev.num_comp_vectors = 1;
 
+       rdi->ibdev.driver_id = driver_id;
        /* We are now good to announce we exist */
        ret =  ib_register_device(&rdi->ibdev, rdi->driver_f.port_callback);
        if (ret) {
index ced79e49234b223e5553a51465aaecd466dc50f6..5ef8c3333e43959e9b970500d7a3a0295e2a1fbf 100644 (file)
@@ -1335,6 +1335,7 @@ int rxe_register_device(struct rxe_dev *rxe)
        }
        rxe->tfm = tfm;
 
+       dev->driver_id = RDMA_DRIVER_RXE;
        err = ib_register_device(dev, NULL);
        if (err) {
                pr_warn("%s failed with error %d\n", __func__, err);
index 3cc48f34e3e48e6419032c0faad1ac06a314d63a..2357f2b296107bb9610c403b8f2a0623a5dfe953 100644 (file)
@@ -64,6 +64,7 @@
 #include <linux/cgroup_rdma.h>
 #include <uapi/rdma/ib_user_verbs.h>
 #include <rdma/restrack.h>
+#include <uapi/rdma/rdma_user_ioctl.h>
 
 #define IB_FW_VERSION_NAME_MAX ETHTOOL_FWVERS_LEN
 
@@ -2385,6 +2386,7 @@ struct ib_device {
                                                     int comp_vector);
 
        struct uverbs_root_spec         *specs_root;
+       enum rdma_driver_id             driver_id;
 };
 
 struct ib_client {
index 4118324a0310f98d3a499fe422410cd9f3e07395..3f4c187e435d6f52b7390e813e16e48eb0fccc8b 100644 (file)
@@ -538,7 +538,7 @@ static inline void rvt_mod_retry_timer(struct rvt_qp *qp)
 
 struct rvt_dev_info *rvt_alloc_device(size_t size, int nports);
 void rvt_dealloc_device(struct rvt_dev_info *rdi);
-int rvt_register_device(struct rvt_dev_info *rvd);
+int rvt_register_device(struct rvt_dev_info *rvd, u32 driver_id);
 void rvt_unregister_device(struct rvt_dev_info *rvd);
 int rvt_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
 int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port,
index aa1fffe3620b80f17a7d5a9ce47fced93372cb6b..40063cf970aa61827735abe29753420e472bccfb 100644 (file)
@@ -64,8 +64,30 @@ struct ib_uverbs_ioctl_hdr {
        __u16 object_id;
        __u16 method_id;
        __u16 num_attrs;
-       __aligned_u64 reserved;
+       __aligned_u64 reserved1;
+       __u32 driver_id;
+       __u32 reserved2;
        struct ib_uverbs_attr  attrs[0];
 };
 
+enum rdma_driver_id {
+       RDMA_DRIVER_UNKNOWN,
+       RDMA_DRIVER_MLX5,
+       RDMA_DRIVER_MLX4,
+       RDMA_DRIVER_CXGB3,
+       RDMA_DRIVER_CXGB4,
+       RDMA_DRIVER_MTHCA,
+       RDMA_DRIVER_BNXT_RE,
+       RDMA_DRIVER_OCRDMA,
+       RDMA_DRIVER_NES,
+       RDMA_DRIVER_I40IW,
+       RDMA_DRIVER_VMW_PVRDMA,
+       RDMA_DRIVER_QEDR,
+       RDMA_DRIVER_HNS,
+       RDMA_DRIVER_USNIC,
+       RDMA_DRIVER_RXE,
+       RDMA_DRIVER_HFI1,
+       RDMA_DRIVER_QIB,
+};
+
 #endif