RDMA: Check create_flags during create_qp
authorJason Gunthorpe <jgg@nvidia.com>
Sat, 3 Oct 2020 23:20:08 +0000 (20:20 -0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 26 Oct 2020 22:27:59 +0000 (19:27 -0300)
Each driver should check that the QP attrs create_flags is supported.
Unfortuantely when create_flags was added to the QP attrs the drivers were
not updated. uverbs_ex_cmd_mask was used to block it - even though kernel
drivers use these flags too.

Check that flags is zero in all drivers that don't use it, remove
IB_USER_VERBS_EX_CMD_CREATE_QP from uverbs_ex_cmd_mask. Fix the error code
to be EOPNOTSUPP.

Link: https://lore.kernel.org/r/8-v1-caa70ba3d1ab+1436e-ucmd_mask_jgg@nvidia.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
17 files changed:
drivers/infiniband/core/device.c
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/cxgb4/qp.c
drivers/infiniband/hw/hns/hns_roce_qp.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
drivers/infiniband/sw/rdmavt/qp.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/sw/siw/siw_verbs.c

index 64129646f6a667b11f9f9049b9bd852da20e7ec0..e5f5d656951df1aea419c099902d6a2afa7ab7c8 100644 (file)
@@ -634,6 +634,7 @@ struct ib_device *_ib_alloc_device(size_t size)
        device->uverbs_ex_cmd_mask =
                BIT_ULL(IB_USER_VERBS_EX_CMD_CREATE_CQ) |
                BIT_ULL(IB_USER_VERBS_EX_CMD_CREATE_FLOW) |
+               BIT_ULL(IB_USER_VERBS_EX_CMD_CREATE_QP) |
                BIT_ULL(IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL) |
                BIT_ULL(IB_USER_VERBS_EX_CMD_CREATE_WQ) |
                BIT_ULL(IB_USER_VERBS_EX_CMD_DESTROY_FLOW) |
index edc47093c63bbdd149f6baf614b669ef4945b006..25a6c8fff91fe63da569979b59d2ede1b72c75be 100644 (file)
@@ -1271,10 +1271,12 @@ static int bnxt_re_init_qp_attr(struct bnxt_re_qp *qp, struct bnxt_re_pd *pd,
        }
        qplqp->mtu = ib_mtu_enum_to_int(iboe_get_mtu(rdev->netdev->mtu));
        qplqp->dpi = &rdev->dpi_privileged; /* Doorbell page */
-       if (init_attr->create_flags)
+       if (init_attr->create_flags) {
                ibdev_dbg(&rdev->ibdev,
                          "QP create flags 0x%x not supported",
                          init_attr->create_flags);
+               return -EOPNOTSUPP;
+       }
 
        /* Setup CQs */
        if (init_attr->send_cq) {
index 79e69d449b074809a12c8d906eac859f42c80b36..a7401398cb344a0dc128d50787697ecf3b941f55 100644 (file)
@@ -2126,7 +2126,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
 
        pr_debug("ib_pd %p\n", pd);
 
-       if (attrs->qp_type != IB_QPT_RC)
+       if (attrs->qp_type != IB_QPT_RC || attrs->create_flags)
                return ERR_PTR(-EOPNOTSUPP);
 
        php = to_c4iw_pd(pd);
index 6c081dd985fc94c8f2974a8ad5c7d370b67e1f28..04a70681bea1bd9fe41a94f4b2ad5e36327b9df2 100644 (file)
@@ -869,17 +869,6 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                if (ret)
                        ibdev_err(ibdev, "Failed to set user SQ size\n");
        } else {
-               if (init_attr->create_flags &
-                   IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) {
-                       ibdev_err(ibdev, "Failed to check multicast loopback\n");
-                       return -EINVAL;
-               }
-
-               if (init_attr->create_flags & IB_QP_CREATE_IPOIB_UD_LSO) {
-                       ibdev_err(ibdev, "Failed to check ipoib ud lso\n");
-                       return -EINVAL;
-               }
-
                ret = set_kernel_sq_size(hr_dev, &init_attr->cap, hr_qp);
                if (ret)
                        ibdev_err(ibdev, "Failed to set kernel SQ size\n");
@@ -906,6 +895,9 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
        hr_qp->state = IB_QPS_RESET;
        hr_qp->flush_flag = 0;
 
+       if (init_attr->create_flags)
+               return -EOPNOTSUPP;
+
        ret = set_qp_param(hr_dev, hr_qp, init_attr, udata, &ucmd);
        if (ret) {
                ibdev_err(ibdev, "Failed to set QP param\n");
index f3eb60ba078db9bc05c9733320e77ba2d041481b..db81f39f89b856ae73550fe19d44901f40a6cd06 100644 (file)
@@ -556,7 +556,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd,
                return ERR_PTR(-ENODEV);
 
        if (init_attr->create_flags)
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(-EOPNOTSUPP);
        if (init_attr->cap.max_inline_data > I40IW_MAX_INLINE_DATA_SIZE)
                init_attr->cap.max_inline_data = I40IW_MAX_INLINE_DATA_SIZE;
 
index c2c66b958b836a9ab316e70db8169e47732428d8..84d8fcbb85ef85438f73e695c8002335346cefa5 100644 (file)
@@ -2658,8 +2658,6 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
        ibdev->ib_dev.dev.parent        = &dev->persist->pdev->dev;
 
        ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_ops);
-       ibdev->ib_dev.uverbs_ex_cmd_mask |=
-               (1ull << IB_USER_VERBS_EX_CMD_CREATE_QP);
 
        if ((dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS) &&
            ((mlx4_ib_port_link_layer(&ibdev->ib_dev, 1) ==
index 8834629615bc6d546b7a22c45afd07c7b7946d8e..47b9ed5599b3967695f43013f6e2807f9736c9d0 100644 (file)
@@ -1493,7 +1493,7 @@ static int _mlx4_ib_create_qp(struct ib_pd *pd, struct mlx4_ib_qp *qp,
                                        MLX4_IB_SRIOV_SQP |
                                        MLX4_IB_QP_NETIF |
                                        MLX4_IB_QP_CREATE_ROCE_V2_GSI))
-               return -EINVAL;
+               return -EOPNOTSUPP;
 
        if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) {
                if (init_attr->qp_type != IB_QPT_UD)
index 261cc669aaf1fbf89b4ae5479efcc42ac5ea6c56..daa1de6497e76f151663ab6f3057b6165d2177f0 100644 (file)
@@ -4142,8 +4142,6 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
        dev->ib_dev.uverbs_cmd_mask |=
                (1ull << IB_USER_VERBS_CMD_CREATE_AH)           |
                (1ull << IB_USER_VERBS_CMD_DESTROY_AH);
-       dev->ib_dev.uverbs_ex_cmd_mask |=
-               (1ull << IB_USER_VERBS_EX_CMD_CREATE_QP);
 
        if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads) &&
            IS_ENABLED(CONFIG_MLX5_CORE_IPOIB))
index 19361132336cb91ce71c2d1bda9da6a1eab3e583..251421dd6f1d5ec1c6f72003aeb99e15a73d5c86 100644 (file)
@@ -2712,11 +2712,12 @@ static int process_create_flags(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
        process_create_flag(dev, &create_flags, MLX5_IB_QP_CREATE_SQPN_QP1,
                            true, qp);
 
-       if (create_flags)
+       if (create_flags) {
                mlx5_ib_dbg(dev, "Create QP has unsupported flags 0x%X\n",
                            create_flags);
-
-       return (create_flags) ? -EINVAL : 0;
+               return -EOPNOTSUPP;
+       }
+       return 0;
 }
 
 static int process_udata_size(struct mlx5_ib_dev *dev,
index e37c965bb030b609b07313ead067e0eee7a5d389..5172253bcfa05fc01f2a04320b3e0673b124e8c1 100644 (file)
@@ -470,7 +470,7 @@ static struct ib_qp *mthca_create_qp(struct ib_pd *pd,
        int err;
 
        if (init_attr->create_flags)
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(-EOPNOTSUPP);
 
        switch (init_attr->qp_type) {
        case IB_QPT_RC:
index 29ec0a808a19d8da89c3eb3ef9aae8a01f27e916..bc98bd950d99fadb0a24e2b9979be7fa1369b77e 100644 (file)
@@ -1299,6 +1299,9 @@ struct ib_qp *ocrdma_create_qp(struct ib_pd *ibpd,
        struct ocrdma_create_qp_ureq ureq;
        u16 dpp_credit_lmt, dpp_offset;
 
+       if (attrs->create_flags)
+               return ERR_PTR(-EOPNOTSUPP);
+
        status = ocrdma_check_qp_params(ibpd, dev, attrs, udata);
        if (status)
                goto gen_err;
index 80373170ce51f55505f0565e58bbce0aa2c6f975..2e85bb5104cb68650896905d9d9ad5c06cd4a719 100644 (file)
@@ -2239,6 +2239,9 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
        struct ib_qp *ibqp;
        int rc = 0;
 
+       if (attrs->create_flags)
+               return ERR_PTR(-EOPNOTSUPP);
+
        if (attrs->qp_type == IB_QPT_XRC_TGT) {
                xrcd = get_qedr_xrcd(attrs->xrcd);
                dev = get_qedr_dev(xrcd->ibxrcd.device);
index d6708d1db73af29f200ad8eed20b200c42e9d0b7..38a37770c01627cd3baaf9e9a270a491b2a5655e 100644 (file)
@@ -474,7 +474,7 @@ struct ib_qp *usnic_ib_create_qp(struct ib_pd *pd,
        us_ibdev = to_usdev(pd->device);
 
        if (init_attr->create_flags)
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(-EOPNOTSUPP);
 
        err = ib_copy_from_udata(&cmd, udata, sizeof(cmd));
        if (err) {
index 9fdec5b9553c4ef4651d39857c62ec275987f02e..1d3bdd7bb51d96086d4a599602bd7a35ae64b70a 100644 (file)
@@ -209,7 +209,7 @@ struct ib_qp *pvrdma_create_qp(struct ib_pd *pd,
                dev_warn(&dev->pdev->dev,
                         "invalid create queuepair flags %#x\n",
                         init_attr->create_flags);
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(-EOPNOTSUPP);
        }
 
        if (init_attr->qp_type != IB_QPT_RC &&
index 7b93e7bb0072a2a0b2b81438dba2c54cdc0733f5..e9db6bf106186fdfa3ca1d8d6ce869a827b1c6c9 100644 (file)
@@ -1083,10 +1083,11 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
        if (!rdi)
                return ERR_PTR(-EINVAL);
 
+       if (init_attr->create_flags & ~IB_QP_CREATE_NETDEV_USE)
+               return ERR_PTR(-EOPNOTSUPP);
+
        if (init_attr->cap.max_send_sge > rdi->dparms.props.max_send_sge ||
-           init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr ||
-           (init_attr->create_flags &&
-            init_attr->create_flags != IB_QP_CREATE_NETDEV_USE))
+           init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr)
                return ERR_PTR(-EINVAL);
 
        /* Check receive queue parameters if no SRQ is specified. */
index 7d32cb246d9ed21711a0ea92d0597c0c7c691532..21d2ab3956a4a949d824cdaaba5aeb40aa0cc776 100644 (file)
@@ -395,6 +395,9 @@ static struct ib_qp *rxe_create_qp(struct ib_pd *ibpd,
                uresp = udata->outbuf;
        }
 
+       if (init->create_flags)
+               return ERR_PTR(-EOPNOTSUPP);
+
        err = rxe_qp_chk_init(rxe, init);
        if (err)
                goto err1;
index bcea5c5ace2b6bb418e8fbac64abafd0e6bdea62..68fd053fc7748af11a00dfb8754477d9fd48e646 100644 (file)
@@ -307,6 +307,9 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd,
 
        siw_dbg(base_dev, "create new QP\n");
 
+       if (attrs->create_flags)
+               return ERR_PTR(-EOPNOTSUPP);
+
        if (atomic_inc_return(&sdev->num_qp) > SIW_MAX_QP) {
                siw_dbg(base_dev, "too many QP's\n");
                rv = -ENOMEM;