|
@@ -264,6 +264,97 @@ static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static void devx_set_umem_valid(const void *in)
|
|
|
+{
|
|
|
+ u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
|
|
|
+
|
|
|
+ switch (opcode) {
|
|
|
+ case MLX5_CMD_OP_CREATE_MKEY:
|
|
|
+ MLX5_SET(create_mkey_in, in, mkey_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ case MLX5_CMD_OP_CREATE_CQ:
|
|
|
+ {
|
|
|
+ void *cqc;
|
|
|
+
|
|
|
+ MLX5_SET(create_cq_in, in, cq_umem_valid, 1);
|
|
|
+ cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
|
|
|
+ MLX5_SET(cqc, cqc, dbr_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case MLX5_CMD_OP_CREATE_QP:
|
|
|
+ {
|
|
|
+ void *qpc;
|
|
|
+
|
|
|
+ qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
|
|
|
+ MLX5_SET(qpc, qpc, dbr_umem_valid, 1);
|
|
|
+ MLX5_SET(create_qp_in, in, wq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_CREATE_RQ:
|
|
|
+ {
|
|
|
+ void *rqc, *wq;
|
|
|
+
|
|
|
+ rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);
|
|
|
+ wq = MLX5_ADDR_OF(rqc, rqc, wq);
|
|
|
+ MLX5_SET(wq, wq, dbr_umem_valid, 1);
|
|
|
+ MLX5_SET(wq, wq, wq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_CREATE_SQ:
|
|
|
+ {
|
|
|
+ void *sqc, *wq;
|
|
|
+
|
|
|
+ sqc = MLX5_ADDR_OF(create_sq_in, in, ctx);
|
|
|
+ wq = MLX5_ADDR_OF(sqc, sqc, wq);
|
|
|
+ MLX5_SET(wq, wq, dbr_umem_valid, 1);
|
|
|
+ MLX5_SET(wq, wq, wq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_MODIFY_CQ:
|
|
|
+ MLX5_SET(modify_cq_in, in, cq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_CREATE_RMP:
|
|
|
+ {
|
|
|
+ void *rmpc, *wq;
|
|
|
+
|
|
|
+ rmpc = MLX5_ADDR_OF(create_rmp_in, in, ctx);
|
|
|
+ wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
|
|
|
+ MLX5_SET(wq, wq, dbr_umem_valid, 1);
|
|
|
+ MLX5_SET(wq, wq, wq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_CREATE_XRQ:
|
|
|
+ {
|
|
|
+ void *xrqc, *wq;
|
|
|
+
|
|
|
+ xrqc = MLX5_ADDR_OF(create_xrq_in, in, xrq_context);
|
|
|
+ wq = MLX5_ADDR_OF(xrqc, xrqc, wq);
|
|
|
+ MLX5_SET(wq, wq, dbr_umem_valid, 1);
|
|
|
+ MLX5_SET(wq, wq, wq_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case MLX5_CMD_OP_CREATE_XRC_SRQ:
|
|
|
+ {
|
|
|
+ void *xrc_srqc;
|
|
|
+
|
|
|
+ MLX5_SET(create_xrc_srq_in, in, xrc_srq_umem_valid, 1);
|
|
|
+ xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, in,
|
|
|
+ xrc_srq_context_entry);
|
|
|
+ MLX5_SET(xrc_srqc, xrc_srqc, dbr_umem_valid, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ default:
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static bool devx_is_obj_create_cmd(const void *in)
|
|
|
{
|
|
|
u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
|
|
@@ -741,6 +832,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
|
|
|
return -ENOMEM;
|
|
|
|
|
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
|
|
+ devx_set_umem_valid(cmd_in);
|
|
|
+
|
|
|
err = mlx5_cmd_exec(dev->mdev, cmd_in,
|
|
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
|
|
|
cmd_out, cmd_out_len);
|
|
@@ -790,6 +883,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
|
|
|
return PTR_ERR(cmd_out);
|
|
|
|
|
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
|
|
+ devx_set_umem_valid(cmd_in);
|
|
|
+
|
|
|
err = mlx5_cmd_exec(obj->mdev, cmd_in,
|
|
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
|
|
|
cmd_out, cmd_out_len);
|