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.
Unified · Split
| @@ -246,6 +246,9 @@ static long ib_uverbs_cmd_verbs(struct ib_device *ib_dev, · 245 unmodified lines | |||
| 246 | size_t ctx_size; | 246 | size_t ctx_size; |
| 247 | uintptr_t data[UVERBS_OPTIMIZE_USING_STACK_SZ / sizeof(uintptr_t)]; | 247 | uintptr_t data[UVERBS_OPTIMIZE_USING_STACK_SZ / sizeof(uintptr_t)]; |
| 248 | 248 | ||
| 249 | if (hdr->driver_id != ib_dev->driver_id) | ||
| 250 | return -EINVAL; | ||
| 251 | |||
| 249 | object_spec = uverbs_get_object(ib_dev, hdr->object_id); | 252 | object_spec = uverbs_get_object(ib_dev, hdr->object_id); |
| 250 | if (!object_spec) | 253 | if (!object_spec) |
| 251 | return -EPROTONOSUPPORT; | 254 | return -EPROTONOSUPPORT; |
| @@ -350,7 +353,7 @@ long ib_uverbs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) · 98 unmodified lines | |||
| 350 | goto out; | 353 | goto out; |
| 351 | } | 354 | } |
| 352 | 355 | ||
| 353 | if (hdr.reserved) { | 356 | if (hdr.reserved1 || hdr.reserved2) { |
| 354 | err = -EPROTONOSUPPORT; | 357 | err = -EPROTONOSUPPORT; |
| 355 | goto out; | 358 | goto out; |
| 356 | } | 359 | } |
| @@ -619,6 +619,7 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev) · 618 unmodified lines | |||
| 619 | ibdev->get_hw_stats = bnxt_re_ib_get_hw_stats; | 619 | ibdev->get_hw_stats = bnxt_re_ib_get_hw_stats; |
| 620 | ibdev->alloc_hw_stats = bnxt_re_ib_alloc_hw_stats; | 620 | ibdev->alloc_hw_stats = bnxt_re_ib_alloc_hw_stats; |
| 621 | 621 | ||
| 622 | ibdev->driver_id = RDMA_DRIVER_BNXT_RE; | ||
| 622 | return ib_register_device(ibdev, NULL); | 623 | return ib_register_device(ibdev, NULL); |
| 623 | } | 624 | } |
| 624 | 625 | ||
| @@ -1439,6 +1439,7 @@ int iwch_register_device(struct iwch_dev *dev) · 1438 unmodified lines | |||
| 1439 | memcpy(dev->ibdev.iwcm->ifname, dev->rdev.t3cdev_p->lldev->name, | 1439 | memcpy(dev->ibdev.iwcm->ifname, dev->rdev.t3cdev_p->lldev->name, |
| 1440 | sizeof(dev->ibdev.iwcm->ifname)); | 1440 | sizeof(dev->ibdev.iwcm->ifname)); |
| 1441 | 1441 | ||
| 1442 | dev->ibdev.driver_id = RDMA_DRIVER_CXGB3; | ||
| 1442 | ret = ib_register_device(&dev->ibdev, NULL); | 1443 | ret = ib_register_device(&dev->ibdev, NULL); |
| 1443 | if (ret) | 1444 | if (ret) |
| 1444 | goto bail1; | 1445 | goto bail1; |
| @@ -629,6 +629,7 @@ void c4iw_register_device(struct work_struct *work) · 628 unmodified lines | |||
| 629 | memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name, | 629 | memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name, |
| 630 | sizeof(dev->ibdev.iwcm->ifname)); | 630 | sizeof(dev->ibdev.iwcm->ifname)); |
| 631 | 631 | ||
| 632 | dev->ibdev.driver_id = RDMA_DRIVER_CXGB4; | ||
| 632 | ret = ib_register_device(&dev->ibdev, NULL); | 633 | ret = ib_register_device(&dev->ibdev, NULL); |
| 633 | if (ret) | 634 | if (ret) |
| 634 | goto err_kfree_iwcm; | 635 | goto err_kfree_iwcm; |
| @@ -1960,7 +1960,7 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd) · 1959 unmodified lines | |||
| 1960 | i, | 1960 | i, |
| 1961 | ppd->pkeys); | 1961 | ppd->pkeys); |
| 1962 | 1962 | ||
| 1963 | ret = rvt_register_device(&dd->verbs_dev.rdi); | 1963 | ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_HFI1); |
| 1964 | if (ret) | 1964 | if (ret) |
| 1965 | goto err_verbs_txreq; | 1965 | goto err_verbs_txreq; |
| 1966 | 1966 | ||
| @@ -526,6 +526,7 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev) · 525 unmodified lines | |||
| 526 | /* OTHERS */ | 526 | /* OTHERS */ |
| 527 | ib_dev->get_port_immutable = hns_roce_port_immutable; | 527 | ib_dev->get_port_immutable = hns_roce_port_immutable; |
| 528 | 528 | ||
| 529 | ib_dev->driver_id = RDMA_DRIVER_HNS; | ||
| 529 | ret = ib_register_device(ib_dev, NULL); | 530 | ret = ib_register_device(ib_dev, NULL); |
| 530 | if (ret) { | 531 | if (ret) { |
| 531 | dev_err(dev, "ib_register_device failed!\n"); | 532 | dev_err(dev, "ib_register_device failed!\n"); |
| @@ -2927,6 +2927,7 @@ int i40iw_register_rdma_device(struct i40iw_device *iwdev) · 2926 unmodified lines | |||
| 2927 | return -ENOMEM; | 2927 | return -ENOMEM; |
| 2928 | iwibdev = iwdev->iwibdev; | 2928 | iwibdev = iwdev->iwibdev; |
| 2929 | 2929 | ||
| 2930 | iwibdev->ibdev.driver_id = RDMA_DRIVER_I40IW; | ||
| 2930 | ret = ib_register_device(&iwibdev->ibdev, NULL); | 2931 | ret = ib_register_device(&iwibdev->ibdev, NULL); |
| 2931 | if (ret) | 2932 | if (ret) |
| 2932 | goto error; | 2933 | goto error; |
| @@ -2955,6 +2955,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) · 2954 unmodified lines | |||
| 2955 | if (mlx4_ib_alloc_diag_counters(ibdev)) | 2955 | if (mlx4_ib_alloc_diag_counters(ibdev)) |
| 2956 | goto err_steer_free_bitmap; | 2956 | goto err_steer_free_bitmap; |
| 2957 | 2957 | ||
| 2958 | ibdev->ib_dev.driver_id = RDMA_DRIVER_MLX4; | ||
| 2958 | if (ib_register_device(&ibdev->ib_dev, NULL)) | 2959 | if (ib_register_device(&ibdev->ib_dev, NULL)) |
| 2959 | goto err_diag_counters; | 2960 | goto err_diag_counters; |
| 2960 | 2961 | ||
| @@ -4779,6 +4779,7 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev) · 4778 unmodified lines | |||
| 4779 | dev->ib_dev.uverbs_ex_cmd_mask |= | 4779 | dev->ib_dev.uverbs_ex_cmd_mask |= |
| 4780 | (1ull << IB_USER_VERBS_EX_CMD_CREATE_FLOW) | | 4780 | (1ull << IB_USER_VERBS_EX_CMD_CREATE_FLOW) | |
| 4781 | (1ull << IB_USER_VERBS_EX_CMD_DESTROY_FLOW); | 4781 | (1ull << IB_USER_VERBS_EX_CMD_DESTROY_FLOW); |
| 4782 | dev->ib_dev.driver_id = RDMA_DRIVER_MLX5; | ||
| 4782 | 4783 | ||
| 4783 | err = init_node_data(dev); | 4784 | err = init_node_data(dev); |
| 4784 | if (err) | 4785 | if (err) |
| @@ -1295,6 +1295,7 @@ int mthca_register_device(struct mthca_dev *dev) · 1294 unmodified lines | |||
| 1295 | 1295 | ||
| 1296 | mutex_init(&dev->cap_mask_mutex); | 1296 | mutex_init(&dev->cap_mask_mutex); |
| 1297 | 1297 | ||
| 1298 | dev->ib_dev.driver_id = RDMA_DRIVER_MTHCA; | ||
| 1298 | ret = ib_register_device(&dev->ib_dev, NULL); | 1299 | ret = ib_register_device(&dev->ib_dev, NULL); |
| 1299 | if (ret) | 1300 | if (ret) |
| 1300 | return ret; | 1301 | return ret; |
| @@ -3854,6 +3854,7 @@ int nes_register_ofa_device(struct nes_ib_device *nesibdev) · 3853 unmodified lines | |||
| 3854 | struct nes_adapter *nesadapter = nesdev->nesadapter; | 3854 | struct nes_adapter *nesadapter = nesdev->nesadapter; |
| 3855 | int i, ret; | 3855 | int i, ret; |
| 3856 | 3856 | ||
| 3857 | nesvnic->nesibdev->ibdev.driver_id = RDMA_DRIVER_NES; | ||
| 3857 | ret = ib_register_device(&nesvnic->nesibdev->ibdev, NULL); | 3858 | ret = ib_register_device(&nesvnic->nesibdev->ibdev, NULL); |
| 3858 | if (ret) { | 3859 | if (ret) { |
| 3859 | return ret; | 3860 | return ret; |
| @@ -215,6 +215,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev) · 214 unmodified lines | |||
| 215 | dev->ibdev.destroy_srq = ocrdma_destroy_srq; | 215 | dev->ibdev.destroy_srq = ocrdma_destroy_srq; |
| 216 | dev->ibdev.post_srq_recv = ocrdma_post_srq_recv; | 216 | dev->ibdev.post_srq_recv = ocrdma_post_srq_recv; |
| 217 | } | 217 | } |
| 218 | dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA; | ||
| 218 | return ib_register_device(&dev->ibdev, NULL); | 219 | return ib_register_device(&dev->ibdev, NULL); |
| 219 | } | 220 | } |
| 220 | 221 | ||
| @@ -257,6 +257,7 @@ static int qedr_register_device(struct qedr_dev *dev) · 256 unmodified lines | |||
| 257 | dev->ibdev.get_link_layer = qedr_link_layer; | 257 | dev->ibdev.get_link_layer = qedr_link_layer; |
| 258 | dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str; | 258 | dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str; |
| 259 | 259 | ||
| 260 | dev->ibdev.driver_id = RDMA_DRIVER_QEDR; | ||
| 260 | return ib_register_device(&dev->ibdev, NULL); | 261 | return ib_register_device(&dev->ibdev, NULL); |
| 261 | } | 262 | } |
| 262 | 263 | ||
| @@ -1646,7 +1646,7 @@ int qib_register_ib_device(struct qib_devdata *dd) · 1645 unmodified lines | |||
| 1646 | dd->rcd[ctxt]->pkeys); | 1646 | dd->rcd[ctxt]->pkeys); |
| 1647 | } | 1647 | } |
| 1648 | 1648 | ||
| 1649 | ret = rvt_register_device(&dd->verbs_dev.rdi); | 1649 | ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_QIB); |
| 1650 | if (ret) | 1650 | if (ret) |
| 1651 | goto err_tx; | 1651 | goto err_tx; |
| 1652 | 1652 | ||
| @@ -433,6 +433,7 @@ static void *usnic_ib_device_add(struct pci_dev *dev) · 432 unmodified lines | |||
| 433 | us_ibdev->ib_dev.get_dev_fw_str = usnic_get_dev_fw_str; | 433 | us_ibdev->ib_dev.get_dev_fw_str = usnic_get_dev_fw_str; |
| 434 | 434 | ||
| 435 | 435 | ||
| 436 | us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC; | ||
| 436 | if (ib_register_device(&us_ibdev->ib_dev, NULL)) | 437 | if (ib_register_device(&us_ibdev->ib_dev, NULL)) |
| 437 | goto err_fwd_dealloc; | 438 | goto err_fwd_dealloc; |
| 438 | 439 | ||
| @@ -276,6 +276,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev) · 275 unmodified lines | |||
| 276 | if (!dev->srq_tbl) | 276 | if (!dev->srq_tbl) |
| 277 | goto err_qp_free; | 277 | goto err_qp_free; |
| 278 | } | 278 | } |
| 279 | dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA; | ||
| 279 | spin_lock_init(&dev->srq_tbl_lock); | 280 | spin_lock_init(&dev->srq_tbl_lock); |
| 280 | 281 | ||
| 281 | ret = ib_register_device(&dev->ib_dev, NULL); | 282 | ret = ib_register_device(&dev->ib_dev, NULL); |
| @@ -730,7 +730,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) · 729 unmodified lines | |||
| 730 | * | 730 | * |
| 731 | * Return: 0 on success otherwise an errno. | 731 | * Return: 0 on success otherwise an errno. |
| 732 | */ | 732 | */ |
| 733 | int rvt_register_device(struct rvt_dev_info *rdi) | 733 | int rvt_register_device(struct rvt_dev_info *rdi, u32 driver_id) |
| 734 | { | 734 | { |
| 735 | int ret = 0, i; | 735 | int ret = 0, i; |
| 736 | 736 | ||
| @@ -831,6 +831,7 @@ int rvt_register_device(struct rvt_dev_info *rdi) · 94 unmodified lines | |||
| 831 | rdi->ibdev.node_type = RDMA_NODE_IB_CA; | 831 | rdi->ibdev.node_type = RDMA_NODE_IB_CA; |
| 832 | rdi->ibdev.num_comp_vectors = 1; | 832 | rdi->ibdev.num_comp_vectors = 1; |
| 833 | 833 | ||
| 834 | rdi->ibdev.driver_id = driver_id; | ||
| 834 | /* We are now good to announce we exist */ | 835 | /* We are now good to announce we exist */ |
| 835 | ret = ib_register_device(&rdi->ibdev, rdi->driver_f.port_callback); | 836 | ret = ib_register_device(&rdi->ibdev, rdi->driver_f.port_callback); |
| 836 | if (ret) { | 837 | if (ret) { |
| @@ -1335,6 +1335,7 @@ int rxe_register_device(struct rxe_dev *rxe) · 1334 unmodified lines | |||
| 1335 | } | 1335 | } |
| 1336 | rxe->tfm = tfm; | 1336 | rxe->tfm = tfm; |
| 1337 | 1337 | ||
| 1338 | dev->driver_id = RDMA_DRIVER_RXE; | ||
| 1338 | err = ib_register_device(dev, NULL); | 1339 | err = ib_register_device(dev, NULL); |
| 1339 | if (err) { | 1340 | if (err) { |
| 1340 | pr_warn("%s failed with error %d\n", __func__, err); | 1341 | pr_warn("%s failed with error %d\n", __func__, err); |
| @@ -64,6 +64,7 @@ · 63 unmodified lines | |||
| 64 | #include <linux/cgroup_rdma.h> | 64 | #include <linux/cgroup_rdma.h> |
| 65 | #include <uapi/rdma/ib_user_verbs.h> | 65 | #include <uapi/rdma/ib_user_verbs.h> |
| 66 | #include <rdma/restrack.h> | 66 | #include <rdma/restrack.h> |
| 67 | #include <uapi/rdma/rdma_user_ioctl.h> | ||
| 67 | 68 | ||
| 68 | #define IB_FW_VERSION_NAME_MAX ETHTOOL_FWVERS_LEN | 69 | #define IB_FW_VERSION_NAME_MAX ETHTOOL_FWVERS_LEN |
| 69 | 70 | ||
| @@ -2385,6 +2386,7 @@ struct ib_device { · 2315 unmodified lines | |||
| 2385 | int comp_vector); | 2386 | int comp_vector); |
| 2386 | 2387 | ||
| 2387 | struct uverbs_root_spec *specs_root; | 2388 | struct uverbs_root_spec *specs_root; |
| 2389 | enum rdma_driver_id driver_id; | ||
| 2388 | }; | 2390 | }; |
| 2389 | 2391 | ||
| 2390 | struct ib_client { | 2392 | struct ib_client { |
| @@ -538,7 +538,7 @@ static inline void rvt_mod_retry_timer(struct rvt_qp *qp) · 537 unmodified lines | |||
| 538 | 538 | ||
| 539 | struct rvt_dev_info *rvt_alloc_device(size_t size, int nports); | 539 | struct rvt_dev_info *rvt_alloc_device(size_t size, int nports); |
| 540 | void rvt_dealloc_device(struct rvt_dev_info *rdi); | 540 | void rvt_dealloc_device(struct rvt_dev_info *rdi); |
| 541 | int rvt_register_device(struct rvt_dev_info *rvd); | 541 | int rvt_register_device(struct rvt_dev_info *rvd, u32 driver_id); |
| 542 | void rvt_unregister_device(struct rvt_dev_info *rvd); | 542 | void rvt_unregister_device(struct rvt_dev_info *rvd); |
| 543 | int rvt_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr); | 543 | int rvt_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr); |
| 544 | int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port, | 544 | int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port, |
| @@ -64,8 +64,30 @@ struct ib_uverbs_ioctl_hdr { · 63 unmodified lines | |||
| 64 | __u16 object_id; | 64 | __u16 object_id; |
| 65 | __u16 method_id; | 65 | __u16 method_id; |
| 66 | __u16 num_attrs; | 66 | __u16 num_attrs; |
| 67 | __aligned_u64 reserved; | 67 | __aligned_u64 reserved1; |
| 68 | __u32 driver_id; | ||
| 69 | __u32 reserved2; | ||
| 68 | struct ib_uverbs_attr attrs[0]; | 70 | struct ib_uverbs_attr attrs[0]; |
| 69 | }; | 71 | }; |
| 70 | 72 | ||
| 73 | enum rdma_driver_id { | ||
| 74 | RDMA_DRIVER_UNKNOWN, | ||
| 75 | RDMA_DRIVER_MLX5, | ||
| 76 | RDMA_DRIVER_MLX4, | ||
| 77 | RDMA_DRIVER_CXGB3, | ||
| 78 | RDMA_DRIVER_CXGB4, | ||
| 79 | RDMA_DRIVER_MTHCA, | ||
| 80 | RDMA_DRIVER_BNXT_RE, | ||
| 81 | RDMA_DRIVER_OCRDMA, | ||
| 82 | RDMA_DRIVER_NES, | ||
| 83 | RDMA_DRIVER_I40IW, | ||
| 84 | RDMA_DRIVER_VMW_PVRDMA, | ||
| 85 | RDMA_DRIVER_QEDR, | ||
| 86 | RDMA_DRIVER_HNS, | ||
| 87 | RDMA_DRIVER_USNIC, | ||
| 88 | RDMA_DRIVER_RXE, | ||
| 89 | RDMA_DRIVER_HFI1, | ||
| 90 | RDMA_DRIVER_QIB, | ||
| 91 | }; | ||
| 92 | |||
| 71 | #endif | 93 | #endif |