History

IB/mlx5: Handle type IB_QPT_DRIVER when creating a QP

The QP type IB_QPT_DRIVER doesn't describe the transport or the service that the QP provides but those are known only to the hardware driver. The actual type of the QP is stored in the hardware driver context (i.e. mlx5_qp) under the field qp_sub_type. Take the real QP type and any extra data that is required to create the QP from the driver channel and modify the QP initial attributes before continuing with create_qp(). Downstream patches from this series will add support for both DCI and DCT driver QPs.

Moni Shoua committed 8 years ago

Commit b4aaa1f1 parent 8011c1e3 files · +118 −2Browse files

Unified · Split

3 files
  1. drivers/infiniband/hw/mlx5/mlx5_ib.h +10 −0
  2. drivers/infiniband/hw/mlx5/qp.c +102 −1
  3. include/uapi/rdma/mlx5-abi.h +6 −1
drivers/infiniband/hw/mlx5/mlx5_ib.h+10−0
@@ -206,6 +206,8 @@ struct mlx5_ib_flow_db { · 205 unmodified lines
206206 * creates the actual hardware QP.
207207 */
208208 #define MLX5_IB_QPT_HW_GSI IB_QPT_RESERVED2
209+#define MLX5_IB_QPT_DCI IB_QPT_RESERVED3
210+#define MLX5_IB_QPT_DCT IB_QPT_RESERVED4
209211 #define MLX5_IB_WR_UMR IB_WR_RESERVED1
210212
211213 #define MLX5_IB_UMR_OCTOWORD 16
@@ -366,12 +368,18 @@ struct mlx5_bf { · 154 unmodified lines
366368 struct mlx5_sq_bfreg *bfreg;
367369 };
368370
371+struct mlx5_ib_dct {
372+ struct mlx5_core_dct mdct;
373+ u32 *in;
374+};
375+
369376 struct mlx5_ib_qp {
370377 struct ib_qp ibqp;
371378 union {
372379 struct mlx5_ib_qp_trans trans_qp;
373380 struct mlx5_ib_raw_packet_qp raw_packet_qp;
374381 struct mlx5_ib_rss_qp rss_qp;
382+ struct mlx5_ib_dct dct;
375383 };
376384 struct mlx5_buf buf;
377385
@@ -410,6 +418,8 @@ struct mlx5_ib_qp { · 32 unmodified lines
410418 u32 rate_limit;
411419 u32 underlay_qpn;
412420 bool tunnel_offload_en;
421+ /* storage for qp sub type when core qp type is IB_QPT_DRIVER */
422+ enum ib_qp_type qp_sub_type;
413423 };
414424
415425 struct mlx5_ib_cq_buf {
drivers/infiniband/hw/mlx5/qp.c+102−1
@@ -2115,20 +2115,108 @@ static const char *ib_qp_type_str(enum ib_qp_type type) · 2114 unmodified lines
21152115 return "IB_QPT_RAW_PACKET";
21162116 case MLX5_IB_QPT_REG_UMR:
21172117 return "MLX5_IB_QPT_REG_UMR";
2118+ case IB_QPT_DRIVER:
2119+ return "IB_QPT_DRIVER";
21182120 case IB_QPT_MAX:
21192121 default:
21202122 return "Invalid QP type";
21212123 }
21222124 }
21232125
2126+static struct ib_qp *mlx5_ib_create_dct(struct ib_pd *pd,
2127+ struct ib_qp_init_attr *attr,
2128+ struct mlx5_ib_create_qp *ucmd)
2129+{
2130+ struct mlx5_ib_dev *dev;
2131+ struct mlx5_ib_qp *qp;
2132+ int err = 0;
2133+ u32 uidx = MLX5_IB_DEFAULT_UIDX;
2134+ void *dctc;
2135+
2136+ if (!attr->srq || !attr->recv_cq)
2137+ return ERR_PTR(-EINVAL);
2138+
2139+ dev = to_mdev(pd->device);
2140+
2141+ err = get_qp_user_index(to_mucontext(pd->uobject->context),
2142+ ucmd, sizeof(*ucmd), &uidx);
2143+ if (err)
2144+ return ERR_PTR(err);
2145+
2146+ qp = kzalloc(sizeof(*qp), GFP_KERNEL);
2147+ if (!qp)
2148+ return ERR_PTR(-ENOMEM);
2149+
2150+ qp->dct.in = kzalloc(MLX5_ST_SZ_BYTES(create_dct_in), GFP_KERNEL);
2151+ if (!qp->dct.in) {
2152+ err = -ENOMEM;
2153+ goto err_free;
2154+ }
2155+
2156+ dctc = MLX5_ADDR_OF(create_dct_in, qp->dct.in, dct_context_entry);
2157+ qp->driver_qp_type = MLX5_IB_QPT_DCT;
2158+ MLX5_SET(dctc, dctc, pd, to_mpd(pd)->pdn);
2159+ MLX5_SET(dctc, dctc, srqn_xrqn, to_msrq(attr->srq)->msrq.srqn);
2160+ MLX5_SET(dctc, dctc, cqn, to_mcq(attr->recv_cq)->mcq.cqn);
2161+ MLX5_SET64(dctc, dctc, dc_access_key, ucmd->access_key);
2162+ MLX5_SET(dctc, dctc, user_index, uidx);
2163+
2164+ qp->state = IB_QPS_RESET;
2165+
2166+ return &qp->ibqp;
2167+err_free:
2168+ kfree(qp);
2169+ return ERR_PTR(err);
2170+}
2171+
2172+static int set_mlx_qp_type(struct mlx5_ib_dev *dev,
2173+ struct ib_qp_init_attr *init_attr,
2174+ struct mlx5_ib_create_qp *ucmd,
2175+ struct ib_udata *udata)
2176+{
2177+ enum { MLX_QP_FLAGS = MLX5_QP_FLAG_TYPE_DCT | MLX5_QP_FLAG_TYPE_DCI };
2178+ int err;
2179+
2180+ if (!udata)
2181+ return -EINVAL;
2182+
2183+ if (udata->inlen < sizeof(*ucmd)) {
2184+ mlx5_ib_dbg(dev, "create_qp user command is smaller than expected\n");
2185+ return -EINVAL;
2186+ }
2187+ err = ib_copy_from_udata(ucmd, udata, sizeof(*ucmd));
2188+ if (err)
2189+ return err;
2190+
2191+ if ((ucmd->flags & MLX_QP_FLAGS) == MLX5_QP_FLAG_TYPE_DCI) {
2192+ init_attr->qp_type = MLX5_IB_QPT_DCI;
2193+ } else {
2194+ if ((ucmd->flags & MLX_QP_FLAGS) == MLX5_QP_FLAG_TYPE_DCT) {
2195+ init_attr->qp_type = MLX5_IB_QPT_DCT;
2196+ } else {
2197+ mlx5_ib_dbg(dev, "Invalid QP flags\n");
2198+ return -EINVAL;
2199+ }
2200+ }
2201+
2202+ if (!MLX5_CAP_GEN(dev->mdev, dct)) {
2203+ mlx5_ib_dbg(dev, "DC transport is not supported\n");
2204+ return -EOPNOTSUPP;
2205+ }
2206+
2207+ return 0;
2208+}
2209+
21242210 struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
2125− struct ib_qp_init_attr *init_attr,
2211+ struct ib_qp_init_attr *verbs_init_attr,
21262212 struct ib_udata *udata)
21272213 {
21282214 struct mlx5_ib_dev *dev;
21292215 struct mlx5_ib_qp *qp;
21302216 u16 xrcdn = 0;
21312217 int err;
2218+ struct ib_qp_init_attr mlx_init_attr;
2219+ struct ib_qp_init_attr *init_attr = verbs_init_attr;
21322220
21332221 if (pd) {
21342222 dev = to_mdev(pd->device);
@@ -2153,6 +2241,16 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, · 18 unmodified lines
21532241 dev = to_mdev(to_mxrcd(init_attr->xrcd)->ibxrcd.device);
21542242 }
21552243
2244+ if (init_attr->qp_type == IB_QPT_DRIVER) {
2245+ struct mlx5_ib_create_qp ucmd;
2246+
2247+ init_attr = &mlx_init_attr;
2248+ memcpy(init_attr, verbs_init_attr, sizeof(*verbs_init_attr));
2249+ err = set_mlx_qp_type(dev, init_attr, &ucmd, udata);
2250+ if (err)
2251+ return ERR_PTR(err);
2252+ }
2253+
21562254 switch (init_attr->qp_type) {
21572255 case IB_QPT_XRC_TGT:
21582256 case IB_QPT_XRC_INI:
@@ -2214,6 +2312,9 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, · 55 unmodified lines
22142312 return ERR_PTR(-EINVAL);
22152313 }
22162314
2315+ if (verbs_init_attr->qp_type == IB_QPT_DRIVER)
2316+ qp->qp_sub_type = init_attr->qp_type;
2317+
22172318 return &qp->ibqp;
22182319 }
22192320
include/uapi/rdma/mlx5-abi.h+6−1
@@ -42,6 +42,8 @@ enum { · 41 unmodified lines
4242 MLX5_QP_FLAG_SCATTER_CQE = 1 << 1,
4343 MLX5_QP_FLAG_TUNNEL_OFFLOADS = 1 << 2,
4444 MLX5_QP_FLAG_BFREG_INDEX = 1 << 3,
45+ MLX5_QP_FLAG_TYPE_DCT = 1 << 4,
46+ MLX5_QP_FLAG_TYPE_DCI = 1 << 5,
4547 };
4648
4749 enum {
@@ -284,7 +286,10 @@ struct mlx5_ib_create_qp { · 236 unmodified lines
284286 __u32 flags;
285287 __u32 uidx;
286288 __u32 bfreg_index;
287− __u64 sq_buf_addr;
289+ union {
290+ __u64 sq_buf_addr;
291+ __u64 access_key;
292+ };
288293 };
289294
290295 /* RX Hash function flags */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t