Extend mlx5 CQ creation with large UAR page index
Subsystems (14)
cover Extend mlx5 CQ creation with large UAR page index
From: Leon Romanovsky <[email protected]>
Changelog:
v1:
* Fixed compilation errors in first patch
* Changed new attribute name as Jason suggested
v0: https://lore.kernel.org/all/[email protected]/
------------------------------------------------------------------------
Hi,
This series from Akiva extends the mlx5 private field with the UAR page index
which is larger than 16 bits as was before.
As this is first time, we extend ioctl API with private data field after it already has UHW object, we need to change create CQ API signature to support it.
Thanks
Akiva Goldberger (2):
RDMA: Pass entire uverbs attr bundle to create cq function RDMA/mlx5: Send UAR page index as ioctl attribute
drivers/infiniband/core/uverbs_cmd.c | 2 +- drivers/infiniband/core/uverbs_std_types_cq.c | 2 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 3 +- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 +- drivers/infiniband/hw/cxgb4/cq.c | 3 +- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 +- drivers/infiniband/hw/efa/efa.h | 2 +- drivers/infiniband/hw/efa/efa_verbs.c | 3 +- drivers/infiniband/hw/erdma/erdma_verbs.c | 3 +- drivers/infiniband/hw/erdma/erdma_verbs.h | 2 +- drivers/infiniband/hw/hns/hns_roce_cq.c | 3 +- drivers/infiniband/hw/hns/hns_roce_device.h | 2 +- drivers/infiniband/hw/irdma/verbs.c | 5 +-- drivers/infiniband/hw/mana/cq.c | 3 +- drivers/infiniband/hw/mana/mana_ib.h | 2 +- drivers/infiniband/hw/mlx4/cq.c | 3 +- drivers/infiniband/hw/mlx4/mlx4_ib.h | 2 +- drivers/infiniband/hw/mlx5/cq.c | 31 ++++++++++++++++--- drivers/infiniband/hw/mlx5/main.c | 1 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 +- drivers/infiniband/hw/mthca/mthca_provider.c | 3 +- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 3 +- drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 2 +- drivers/infiniband/sw/rdmavt/cq.c | 6 ++-- drivers/infiniband/sw/rdmavt/cq.h | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 3 +- drivers/infiniband/sw/siw/siw_verbs.c | 5 +-- drivers/infiniband/sw/siw/siw_verbs.h | 2 +- include/rdma/ib_verbs.h | 2 +- include/uapi/rdma/ib_user_ioctl_cmds.h | 7 ++--- include/uapi/rdma/mlx5_user_ioctl_cmds.h | 4 +++ 31 files changed, 80 insertions(+), 38 deletions(-)
Signature · 1 line
2.45.2
PATCH 2/2 RDMA/mlx5: Send UAR page index as ioctl attribute
From: Akiva Goldberger <[email protected]>
Add UAR page index as a driver ioctl attribute to increase the number of supported indices, previously limited to 16 bits by mlx5_ib_create_cq struct.
--- drivers/infiniband/hw/mlx5/cq.c | 28 +++++++++++++++++++++--- drivers/infiniband/hw/mlx5/main.c | 1 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 + include/uapi/rdma/mlx5_user_ioctl_cmds.h | 4 ++++ 4 files changed, 31 insertions(+), 3 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +25 -3
@@ -38,6 +38,9 @@#include "srq.h" #include "qp.h" +#define UVERBS_MODULE_NAME mlx5_ib +#include <rdma/uverbs_named_ioctl.h> +static void mlx5_ib_cq_comp (struct mlx5_core_cq *cq,struct mlx5_eqe *eqe) {struct ib_cq *ibcq = &to_mibcq (cq)->ibcq;
@@ -714,7 +717,8 @@ static int mini_cqe_res_format_to_hw(struct mlx5_ib_dev *dev, u8 format)static int create_cq_user (struct mlx5_ib_dev *dev,struct ib_udata *udata,struct mlx5_ib_cq *cq,int entries,u32 **cqb, -int *cqe_size,int *index,int *inlen) +int *cqe_size,int *index,int *inlen, +struct uverbs_attr_bundle *attrs) {struct mlx5_ib_create_cq ucmd = {};unsigned long page_size;
@@ -788,7 +792,11 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata, order_base_2(page_size) - MLX5_ADAPTER_PAGE_SHIFT);MLX5_SET (cqc, cqc, page_offset, page_offset_quantized); -if (ucmd.flags &MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX ) { +if (uverbs_attr_is_valid (attrs,MLX5_IB_ATTR_CREATE_CQ_UAR_INDEX )) { + err =uverbs_copy_from (index, attrs,MLX5_IB_ATTR_CREATE_CQ_UAR_INDEX ); +if (err) + goto err_cqb; + }else if (ucmd.flags &MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX ) { *index = ucmd.uar_page_index; }else if (context->bfregi.lib_uar_dyn) { err = -EINVAL ;
@@ -981,7 +989,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,if (udata) { err =create_cq_user (dev, udata, cq, entries, &cqb, &cqe_size, - &index, &inlen); + &index, &inlen, attrs);if (err)return err; }else {
@@ -1443,3 +1451,17 @@ int mlx5_ib_generate_wc(struct ib_cq *ibcq, struct ib_wc *wc)return 0 ; } + +ADD_UVERBS_ATTRIBUTES_SIMPLE ( + mlx5_ib_cq_create, +UVERBS_OBJECT_CQ , +UVERBS_METHOD_CQ_CREATE , +UVERBS_ATTR_PTR_IN ( +MLX5_IB_ATTR_CREATE_CQ_UAR_INDEX , +UVERBS_ATTR_TYPE (u32), +UA_OPTIONAL )); + +const struct uapi_definition mlx5_ib_create_cq_defs[] = { +UAPI_DEF_CHAIN_OBJ_TREE (UVERBS_OBJECT_CQ , &mlx5_ib_cq_create), + {}, +};
drivers/infiniband/hw/mlx5/main.c +1 -0
@@ -3833,6 +3833,7 @@ static const struct uapi_definition mlx5_ib_defs[] = {UAPI_DEF_CHAIN (mlx5_ib_qos_defs),UAPI_DEF_CHAIN (mlx5_ib_std_types_defs),UAPI_DEF_CHAIN (mlx5_ib_dm_defs), +UAPI_DEF_CHAIN (mlx5_ib_create_cq_defs),UAPI_DEF_CHAIN_OBJ_TREE (UVERBS_OBJECT_DEVICE , &mlx5_ib_query_context), UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_VAR,
drivers/infiniband/hw/mlx5/mlx5_ib.h +1 -0
@@ -1532,6 +1532,7 @@ extern const struct uapi_definition mlx5_ib_devx_defs[];extern const struct uapi_definition mlx5_ib_flow_defs[];extern const struct uapi_definition mlx5_ib_qos_defs[];extern const struct uapi_definition mlx5_ib_std_types_defs[]; +extern const struct uapi_definition mlx5_ib_create_cq_defs[];static inline int is_qp1 (enum ib_qp_type qp_type) {
include/uapi/rdma/mlx5_user_ioctl_cmds.h +4 -0
@@ -270,6 +270,10 @@ enum mlx5_ib_device_query_context_attrs { MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX = (1U << UVERBS_ID_NS_SHIFT), }; +enum mlx5_ib_create_cq_attrs { +MLX5_IB_ATTR_CREATE_CQ_UAR_INDEX =UVERBS_ID_DRIVER_NS_WITH_UHW , +}; +#define MLX5_IB_DW_MATCH_PARAM 0xA0struct mlx5_ib_match_params {
Signature · 1 line
2.45.2
PATCH 1/2 RDMA: Pass entire uverbs attr bundle to create cq function
In reply to Leon RomanovskyFrom: Akiva Goldberger <[email protected]>
Changes the create_cq verb signature by sending the entire uverbs attr bundle as a parameter. This allows drivers to send driver specific attrs through ioctl for the create_cq verb and access them in their driver specific code.
Also adds a new enum value for driver specific ioctl attributes for methods already supporting UHW.
--- drivers/infiniband/core/uverbs_cmd.c | 2 +- drivers/infiniband/core/uverbs_std_types_cq.c | 2 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 3 ++- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 +- drivers/infiniband/hw/cxgb4/cq.c | 3 ++- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 +- drivers/infiniband/hw/efa/efa.h | 2 +- drivers/infiniband/hw/efa/efa_verbs.c | 3 ++- drivers/infiniband/hw/erdma/erdma_verbs.c | 3 ++- drivers/infiniband/hw/erdma/erdma_verbs.h | 2 +- drivers/infiniband/hw/hns/hns_roce_cq.c | 3 ++- drivers/infiniband/hw/hns/hns_roce_device.h | 2 +- drivers/infiniband/hw/irdma/verbs.c | 5 +++-- drivers/infiniband/hw/mana/cq.c | 3 ++- drivers/infiniband/hw/mana/mana_ib.h | 2 +- drivers/infiniband/hw/mlx4/cq.c | 3 ++- drivers/infiniband/hw/mlx4/mlx4_ib.h | 2 +- drivers/infiniband/hw/mlx5/cq.c | 3 ++- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 +- drivers/infiniband/hw/mthca/mthca_provider.c | 3 ++- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 3 ++- drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 2 +- drivers/infiniband/sw/rdmavt/cq.c | 6 ++++-- drivers/infiniband/sw/rdmavt/cq.h | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 3 ++- drivers/infiniband/sw/siw/siw_verbs.c | 5 +++-- drivers/infiniband/sw/siw/siw_verbs.h | 2 +- include/rdma/ib_verbs.h | 2 +- include/uapi/rdma/ib_user_ioctl_cmds.h | 7 +++---- 29 files changed, 49 insertions(+), 35 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +1 -1
@@ -1051,7 +1051,7 @@ static int create_cq(struct uverbs_attr_bundle *attrs,rdma_restrack_new (&cq->res,RDMA_RESTRACK_CQ );rdma_restrack_set_name (&cq->res,NULL ); - ret = ib_dev->ops.create_cq (cq, &attr, &attrs->driver_udata); + ret = ib_dev->ops.create_cq (cq, &attr, attrs);if (ret) goto err_free;rdma_restrack_add (&cq->res);
drivers/infiniband/core/uverbs_std_types_cq.c +1 -1
@@ -128,7 +128,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(rdma_restrack_new (&cq->res,RDMA_RESTRACK_CQ );rdma_restrack_set_name (&cq->res,NULL ); - ret = ib_dev->ops.create_cq (cq, &attr, &attrs->driver_udata); + ret = ib_dev->ops.create_cq (cq, &attr, attrs);if (ret) goto err_free;
drivers/infiniband/hw/bnxt_re/ib_verbs.c +2 -1
@@ -2948,10 +2948,11 @@ int bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) }int bnxt_re_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { struct bnxt_re_cq *cq = container_of(ibcq, struct bnxt_re_cq, ib_cq);struct bnxt_re_dev *rdev =to_bnxt_re_dev (ibcq->device, ibdev); +struct ib_udata *udata = &attrs->driver_udata;struct bnxt_re_ucontext *uctx = rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, ib_uctx);struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
drivers/infiniband/hw/bnxt_re/ib_verbs.h +1 -1
@@ -221,7 +221,7 @@ int bnxt_re_post_send(struct ib_qp *qp, const struct ib_send_wr *send_wr,int bnxt_re_post_recv (struct ib_qp *qp,const struct ib_recv_wr *recv_wr,const struct ib_recv_wr **bad_recv_wr);int bnxt_re_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int bnxt_re_resize_cq (struct ib_cq *ibcq,int cqe,struct ib_udata *udata);int bnxt_re_destroy_cq (struct ib_cq *cq,struct ib_udata *udata);int bnxt_re_poll_cq (struct ib_cq *cq,int num_entries,struct ib_wc *wc);
drivers/infiniband/hw/cxgb4/cq.c +2 -1
@@ -995,8 +995,9 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) }int c4iw_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;int entries = attr->cqe;int vector = attr->comp_vector;
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +1 -1
@@ -978,7 +978,7 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);int c4iw_destroy_cq (struct ib_cq *ib_cq,struct ib_udata *udata);void c4iw_cq_rem_ref (struct c4iw_cq *chp);int c4iw_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int c4iw_arm_cq (struct ib_cq *ibcq,enum ib_cq_notify_flags flags); int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr, enum ib_srq_attr_mask srq_attr_mask,
drivers/infiniband/hw/efa/efa.h +1 -1
@@ -161,7 +161,7 @@ int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr, struct ib_udata *udata);int efa_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);int efa_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);struct ib_mr *efa_reg_mr (struct ib_pd *ibpd,u64 start,u64 length,u64 virt_addr,int access_flags,struct ib_udata *udata);
drivers/infiniband/hw/efa/efa_verbs.c +2 -1
@@ -1084,8 +1084,9 @@ static int cq_mmap_entries_setup(struct efa_dev *dev, struct efa_cq *cq, }int efa_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct efa_ucontext *ucontext =rdma_udata_to_drv_context ( udata, struct efa_ucontext, ibucontext);struct efa_com_create_cq_params params = {};
drivers/infiniband/hw/erdma/erdma_verbs.c +2 -1
@@ -1628,8 +1628,9 @@ static int erdma_init_kernel_cq(struct erdma_cq *cq) }int erdma_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct erdma_cq *cq =to_ecq (ibcq);struct erdma_dev *dev =to_edev (ibcq->device);unsigned int depth = attr->cqe;
drivers/infiniband/hw/erdma/erdma_verbs.h +1 -1
@@ -329,7 +329,7 @@ int erdma_query_device(struct ib_device *dev, struct ib_device_attr *attr,int erdma_get_port_immutable (struct ib_device *dev,u32 port,struct ib_port_immutable *ib_port_immutable);int erdma_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *data); +struct uverbs_attr_bundle *attrs);int erdma_query_port (struct ib_device *dev,u32 port,struct ib_port_attr *attr); int erdma_query_gid(struct ib_device *dev, u32 port, int idx,
drivers/infiniband/hw/hns/hns_roce_cq.c +2 -1
@@ -353,9 +353,10 @@ static int set_cqe_size(struct hns_roce_cq *hr_cq, struct ib_udata *udata, }int hns_roce_create_cq (struct ib_cq *ib_cq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) {struct hns_roce_dev *hr_dev =to_hr_dev (ib_cq->device); +struct ib_udata *udata = &attrs->driver_udata;struct hns_roce_ib_create_cq_resp resp = {};struct hns_roce_cq *hr_cq =to_hr_cq (ib_cq);struct ib_device *ibdev = &hr_dev->ib_dev;
drivers/infiniband/hw/hns/hns_roce_device.h +1 -1
@@ -1267,7 +1267,7 @@ __be32 send_ieth(const struct ib_send_wr *wr);int to_hr_qp_type (int qp_type);int hns_roce_create_cq (struct ib_cq *ib_cq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int hns_roce_destroy_cq (struct ib_cq *ib_cq,struct ib_udata *udata); int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
drivers/infiniband/hw/irdma/verbs.c +3 -2
@@ -2035,14 +2035,15 @@ static inline int cq_validate_flags(u32 flags, u8 hw_rev)* irdma_create_cq - create cq * @ibcq: CQ allocated * @attr: attributes for cq -* @udata: user data +* @attrs: uverbs attribute bundle */ static int irdma_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) {#define IRDMA_CREATE_CQ_MIN_REQ_LEN offsetofend(struct irdma_create_cq_req, user_cq_buf)#define IRDMA_CREATE_CQ_MIN_RESP_LEN offsetofend(struct irdma_create_cq_resp, cq_size) +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;struct irdma_device *iwdev =to_iwdev (ibdev);struct irdma_pci_f *rf = iwdev->rf;
drivers/infiniband/hw/mana/cq.c +2 -1
@@ -6,8 +6,9 @@#include "mana_ib.h" int mana_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata; struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);struct mana_ib_create_cq_resp resp = {};struct mana_ib_ucontext *mana_ucontext;
drivers/infiniband/hw/mana/mana_ib.h +1 -1
@@ -429,7 +429,7 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd, u32 port);int mana_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int mana_ib_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);
drivers/infiniband/hw/mlx4/cq.c +2 -1
@@ -172,8 +172,9 @@ static int mlx4_ib_get_cq_umem(struct mlx4_ib_dev *dev,#define CQ_CREATE_FLAGS_SUPPORTED IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETIONint mlx4_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;int entries = attr->cqe;int vector = attr->comp_vector;
drivers/infiniband/hw/mlx4/mlx4_ib.h +1 -1
@@ -767,7 +767,7 @@ int mlx4_ib_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,int mlx4_ib_modify_cq (struct ib_cq *cq,u16 cq_count,u16 cq_period);int mlx4_ib_resize_cq (struct ib_cq *ibcq,int entries,struct ib_udata *udata);int mlx4_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int mlx4_ib_destroy_cq (struct ib_cq *cq,struct ib_udata *udata);int mlx4_ib_poll_cq (struct ib_cq *ibcq,int num_entries,struct ib_wc *wc);int mlx4_ib_arm_cq (struct ib_cq *cq,enum ib_cq_notify_flags flags);
drivers/infiniband/hw/mlx5/cq.c +2 -1
@@ -942,8 +942,9 @@ static void notify_soft_wc_handler(struct work_struct *work) }int mlx5_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;int entries = attr->cqe;int vector = attr->comp_vector;
drivers/infiniband/hw/mlx5/mlx5_ib.h +1 -1
@@ -1332,7 +1332,7 @@ int mlx5_ib_read_wqe_rq(struct mlx5_ib_qp *qp, int wqe_index, void *buffer,int mlx5_ib_read_wqe_srq (struct mlx5_ib_srq *srq,int wqe_index,void *buffer,size_t buflen,size_t *bc);int mlx5_ib_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int mlx5_ib_destroy_cq (struct ib_cq *cq,struct ib_udata *udata);int mlx5_ib_poll_cq (struct ib_cq *ibcq,int num_entries,struct ib_wc *wc);int mlx5_ib_arm_cq (struct ib_cq *ibcq,enum ib_cq_notify_flags flags);
drivers/infiniband/hw/mthca/mthca_provider.c +2 -1
@@ -574,8 +574,9 @@ static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)static int mthca_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;int entries = attr->cqe;struct mthca_create_cq ucmd;
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +2 -1
@@ -963,8 +963,9 @@ static int ocrdma_copy_cq_uresp(struct ocrdma_dev *dev, struct ocrdma_cq *cq, }int ocrdma_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;int entries = attr->cqe;struct ocrdma_cq *cq =get_ocrdma_cq (ibcq);
drivers/infiniband/hw/ocrdma/ocrdma_verbs.h +1 -1
@@ -70,7 +70,7 @@ int ocrdma_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);int ocrdma_dealloc_pd (struct ib_pd *pd,struct ib_udata *udata);int ocrdma_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int ocrdma_resize_cq (struct ib_cq *,int cqe,struct ib_udata *);int ocrdma_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);
drivers/infiniband/sw/rdmavt/cq.c +4 -2
@@ -5,6 +5,7 @@#include <linux/slab.h> #include <linux/vmalloc.h> +#include <rdma/uverbs_ioctl.h> #include "cq.h" #include "vt.h" #include "trace.h"
@@ -149,15 +150,16 @@ static void send_complete(struct work_struct *work)* rvt_create_cq - create a completion queue * @ibcq: Allocated CQ * @attr: creation attributes -* @udata: user data for libibverbs.so +* @attrs: uverbs bundle * * Called by ib_create_cq() in the generic verbs code. * * Return: 0 on success */ int rvt_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *ibdev = ibcq->device;struct rvt_dev_info *rdi =ib_to_rvt (ibdev);struct rvt_cq *cq =ibcq_to_rvtcq (ibcq);
drivers/infiniband/sw/rdmavt/cq.h +1 -1
@@ -10,7 +10,7 @@#include <rdma/rdmavt_cq.h> int rvt_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int rvt_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);int rvt_req_notify_cq (struct ib_cq *ibcq,enum ib_cq_notify_flags notify_flags);int rvt_resize_cq (struct ib_cq *ibcq,int cqe,struct ib_udata *udata);
drivers/infiniband/sw/rxe/rxe_verbs.c +2 -1
@@ -1053,8 +1053,9 @@ static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,/* cq */ static int rxe_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct ib_device *dev = ibcq->device;struct rxe_dev *rxe =to_rdev (dev);struct rxe_cq *cq =to_rcq (ibcq);
drivers/infiniband/sw/siw/siw_verbs.c +3 -2
@@ -1124,12 +1124,13 @@ int siw_destroy_cq(struct ib_cq *base_cq, struct ib_udata *udata)* * @base_cq: CQ as allocated by RDMA midlayer * @attr: Initial CQ attributes -* @udata: relates to user context +* @attrs: uverbs bundle */ int siw_create_cq (struct ib_cq *base_cq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) { +struct ib_udata *udata = &attrs->driver_udata;struct siw_device *sdev =to_siw_dev (base_cq->device);struct siw_cq *cq =to_siw_cq (base_cq);int rv, size = attr->cqe;
drivers/infiniband/sw/siw/siw_verbs.h +1 -1
@@ -43,7 +43,7 @@ int siw_get_port_immutable(struct ib_device *base_dev, u32 port,int siw_query_device (struct ib_device *base_dev,struct ib_device_attr *attr,struct ib_udata *udata);int siw_create_cq (struct ib_cq *base_cq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int siw_query_port (struct ib_device *base_dev,u32 port,struct ib_port_attr *attr); int siw_query_gid(struct ib_device *base_dev, u32 port, int idx,
include/rdma/ib_verbs.h +1 -1
@@ -2465,7 +2465,7 @@ struct ib_device_ops { int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);int (*destroy_qp)(struct ib_qp *qp,struct ib_udata *udata);int (*create_cq)(struct ib_cq *cq,const struct ib_cq_init_attr *attr, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int (*modify_cq)(struct ib_cq *cq,u16 cq_count,u16 cq_period);int (*destroy_cq)(struct ib_cq *cq,struct ib_udata *udata);int (*resize_cq)(struct ib_cq *cq,int cqe,struct ib_udata *udata);
include/uapi/rdma/ib_user_ioctl_cmds.h +3 -4
@@ -37,9 +37,6 @@#define UVERBS_ID_NS_MASK 0xF000#define UVERBS_ID_NS_SHIFT 12 -#define UVERBS_UDATA_DRIVER_DATA_NS 1 -#define UVERBS_UDATA_DRIVER_DATA_FLAG (1UL << UVERBS_ID_NS_SHIFT) -enum uverbs_default_objects {UVERBS_OBJECT_DEVICE ,/* No instances of DEVICE are allowed */ UVERBS_OBJECT_PD ,
@@ -61,8 +58,10 @@ enum uverbs_default_objects { };enum { -UVERBS_ATTR_UHW_IN =UVERBS_UDATA_DRIVER_DATA_FLAG , +UVERBS_ID_DRIVER_NS =1UL <<UVERBS_ID_NS_SHIFT , +UVERBS_ATTR_UHW_IN =UVERBS_ID_DRIVER_NS ,UVERBS_ATTR_UHW_OUT , +UVERBS_ID_DRIVER_NS_WITH_UHW , };enum uverbs_methods_device {
Signature · 1 line
2.45.2
Jason Gunthorpe
maintainerRe: [PATCH rdma-next v1 1/2] RDMA: Pass entire uverbs attr bundle to create cq function
Quoted 9 lines · Leon Romanovsky
From: Akiva Goldberger <[email protected]>
Changes the
create_cqverb signature by sending the entire uverbs attr bundle as a parameter. This allows drivers to send driver specific attrs through ioctl for thecreate_cqverb and access them in their driver specific code.Also adds a new enum value for driver specific ioctl attributes for methods already supporting UHW.
I was going to pick this up but it doesn't compile:
../drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c:156:15: error: incompatible function pointer types initializing 'int (*)(struct ib_cq *, const struct ib_cq_init_attr *, struct uverbs_attr_bundle *)' with an expression of type 'int (struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *)' [-Wincompatible-function-pointer-types]
156 | .create_cq = pvrdma_create_cq,
| ^~~~~~~~~~~~~~~~
../drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c:814:46: warning: shift count >= width of type [-Wshift-count-overflow]
814 | ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
| ^~~~~~~~~~~~~~~~../include/linux/dma-mapping.h:77:54: note: expanded from macro 'DMA_BIT_MASK'
77 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
| ^ ~~~
1 warning and 1 error generated.
Didn't get all the drivers? Don't have all the drivers turned on in your kconfig?
Jason
Re: [PATCH rdma-next v1 1/2] RDMA: Pass entire uverbs attr bundle to create cq function
Quoted 24 lines · Jason Gunthorpe
Quoted 9 lines · Leon Romanovsky
From: Akiva Goldberger <[email protected]>
Changes the
create_cqverb signature by sending the entire uverbs attr bundle as a parameter. This allows drivers to send driver specific attrs through ioctl for thecreate_cqverb and access them in their driver specific code.Also adds a new enum value for driver specific ioctl attributes for methods already supporting UHW.
I was going to pick this up but it doesn't compile:
../drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c:156:15: error: incompatible function pointer types initializing 'int (*)(structib_cq*, const structib_cq_init_attr*, structuverbs_attr_bundle*)' with an expression of type 'int (structib_cq*, const structib_cq_init_attr*, structib_udata*)' [-Wincompatible-function-pointer-types]
156 | .create_cq =pvrdma_create_cq,| ^~~~~~~~~~~~~~~~
../drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c:814:46: warning: shift count >= width of type [-Wshift-count-overflow]
814 | ret =dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
| ^~~~~~~~~~~~~~~~../include/linux/dma-mapping.h:77:54: note: expanded from macro 'DMA_BIT_MASK'
77 | #defineDMA_BIT_MASK(n)(((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
| ^ ~~~
1 warning and 1 error generated.
Quoted 2 lines
Didn't get all the drivers? Don't have all the drivers turned on in your kconfig?
They are supposed to be, but for some reason my mkt CI didn't catch it, but this patch clearly missing pvrdma.
Thanks
Quoted 2 lines
Jason