Enable asynchronous event FD per object
Subsystems (2)
cover Enable asynchronous event FD per object
From: Leon Romanovsky <[email protected]>
Changelog:
v1: Forgot to add patch "IB/uverbs: Move QP, SRQ, WQ type and flags to UAPI"
v0: https://lore.kernel.org/lkml/[email protected]
-------------------------------------------------------------------------------
From Yishai:
This series enables applicable events objects (i.e. QP, SRQ, CQ, WQ) to be created with their own asynchronous event FD.
Before this series any affiliated event on an object was reported on the first asynchronous event FD that was created on the context without the ability to create and use a dedicated FD for it.
With this series we enable granularity and control for the usage per object, according to the application's usage.
For example, a secondary process that uses the same command FD as of the master one, can create its own objects with its dedicated event FD to be able to get the events for them once occurred, this couldn't be done before this series.
To achieve the above, any 'create' method for the applicable objects was extended to get from rdma-core its optional event FD, if wasn't supplied, the default one from the context will be used.
As we prefer to not extend the 'write' mode KABIs anymore and fully move to the 'ioct' mode, as part of this extension QP, SRQ and WQ create/destroy commands were introduced over 'ioctl', the CQ KABI was extended over its existing 'ioctl' create command.
As part of moving to 'ioctl' for the above objects the frame work was improved to abort a fully created uobject upon some later error, some flows were consolidated with the 'write' mode and few bugs were found and fixed.
Yishai
Jason Gunthorpe (2):
RDMA/core: Allow the ioctl layer to abort a fully created uobject RDMA/core: Consolidate ib_create_srq flows
Yishai Hadas (8):
IB/uverbs: Refactor related objects to use their own asynchronous
event FD
IB/uverbs: Extend CQ to get its own asynchronous event FD IB/uverbs: Cleanup wq/srq context usage from uverbs layer IB/uverbs: Move QP, SRQ, WQ type and flags to UAPI IB/uverbs: Introduce create/destroy SRQ commands over ioctl IB/uverbs: Fix create WQ to use the given user handle IB/uverbs: Introduce create/destroy WQ commands over ioctl IB/uverbs: Introduce create/destroy QP commands over ioctl
drivers/infiniband/core/Makefile | 5 +- drivers/infiniband/core/rdma_core.c | 28 +- drivers/infiniband/core/rdma_core.h | 7 +- drivers/infiniband/core/uverbs.h | 21 +- drivers/infiniband/core/uverbs_cmd.c | 73 ++-- drivers/infiniband/core/uverbs_ioctl.c | 22 +- drivers/infiniband/core/uverbs_main.c | 16 +- drivers/infiniband/core/uverbs_std_types.c | 95 ----- drivers/infiniband/core/uverbs_std_types_cq.c | 17 +- drivers/infiniband/core/uverbs_std_types_mr.c | 12 +- drivers/infiniband/core/uverbs_std_types_qp.c | 401 ++++++++++++++++++ .../infiniband/core/uverbs_std_types_srq.c | 233 ++++++++++ drivers/infiniband/core/uverbs_std_types_wq.c | 194 +++++++++ drivers/infiniband/core/uverbs_uapi.c | 3 + drivers/infiniband/core/verbs.c | 29 +- drivers/infiniband/hw/mlx5/devx.c | 10 +- drivers/infiniband/hw/mlx5/main.c | 24 +- drivers/infiniband/hw/mlx5/qos.c | 13 +- include/rdma/ib_verbs.h | 75 ++-- include/rdma/uverbs_ioctl.h | 3 + include/rdma/uverbs_std_types.h | 2 +- include/rdma/uverbs_types.h | 3 +- include/uapi/rdma/ib_user_ioctl_cmds.h | 81 ++++ include/uapi/rdma/ib_user_ioctl_verbs.h | 43 ++ 24 files changed, 1163 insertions(+), 247 deletions(-) create mode 100644 drivers/infiniband/core/uverbs_std_types_qp.c create mode 100644 drivers/infiniband/core/uverbs_std_types_srq.c create mode 100644 drivers/infiniband/core/uverbs_std_types_wq.c
--
2.26.2
PATCH 1/10 RDMA/core: Allow the ioctl layer to abort a fully created uobject
From: Jason Gunthorpe <[email protected]>
While creating a uobject every create reaches a point where the uobject is fully initialized. For ioctls that go on to copy_to_user this means they need to open code the destruction of a fully created uobject - ie the RDMA_REMOVE_DESTROY sort of flow.
Open coding this creates bugs, eg the CQ does not properly flush the events list when it does its error unwind.
Provide a uverbs_finalize_uobj_create() function which indicates that the uobject is fully initialized and that abort should call to to destroy_hw to destroy the uobj->object and related.
Methods can call this function if they go on to have error cases after setting uobj->object. Once done those error cases can simply do return, without an error unwind.
--- drivers/infiniband/core/rdma_core.c | 28 +++++++++++++++---- drivers/infiniband/core/rdma_core.h | 4 +-- drivers/infiniband/core/uverbs_cmd.c | 2 +- drivers/infiniband/core/uverbs_ioctl.c | 22 +++++++++++++-- drivers/infiniband/core/uverbs_std_types_cq.c | 8 ++---- drivers/infiniband/core/uverbs_std_types_mr.c | 12 ++------ drivers/infiniband/hw/mlx5/devx.c | 10 +++---- drivers/infiniband/hw/mlx5/main.c | 24 ++++------------ drivers/infiniband/hw/mlx5/qos.c | 13 ++++----- include/rdma/ib_verbs.h | 5 ++++ include/rdma/uverbs_ioctl.h | 3 ++ include/rdma/uverbs_std_types.h | 2 +- include/rdma/uverbs_types.h | 3 +- 13 files changed, 76 insertions(+), 60 deletions(-)
drivers/infiniband/core/rdma_core.c +22 -6
@@ -130,6 +130,17 @@ static int uverbs_destroy_uobject(struct ib_uobject *uobj,lockdep_assert_held (&ufile->hw_destroy_rwsem);assert_uverbs_usecnt (uobj,UVERBS_LOOKUP_WRITE ); +if (reason ==RDMA_REMOVE_ABORT_HWOBJ ) { + reason =RDMA_REMOVE_ABORT ; + ret = uobj->uapi_object->type_class->destroy_hw (uobj, reason, + attrs); +/* +* Drivers are not permitted to ignore RDMA_REMOVE_ABORT, see +* ib_is_destroy_retryable, cleanup_retryable == false here. +*/ +WARN_ON (ret); + } +if (reason ==RDMA_REMOVE_ABORT ) {WARN_ON (!list_empty (&uobj->list));WARN_ON (!uobj->context);
@@ -647,11 +658,15 @@ void rdma_alloc_commit_uobject(struct ib_uobject *uobj,* object and anything else connected to uobj before calling this. */ void rdma_alloc_abort_uobject (struct ib_uobject *uobj, -struct uverbs_attr_bundle *attrs) +struct uverbs_attr_bundle *attrs, +bool hw_obj_valid) {struct ib_uverbs_file *ufile = uobj->ufile; -uverbs_destroy_uobject (uobj,RDMA_REMOVE_ABORT , attrs); +uverbs_destroy_uobject (uobj, + hw_obj_valid ?RDMA_REMOVE_ABORT_HWOBJ : +RDMA_REMOVE_ABORT , + attrs);/* Matches the down_read in rdma_alloc_begin_uobject */ up_read (&ufile->hw_destroy_rwsem);
@@ -766,7 +781,8 @@ int uverbs_uobject_fd_release(struct inode *inode, struct file *filp)* method from being invoked. Meaning we can always get the * write lock here, or we have a kernel bug. */ -WARN_ON (uverbs_try_lock_object (uobj,UVERBS_LOOKUP_WRITE )); +WARN_ON (uverbs_try_lock_object (uobj, +UVERBS_LOOKUP_WRITE ));uverbs_destroy_uobject (uobj,RDMA_REMOVE_CLOSE , &attrs);up_read (&ufile->hw_destroy_rwsem); }
@@ -921,8 +937,8 @@ uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access, }void uverbs_finalize_object (struct ib_uobject *uobj, -enum uverbs_obj_access access,bool commit, -struct uverbs_attr_bundle *attrs) +enum uverbs_obj_access access,bool hw_obj_valid, +bool commit,struct uverbs_attr_bundle *attrs) {/* * refcounts should be handled at the object level and not at the
@@ -945,7 +961,7 @@ void uverbs_finalize_object(struct ib_uobject *uobj,if (commit)rdma_alloc_commit_uobject (uobj, attrs);else -rdma_alloc_abort_uobject (uobj, attrs); +rdma_alloc_abort_uobject (uobj, attrs, hw_obj_valid);break ;default :WARN_ON (true);
drivers/infiniband/core/rdma_core.h +2 -2
@@ -64,8 +64,8 @@ uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access, s64 id, struct uverbs_attr_bundle *attrs);void uverbs_finalize_object (struct ib_uobject *uobj, -enum uverbs_obj_access access,bool commit, -struct uverbs_attr_bundle *attrs); +enum uverbs_obj_access access,bool hw_obj_valid, +bool commit,struct uverbs_attr_bundle *attrs);int uverbs_output_written (const struct uverbs_attr_bundle *bundle,size_t idx);
drivers/infiniband/core/uverbs_cmd.c +1 -1
@@ -311,7 +311,7 @@ static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)return 0 ; err_uobj: -rdma_alloc_abort_uobject (uobj, attrs); +rdma_alloc_abort_uobject (uobj, attrs, false); err_ucontext:kfree (attrs->context); attrs->context =NULL ;
drivers/infiniband/core/uverbs_ioctl.c +20 -2
@@ -58,6 +58,7 @@ struct bundle_priv {DECLARE_BITMAP (uobj_finalize,UVERBS_API_ATTR_BKEY_LEN );DECLARE_BITMAP (spec_finalize,UVERBS_API_ATTR_BKEY_LEN ); +DECLARE_BITMAP (uobj_hw_obj_valid,UVERBS_API_ATTR_BKEY_LEN );/* * Must be last. bundle ends in a flex array which overlaps
@@ -230,7 +231,8 @@ static void uverbs_free_idrs_array(const struct uverbs_api_attr *attr_uapi,for (i =0 ; i != attr->len; i++)uverbs_finalize_object (attr->uobjects[i], - spec->u2.objs_arr.access, commit, attrs); + spec->u2.objs_arr.access, false, commit, + attrs); } static int uverbs_process_attr(struct bundle_priv *pbundle,
@@ -502,7 +504,9 @@ static void bundle_destroy(struct bundle_priv *pbundle, bool commit)uverbs_finalize_object ( attr->obj_attr.uobject, - attr->obj_attr.attr_elm->spec.u.obj.access, commit, + attr->obj_attr.attr_elm->spec.u.obj.access, +test_bit (i, pbundle->uobj_hw_obj_valid), + commit, &pbundle->bundle); }
@@ -590,6 +594,8 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile, sizeof(pbundle->bundle.attr_present));memset (pbundle->uobj_finalize,0 ,sizeof (pbundle->uobj_finalize));memset (pbundle->spec_finalize,0 ,sizeof (pbundle->spec_finalize)); +memset (pbundle->uobj_hw_obj_valid,0 , +sizeof (pbundle->uobj_hw_obj_valid)); ret =ib_uverbs_run_method (pbundle, hdr->num_attrs);bundle_destroy (pbundle, ret ==0 );
@@ -784,3 +790,15 @@ int uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle, }return uverbs_copy_to (bundle, idx, from, size); } + +/* Once called an abort will call through to the type's destroy_hw() */ +void uverbs_finalize_uobj_create (const struct uverbs_attr_bundle *bundle, +u16 idx) +{ +struct bundle_priv *pbundle = + container_of(bundle, struct bundle_priv, bundle); + +__set_bit (uapi_bkey_attr (uapi_key_attr (idx)), + pbundle->uobj_hw_obj_valid); +} +EXPORT_SYMBOL (uverbs_finalize_uobj_create);
drivers/infiniband/core/uverbs_std_types_cq.c +2 -6
@@ -125,6 +125,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( ret = ib_dev->ops.create_cq (cq, &attr, &attrs->driver_udata);if (ret) goto err_free; +uverbs_finalize_uobj_create (attrs,UVERBS_ATTR_CREATE_CQ_HANDLE ); obj->uevent.uobject.object = cq; obj->uevent.uobject.user_handle = user_handle;
@@ -132,13 +133,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( ret =uverbs_copy_to (attrs,UVERBS_ATTR_CREATE_CQ_RESP_CQE , &cq->cqe,sizeof (cq->cqe)); -if (ret) - goto err_cq; +return ret; -return 0 ; -err_cq: -ib_destroy_cq_user (cq,uverbs_get_cleared_udata (attrs)); - cq =NULL ; err_free:kfree (cq); err_event_file:
drivers/infiniband/core/uverbs_std_types_mr.c +3 -9
@@ -136,21 +136,15 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)( uobj->object = mr; +uverbs_finalize_uobj_create (attrs,UVERBS_ATTR_REG_DM_MR_HANDLE ); + ret =uverbs_copy_to (attrs,UVERBS_ATTR_REG_DM_MR_RESP_LKEY , &mr->lkey,sizeof (mr->lkey));if (ret) - goto err_dereg; +return ret; ret =uverbs_copy_to (attrs,UVERBS_ATTR_REG_DM_MR_RESP_RKEY , &mr->rkey,sizeof (mr->rkey)); -if (ret) - goto err_dereg; - -return 0 ; - -err_dereg: -ib_dereg_mr_user (mr,uverbs_get_cleared_udata (attrs)); -return ret; }
drivers/infiniband/hw/mlx5/devx.c +4 -6
@@ -2217,14 +2217,12 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)( obj->mdev = dev->mdev; uobj->object = obj;devx_obj_build_destroy_cmd (cmd.in, cmd.out, obj->dinbox, &obj->dinlen, &obj_id); - err =uverbs_copy_to (attrs,MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID , &obj_id,sizeof (obj_id)); -if (err) - goto err_umem_destroy; +uverbs_finalize_uobj_create (attrs,MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE ); -return 0 ; + err =uverbs_copy_to (attrs,MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID , &obj_id, +sizeof (obj_id)); +return err; -err_umem_destroy: -mlx5_cmd_exec (obj->mdev, obj->dinbox, obj->dinlen, cmd.out,sizeof (cmd.out)); err_umem_release:ib_umem_release (obj->umem); err_obj_free:
drivers/infiniband/hw/mlx5/main.c +6 -18
@@ -6193,26 +6193,20 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_VAR_OBJ_ALLOC)( mmap_offset =mlx5_entry_to_mmap_offset (entry); length = entry->rdma_entry.npages *PAGE_SIZE ; uobj->object = entry; +uverbs_finalize_uobj_create (attrs,MLX5_IB_ATTR_VAR_OBJ_ALLOC_HANDLE ); err =uverbs_copy_to (attrs,MLX5_IB_ATTR_VAR_OBJ_ALLOC_MMAP_OFFSET , &mmap_offset,sizeof (mmap_offset));if (err) - goto err; +return err; err =uverbs_copy_to (attrs,MLX5_IB_ATTR_VAR_OBJ_ALLOC_PAGE_ID , &entry->page_idx,sizeof (entry->page_idx));if (err) - goto err; +return err; err =uverbs_copy_to (attrs,MLX5_IB_ATTR_VAR_OBJ_ALLOC_MMAP_LENGTH , &length,sizeof (length)); -if (err) - goto err; - -return 0 ; - -err: -rdma_user_mmap_entry_remove (&entry->rdma_entry);return err; }
@@ -6326,26 +6320,20 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_UAR_OBJ_ALLOC)( mmap_offset =mlx5_entry_to_mmap_offset (entry); length = entry->rdma_entry.npages *PAGE_SIZE ; uobj->object = entry; +uverbs_finalize_uobj_create (attrs,MLX5_IB_ATTR_UAR_OBJ_ALLOC_HANDLE ); err =uverbs_copy_to (attrs,MLX5_IB_ATTR_UAR_OBJ_ALLOC_MMAP_OFFSET , &mmap_offset,sizeof (mmap_offset));if (err) - goto err; +return err; err =uverbs_copy_to (attrs,MLX5_IB_ATTR_UAR_OBJ_ALLOC_PAGE_ID , &entry->page_idx,sizeof (entry->page_idx));if (err) - goto err; +return err; err =uverbs_copy_to (attrs,MLX5_IB_ATTR_UAR_OBJ_ALLOC_MMAP_LENGTH , &length,sizeof (length)); -if (err) - goto err; - -return 0 ; - -err: -rdma_user_mmap_entry_remove (&entry->rdma_entry);return err; }
drivers/infiniband/hw/mlx5/qos.c +5 -8
@@ -69,17 +69,14 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_PP_OBJ_ALLOC)(if (err) goto err; - err =uverbs_copy_to (attrs,MLX5_IB_ATTR_PP_OBJ_ALLOC_INDEX , - &pp_entry->index,sizeof (pp_entry->index)); -if (err) - goto clean; - pp_entry->mdev = dev->mdev; uobj->object = pp_entry; -return 0 ; +uverbs_finalize_uobj_create (attrs,MLX5_IB_ATTR_PP_OBJ_ALLOC_HANDLE ); + + err =uverbs_copy_to (attrs,MLX5_IB_ATTR_PP_OBJ_ALLOC_INDEX , + &pp_entry->index,sizeof (pp_entry->index)); +return err; -clean: -mlx5_rl_remove_rate_raw (dev->mdev, pp_entry->index); err:kfree (pp_entry);return err;
include/rdma/ib_verbs.h +5 -0
@@ -1463,6 +1463,11 @@ enum rdma_remove_reason {RDMA_REMOVE_DRIVER_REMOVE ,/* uobj is being cleaned-up before being committed */ RDMA_REMOVE_ABORT , +/* +* uobj has been fully created, with the uobj->object set, but is being +* cleaned up before being comitted +*/ + RDMA_REMOVE_ABORT_HWOBJ, }; struct ib_rdmacg_object {
include/rdma/uverbs_ioctl.h +3 -0
@@ -737,6 +737,9 @@ uverbs_attr_get_len(const struct uverbs_attr_bundle *attrs_bundle, u16 idx)return attr->ptr_attr.len; } +void uverbs_finalize_uobj_create (const struct uverbs_attr_bundle *attrs_bundle, +u16 idx); +/* * uverbs_attr_ptr_get_array_size() - Get array size pointer by a ptr * attribute.
include/rdma/uverbs_std_types.h +1 -1
@@ -107,7 +107,7 @@ static inline void uobj_put_write(struct ib_uobject *uobj)static inline void uobj_alloc_abort (struct ib_uobject *uobj,struct uverbs_attr_bundle *attrs) { -rdma_alloc_abort_uobject (uobj, attrs); +rdma_alloc_abort_uobject (uobj, attrs, false); } static inline struct ib_uobject *
include/rdma/uverbs_types.h +2 -1
@@ -139,7 +139,8 @@ void rdma_lookup_put_uobject(struct ib_uobject *uobj,struct ib_uobject *rdma_alloc_begin_uobject (const struct uverbs_api_object *obj,struct uverbs_attr_bundle *attrs);void rdma_alloc_abort_uobject (struct ib_uobject *uobj, -struct uverbs_attr_bundle *attrs); +struct uverbs_attr_bundle *attrs, +bool hw_obj_valid);void rdma_alloc_commit_uobject (struct ib_uobject *uobj,struct uverbs_attr_bundle *attrs);
Signature · 1 line
2.26.2
PATCH 2/10 IB/uverbs: Refactor related objects to use their own asynchronous event FD
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Refactor related objects to use their own asynchronous event FD. The ufile event FD will be the default in case an object won't have its own event FD.
--- drivers/infiniband/core/uverbs.h | 3 ++- drivers/infiniband/core/uverbs_cmd.c | 24 ++++++++++++++++++- drivers/infiniband/core/uverbs_main.c | 16 ++++++------- drivers/infiniband/core/uverbs_std_types_cq.c | 6 +++++ 4 files changed, 39 insertions(+), 10 deletions(-)
drivers/infiniband/core/uverbs.h +2 -1
@@ -142,7 +142,7 @@ struct ib_uverbs_file {* ucontext_lock held */ struct ib_ucontext *ucontext; -struct ib_uverbs_async_event_file *async_file; +struct ib_uverbs_async_event_file *default_async_file;struct list_head list;/*
@@ -180,6 +180,7 @@ struct ib_uverbs_mcast_entry {struct ib_uevent_object {struct ib_uobject uobject; +struct ib_uverbs_async_event_file *event_file;/* List member for ib_uverbs_async_event_file list */ struct list_head event_list;u32 events_reported;
drivers/infiniband/core/uverbs_cmd.c +23 -1
@@ -1051,6 +1051,10 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs, goto err_free; obj->uevent.uobject.object = cq; + obj->uevent.event_file = attrs->ufile->default_async_file; +if (obj->uevent.event_file) +uverbs_uobject_get (&obj->uevent.event_file->uobj); +memset (&resp,0 ,sizeof resp); resp.base.cq_handle = obj->uevent.uobject.id; resp.base.cqe = cq->cqe;
@@ -1067,6 +1071,8 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs,return obj; err_cb: +if (obj->uevent.event_file) +uverbs_uobject_put (&obj->uevent.event_file->uobj);ib_destroy_cq_user (cq,uverbs_get_cleared_udata (attrs)); cq =NULL ; err_free:
@@ -1460,6 +1466,9 @@ static int create_qp(struct uverbs_attr_bundle *attrs, } obj->uevent.uobject.object = qp; + obj->uevent.event_file = attrs->ufile->default_async_file; +if (obj->uevent.event_file) +uverbs_uobject_get (&obj->uevent.event_file->uobj);memset (&resp,0 ,sizeof resp); resp.base.qpn = qp->qp_num;
@@ -1473,7 +1482,7 @@ static int create_qp(struct uverbs_attr_bundle *attrs, ret =uverbs_response (attrs, &resp,sizeof (resp));if (ret) - goto err_cb; + goto err_uevent;if (xrcd) { obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object,
@@ -1498,6 +1507,9 @@ static int create_qp(struct uverbs_attr_bundle *attrs,rdma_alloc_commit_uobject (&obj->uevent.uobject, attrs);return 0 ; +err_uevent: +if (obj->uevent.event_file) +uverbs_uobject_put (&obj->uevent.event_file->uobj); err_cb:ib_destroy_qp_user (qp,uverbs_get_cleared_udata (attrs));
@@ -2978,6 +2990,9 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)atomic_inc (&cq->usecnt); wq->uobject = obj; obj->uevent.uobject.object = wq; + obj->uevent.event_file = attrs->ufile->default_async_file; +if (obj->uevent.event_file) +uverbs_uobject_get (&obj->uevent.event_file->uobj);memset (&resp,0 ,sizeof (resp)); resp.wq_handle = obj->uevent.uobject.id;
@@ -2996,6 +3011,8 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)return 0 ; err_copy: +if (obj->uevent.event_file) +uverbs_uobject_put (&obj->uevent.event_file->uobj);ib_destroy_wq (wq,uverbs_get_cleared_udata (attrs)); err_put_cq: rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
@@ -3481,6 +3498,9 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, obj->uevent.uobject.object = srq; obj->uevent.uobject.user_handle = cmd->user_handle; + obj->uevent.event_file = attrs->ufile->default_async_file; +if (obj->uevent.event_file) +uverbs_uobject_get (&obj->uevent.event_file->uobj);memset (&resp,0 ,sizeof resp); resp.srq_handle = obj->uevent.uobject.id;
@@ -3505,6 +3525,8 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,return 0 ; err_copy: +if (obj->uevent.event_file) +uverbs_uobject_put (&obj->uevent.event_file->uobj);ib_destroy_srq_user (srq,uverbs_get_cleared_udata (attrs));/* It was released in ib_destroy_srq_user */ srq =NULL ;
drivers/infiniband/core/uverbs_main.c +8 -8
@@ -146,8 +146,7 @@ void ib_uverbs_release_ucq(struct ib_uverbs_completion_event_file *ev_file,void ib_uverbs_release_uevent (struct ib_uevent_object *uobj) { -struct ib_uverbs_async_event_file *async_file = -READ_ONCE (uobj->uobject.ufile->async_file); +struct ib_uverbs_async_event_file *async_file = uobj->event_file;struct ib_uverbs_event *evt, *tmp;if (!async_file)
@@ -159,6 +158,7 @@ void ib_uverbs_release_uevent(struct ib_uevent_object *uobj)kfree (evt); }spin_unlock_irq (&async_file->ev_queue.lock); +uverbs_uobject_put (&async_file->uobj); } void ib_uverbs_detach_umcast(struct ib_qp *qp,
@@ -197,8 +197,8 @@ void ib_uverbs_release_file(struct kref *ref)if (atomic_dec_and_test (&file->device->refcount))ib_uverbs_comp_dev (file->device); -if (file->async_file) -uverbs_uobject_put (&file->async_file->uobj); +if (file->default_async_file) +uverbs_uobject_put (&file->default_async_file->uobj);put_device (&file->device->dev);if (file->disassociate_page)
@@ -428,7 +428,7 @@ ib_uverbs_async_handler(struct ib_uverbs_async_event_file *async_file,static void uverbs_uobj_event (struct ib_uevent_object *eobj,struct ib_event *event) { -ib_uverbs_async_handler (READ_ONCE (eobj->uobject.ufile->async_file), +ib_uverbs_async_handler (eobj->event_file, eobj->uobject.user_handle, event->event, &eobj->event_list, &eobj->events_reported); }
@@ -485,10 +485,10 @@ void ib_uverbs_init_async_event_file(/* The first async_event_file becomes the default one for the file. */ mutex_lock (&uverbs_file->ucontext_lock); -if (!uverbs_file->async_file) { +if (!uverbs_file->default_async_file) {/* Pairs with the put in ib_uverbs_release_file */ uverbs_uobject_get (&async_file->uobj); -smp_store_release (&uverbs_file->async_file, async_file); +smp_store_release (&uverbs_file->default_async_file, async_file); }mutex_unlock (&uverbs_file->ucontext_lock);
@@ -1188,7 +1188,7 @@ static void ib_uverbs_free_hw_resources(struct ib_uverbs_device *uverbs_dev,*/ mutex_unlock (&uverbs_dev->lists_mutex); -ib_uverbs_async_handler (READ_ONCE (file->async_file),0 , +ib_uverbs_async_handler (READ_ONCE (file->default_async_file),0 ,IB_EVENT_DEVICE_FATAL ,NULL ,NULL );uverbs_destroy_ufile_hw (file,RDMA_REMOVE_DRIVER_REMOVE );
drivers/infiniband/core/uverbs_std_types_cq.c +6 -0
@@ -100,6 +100,10 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(uverbs_uobject_get (ev_file_uobj); } + obj->uevent.event_file = attrs->ufile->default_async_file; +if (obj->uevent.event_file) +uverbs_uobject_get (&obj->uevent.event_file->uobj); +if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) { ret = -EINVAL ; goto err_event_file;
@@ -138,6 +142,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( err_free:kfree (cq); err_event_file: +if (obj->uevent.event_file) +uverbs_uobject_put (&obj->uevent.event_file->uobj);if (ev_file)uverbs_uobject_put (ev_file_uobj);return ret;
Signature · 1 line
2.26.2
Re: [PATCH rdma-next v1 02/10] IB/uverbs: Refactor related objects to use their own asynchronous event FD
drivers/infiniband/core/uverbs_cmd.c static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs, · line 1054
Quoted 8 lines · Leon Romanovsky
drivers/infiniband/core/uverbs_cmd.c +2
-0+++ b/drivers/infiniband/core/uverbs_cmd.c@@ -1051,6 +1051,10 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs, goto err_free; obj->uevent.uobject.object = cq; + obj->uevent.event_file = attrs->ufile->default_async_file;
default_async_file always has to be read with READ_ONCE since there is no locking.
This repeating pattern should probably be in ia helper function like was introduced in patch 3 for the ioctl side.
Jason
PATCH 3/10 IB/uverbs: Extend CQ to get its own asynchronous event FD
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Extend CQ to get its own asynchronous event FD.
The event FD is an optional attribute, in case wasn't given the ufile event FD will be used.
--- drivers/infiniband/core/uverbs.h | 18 ++++++++++++++++++ drivers/infiniband/core/uverbs_std_types_cq.c | 9 ++++++--- include/uapi/rdma/ib_user_ioctl_cmds.h | 1 + 3 files changed, 25 insertions(+), 3 deletions(-)
drivers/infiniband/core/uverbs.h +18 -0
@@ -293,6 +293,24 @@ static inline u32 make_port_cap_flags(const struct ib_port_attr *attr)return res; } +static inline struct ib_uverbs_async_event_file * +ib_uverbs_get_async_event (struct uverbs_attr_bundle *attrs, +u16 id) +{ +struct ib_uobject *async_ev_file_uobj; +struct ib_uverbs_async_event_file *async_ev_file; + + async_ev_file_uobj =uverbs_attr_get_uobject (attrs, id); +if (IS_ERR (async_ev_file_uobj)) + async_ev_file = attrs->ufile->default_async_file; +else + async_ev_file =container_of (async_ev_file_uobj, + struct ib_uverbs_async_event_file, + uobj); +if (async_ev_file) +uverbs_uobject_get (&async_ev_file->uobj); +return async_ev_file; +} void copy_port_attr_to_resp(struct ib_port_attr *attr, struct ib_uverbs_query_port_resp *resp,
drivers/infiniband/core/uverbs_std_types_cq.c +6 -3
@@ -100,9 +100,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(uverbs_uobject_get (ev_file_uobj); } - obj->uevent.event_file = attrs->ufile->default_async_file; -if (obj->uevent.event_file) -uverbs_uobject_get (&obj->uevent.event_file->uobj); + obj->uevent.event_file =ib_uverbs_get_async_event ( + attrs,UVERBS_ATTR_CREATE_CQ_EVENT_FD );if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) { ret = -EINVAL ;
@@ -173,6 +172,10 @@ DECLARE_UVERBS_NAMED_METHOD(UVERBS_ATTR_PTR_OUT (UVERBS_ATTR_CREATE_CQ_RESP_CQE ,UVERBS_ATTR_TYPE (u32),UA_MANDATORY ), +UVERBS_ATTR_FD (UVERBS_ATTR_CREATE_CQ_EVENT_FD , +UVERBS_OBJECT_ASYNC_EVENT , +UVERBS_ACCESS_READ , +UA_OPTIONAL ), UVERBS_ATTR_UHW()); static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(
include/uapi/rdma/ib_user_ioctl_cmds.h +1 -0
@@ -95,6 +95,7 @@ enum uverbs_attrs_create_cq_cmd_attr_ids {UVERBS_ATTR_CREATE_CQ_COMP_VECTOR ,UVERBS_ATTR_CREATE_CQ_FLAGS ,UVERBS_ATTR_CREATE_CQ_RESP_CQE , + UVERBS_ATTR_CREATE_CQ_EVENT_FD, }; enum uverbs_attrs_destroy_cq_cmd_attr_ids {
Signature · 1 line
2.26.2
Re: [PATCH rdma-next v1 03/10] IB/uverbs: Extend CQ to get its own asynchronous event FD
Quoted 20 lines · Leon Romanovsky
From: Yishai Hadas <[email protected]>
Extend CQ to get its own asynchronous event FD.
The event FD is an optional attribute, in case wasn't given the ufile event FD will be used.Signed-off-by Yishai Hadas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>drivers/infiniband/core/uverbs.h | 18 ++++++++++++++++++ drivers/infiniband/core/uverbs_std_types_cq.c | 9 ++++++--- include/uapi/rdma/ib_user_ioctl_cmds.h | 1 + 3 files changed, 25 insertions(+), 3 deletions(-)drivers/infiniband/core/uverbs.h +1
-0+++ b/drivers/infiniband/core/uverbs.h@@ -293,6 +293,24 @@ static inline u32 make_port_cap_flags(const struct ib_port_attr *attr)return res; }
drivers/infiniband/core/uverbs.h static inline u32 make_port_cap_flags(const struct ib_port_attr *attr) · line 305
Quoted 10 lines
drivers/infiniband/core/uverbs.h +10
-0+static inline struct ib_uverbs_async_event_file * +ib_uverbs_get_async_event (struct uverbs_attr_bundle *attrs, +u16 id) +{ +struct ib_uobject *async_ev_file_uobj; +struct ib_uverbs_async_event_file *async_ev_file; + + async_ev_file_uobj =uverbs_attr_get_uobject (attrs, id); +if (IS_ERR (async_ev_file_uobj)) + async_ev_file = attrs->ufile->default_async_file;
READ_ONCE here too
Jason
PATCH 4/10 IB/uverbs: Cleanup wq/srq context usage from uverbs layer
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Both wq_context and srq_context are some leftover from the past in uverbs layer, they are not really in use, drop them.
--- drivers/infiniband/core/uverbs_cmd.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +0 -4
@@ -2966,7 +2966,6 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) wq_init_attr.cq = cq; wq_init_attr.max_sge = cmd.max_sge; wq_init_attr.max_wr = cmd.max_wr; - wq_init_attr.wq_context = attrs->ufile; wq_init_attr.wq_type = cmd.wq_type; wq_init_attr.event_handler = ib_uverbs_wq_event_handler; wq_init_attr.create_flags = cmd.create_flags;
@@ -2984,7 +2983,6 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) wq->cq = cq; wq->pd = pd; wq->device = pd->device; - wq->wq_context = wq_init_attr.wq_context;atomic_set (&wq->usecnt,0 );atomic_inc (&pd->usecnt);atomic_inc (&cq->usecnt);
@@ -3458,7 +3456,6 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, } attr.event_handler = ib_uverbs_srq_event_handler; - attr.srq_context = attrs->ufile; attr.srq_type = cmd->srq_type; attr.attr.max_wr = cmd->max_wr; attr.attr.max_sge = cmd->max_sge;
@@ -3477,7 +3474,6 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, srq->srq_type = cmd->srq_type; srq->uobject = obj; srq->event_handler = attr.event_handler; - srq->srq_context = attr.srq_context; ret = pd->device->ops.create_srq (srq, &attr, udata);if (ret)
Signature · 1 line
2.26.2
PATCH 5/10 RDMA/core: Consolidate ib_create_srq flows
In reply to Leon RomanovskyFrom: Jason Gunthorpe <[email protected]>
The uverbs layer largely duplicate the code in ib_create_srq(), with the slight difference that it passes in a udata. Move all the code together into ib_create_srq_user() and provide an inline for kernel users, similar to other create calls.
--- drivers/infiniband/core/uverbs_cmd.c | 40 +++++----------------------- drivers/infiniband/core/verbs.c | 29 +++++++++++++++----- include/rdma/ib_verbs.h | 27 +++++++++---------- 3 files changed, 40 insertions(+), 56 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +6 -34
@@ -3462,38 +3462,15 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, attr.attr.srq_limit = cmd->srq_limit;INIT_LIST_HEAD (&obj->uevent.event_list); + obj->uevent.uobject.user_handle = cmd->user_handle; - srq =rdma_zalloc_drv_obj (ib_dev, ib_srq); -if (!srq) { - ret = -ENOMEM ; - goto err_put; - } - - srq->device = pd->device; - srq->pd = pd; - srq->srq_type = cmd->srq_type; - srq->uobject = obj; - srq->event_handler = attr.event_handler; - - ret = pd->device->ops.create_srq (srq, &attr, udata); -if (ret) - goto err_free; - -if (ib_srq_has_cq (cmd->srq_type)) { - srq->ext.cq = attr.ext.cq; -atomic_inc (&attr.ext.cq->usecnt); - } - -if (cmd->srq_type ==IB_SRQT_XRC ) { - srq->ext.xrc.xrcd = attr.ext.xrc.xrcd; -atomic_inc (&attr.ext.xrc.xrcd->usecnt); + srq =ib_create_srq_user (pd, &attr, obj, udata); +if (IS_ERR (srq)) { + ret =PTR_ERR (srq); + goto err_put_pd; } -atomic_inc (&pd->usecnt); -atomic_set (&srq->usecnt,0 ); - obj->uevent.uobject.object = srq; - obj->uevent.uobject.user_handle = cmd->user_handle; obj->uevent.event_file = attrs->ufile->default_async_file;if (obj->uevent.event_file)uverbs_uobject_get (&obj->uevent.event_file->uobj);
@@ -3524,13 +3501,8 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,if (obj->uevent.event_file)uverbs_uobject_put (&obj->uevent.event_file->uobj);ib_destroy_srq_user (srq,uverbs_get_cleared_udata (attrs)); -/* It was released in ib_destroy_srq_user */ - srq =NULL ; -err_free: -kfree (srq); -err_put: +err_put_pd:uobj_put_obj_read (pd); - err_put_cq:if (ib_srq_has_cq (cmd->srq_type)) rdma_lookup_put_uobject(&attr.ext.cq->uobject->uevent.uobject,
drivers/infiniband/core/verbs.c +22 -7
@@ -981,15 +981,29 @@ EXPORT_SYMBOL(rdma_destroy_ah_user);/* Shared receive queues */ -struct ib_srq *ib_create_srq (struct ib_pd *pd, -struct ib_srq_init_attr *srq_init_attr) +/** +* ib_create_srq_user - Creates a SRQ associated with the specified protection +* domain. +* @pd: The protection domain associated with the SRQ. +* @srq_init_attr: A list of initial attributes required to create the +* SRQ. If SRQ creation succeeds, then the attributes are updated to +* the actual capabilities of the created SRQ. +* @uobject - uobject pointer if this is not a kernel SRQ +* @udata - udata pointer if this is not a kernel SRQ +* +* srq_attr->max_wr and srq_attr->max_sge are read the determine the +* requested size of the SRQ, and set to the actual values allocated +* on return. If ib_create_srq() succeeds, then max_wr and max_sge +* will always be at least as large as the requested values. +*/ +struct ib_srq *ib_create_srq_user (struct ib_pd *pd, +struct ib_srq_init_attr *srq_init_attr, +struct ib_usrq_object *uobject, +struct ib_udata *udata) {struct ib_srq *srq;int ret; -if (!pd->device->ops.create_srq) -return ERR_PTR (-EOPNOTSUPP ); - srq =rdma_zalloc_drv_obj (pd->device, ib_srq);if (!srq)return ERR_PTR (-ENOMEM );
@@ -999,6 +1013,7 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd, srq->event_handler = srq_init_attr->event_handler; srq->srq_context = srq_init_attr->srq_context; srq->srq_type = srq_init_attr->srq_type; + srq->uobject = uobject;if (ib_srq_has_cq (srq->srq_type)) { srq->ext.cq = srq_init_attr->ext.cq;
@@ -1010,7 +1025,7 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd, }atomic_inc (&pd->usecnt); - ret = pd->device->ops.create_srq (srq, srq_init_attr,NULL ); + ret = pd->device->ops.create_srq (srq, srq_init_attr, udata);if (ret) {atomic_dec (&srq->pd->usecnt);if (srq->srq_type ==IB_SRQT_XRC )
@@ -1023,7 +1038,7 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd,return srq; } -EXPORT_SYMBOL (ib_create_srq); +EXPORT_SYMBOL (ib_create_srq_user); int ib_modify_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
include/rdma/ib_verbs.h +12 -15
@@ -3564,21 +3564,18 @@ static inline int rdma_destroy_ah(struct ib_ah *ah, u32 flags)return rdma_destroy_ah_user (ah, flags,NULL ); } -/** -* ib_create_srq - Creates a SRQ associated with the specified protection -* domain. -* @pd: The protection domain associated with the SRQ. -* @srq_init_attr: A list of initial attributes required to create the -* SRQ. If SRQ creation succeeds, then the attributes are updated to -* the actual capabilities of the created SRQ. -* -* srq_attr->max_wr and srq_attr->max_sge are read the determine the -* requested size of the SRQ, and set to the actual values allocated -* on return. If ib_create_srq() succeeds, then max_wr and max_sge -* will always be at least as large as the requested values. -*/ -struct ib_srq *ib_create_srq (struct ib_pd *pd, -struct ib_srq_init_attr *srq_init_attr); +struct ib_srq *ib_create_srq_user (struct ib_pd *pd, +struct ib_srq_init_attr *srq_init_attr, +struct ib_usrq_object *uobject, +struct ib_udata *udata); +static inline struct ib_srq * +ib_create_srq (struct ib_pd *pd,struct ib_srq_init_attr *srq_init_attr) +{ +if (!pd->device->ops.create_srq) +return ERR_PTR (-EOPNOTSUPP ); + +return ib_create_srq_user (pd, srq_init_attr,NULL ,NULL ); +}/** * ib_modify_srq - Modifies the attributes for the specified SRQ.
Signature · 1 line
2.26.2
PATCH 6/10 IB/uverbs: Move QP, SRQ, WQ type and flags to UAPI
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
These constants are going to be used in the ioctl interface in coming patches so they are part of the UAPI, place them in the correct header for clarity.
--- include/rdma/ib_verbs.h | 43 ++++++++++++++----------- include/uapi/rdma/ib_user_ioctl_verbs.h | 34 +++++++++++++++++++ 2 files changed, 58 insertions(+), 19 deletions(-)
include/rdma/ib_verbs.h +24 -19
@@ -1012,9 +1012,9 @@ enum ib_cq_notify_flags { };enum ib_srq_type { -IB_SRQT_BASIC , -IB_SRQT_XRC , -IB_SRQT_TM , +IB_SRQT_BASIC =IB_UVERBS_SRQT_BASIC , +IB_SRQT_XRC =IB_UVERBS_SRQT_XRC , +IB_SRQT_TM =IB_UVERBS_SRQT_TM , };static inline bool ib_srq_has_cq (enum ib_srq_type srq_type)
@@ -1083,16 +1083,16 @@ enum ib_qp_type {IB_QPT_SMI ,IB_QPT_GSI , -IB_QPT_RC , -IB_QPT_UC , -IB_QPT_UD , +IB_QPT_RC =IB_UVERBS_QPT_RC , +IB_QPT_UC =IB_UVERBS_QPT_UC , +IB_QPT_UD =IB_UVERBS_QPT_UD ,IB_QPT_RAW_IPV6 ,IB_QPT_RAW_ETHERTYPE , -IB_QPT_RAW_PACKET =8 , -IB_QPT_XRC_INI =9 , -IB_QPT_XRC_TGT , +IB_QPT_RAW_PACKET =IB_UVERBS_QPT_RAW_PACKET , +IB_QPT_XRC_INI =IB_UVERBS_QPT_XRC_INI , +IB_QPT_XRC_TGT =IB_UVERBS_QPT_XRC_TGT ,IB_QPT_MAX , -IB_QPT_DRIVER =0xFF , +IB_QPT_DRIVER =IB_UVERBS_QPT_DRIVER ,/* Reserve a range for qp types internal to the low level driver. * These qp types will not be visible at the IB core layer, so the * IB_QPT_MAX usages should not be affected in the core layer
@@ -1111,17 +1111,21 @@ enum ib_qp_type {enum ib_qp_create_flags {IB_QP_CREATE_IPOIB_UD_LSO =1 <<0 , -IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK =1 <<1 , +IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = +IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK ,IB_QP_CREATE_CROSS_CHANNEL =1 <<2 ,IB_QP_CREATE_MANAGED_SEND =1 <<3 ,IB_QP_CREATE_MANAGED_RECV =1 <<4 ,IB_QP_CREATE_NETIF_QP =1 <<5 ,IB_QP_CREATE_INTEGRITY_EN =1 <<6 ,/* FREE = 1 << 7, */ -IB_QP_CREATE_SCATTER_FCS =1 <<8 , -IB_QP_CREATE_CVLAN_STRIPPING =1 <<9 , +IB_QP_CREATE_SCATTER_FCS = +IB_UVERBS_QP_CREATE_SCATTER_FCS , +IB_QP_CREATE_CVLAN_STRIPPING = +IB_UVERBS_QP_CREATE_CVLAN_STRIPPING ,IB_QP_CREATE_SOURCE_QPN =1 <<10 , -IB_QP_CREATE_PCI_WRITE_END_PADDING =1 <<11 , +IB_QP_CREATE_PCI_WRITE_END_PADDING = +IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING ,/* reserve bits 26-31 for low level drivers' internal use */ IB_QP_CREATE_RESERVED_START =1 <<26 ,IB_QP_CREATE_RESERVED_END =1 <<31 ,
@@ -1626,7 +1630,7 @@ enum ib_raw_packet_caps { };enum ib_wq_type { -IB_WQT_RQ +IB_WQT_RQ =IB_UVERBS_WQT_RQ , };enum ib_wq_state {
@@ -1649,10 +1653,11 @@ struct ib_wq { };enum ib_wq_flags { -IB_WQ_FLAGS_CVLAN_STRIPPING =1 <<0 , -IB_WQ_FLAGS_SCATTER_FCS =1 <<1 , -IB_WQ_FLAGS_DELAY_DROP =1 <<2 , -IB_WQ_FLAGS_PCI_WRITE_END_PADDING =1 <<3 , +IB_WQ_FLAGS_CVLAN_STRIPPING =IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING , +IB_WQ_FLAGS_SCATTER_FCS =IB_UVERBS_WQ_FLAGS_SCATTER_FCS , +IB_WQ_FLAGS_DELAY_DROP =IB_UVERBS_WQ_FLAGS_DELAY_DROP , +IB_WQ_FLAGS_PCI_WRITE_END_PADDING = +IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING , };struct ib_wq_init_attr {
include/uapi/rdma/ib_user_ioctl_verbs.h +34 -0
@@ -64,6 +64,40 @@ enum ib_uverbs_access_flags { ~(IB_UVERBS_ACCESS_OPTIONAL_FIRST -1 ) }; +enum ib_uverbs_srq_type { +IB_UVERBS_SRQT_BASIC , +IB_UVERBS_SRQT_XRC , +IB_UVERBS_SRQT_TM , +}; + +enum ib_uverbs_wq_type { +IB_UVERBS_WQT_RQ , +}; + +enum ib_uverbs_wq_flags { +IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING =1 <<0 , +IB_UVERBS_WQ_FLAGS_SCATTER_FCS =1 <<1 , +IB_UVERBS_WQ_FLAGS_DELAY_DROP =1 <<2 , +IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING =1 <<3 , +}; + +enum ib_uverbs_qp_type { +IB_UVERBS_QPT_RC =2 , +IB_UVERBS_QPT_UC , +IB_UVERBS_QPT_UD , +IB_UVERBS_QPT_RAW_PACKET =8 , +IB_UVERBS_QPT_XRC_INI , +IB_UVERBS_QPT_XRC_TGT , +IB_UVERBS_QPT_DRIVER =0xFF , +}; + +enum ib_uverbs_qp_create_flags { +IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK =1 <<1 , +IB_UVERBS_QP_CREATE_SCATTER_FCS =1 <<8 , +IB_UVERBS_QP_CREATE_CVLAN_STRIPPING =1 <<9 , +IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING =1 <<11 , +}; +enum ib_uverbs_query_port_cap_flags {IB_UVERBS_PCF_SM =1 <<1 ,IB_UVERBS_PCF_NOTICE_SUP =1 <<2 ,
Signature · 1 line
2.26.2
Re: [PATCH rdma-next v1 06/10] IB/uverbs: Move QP, SRQ, WQ type and flags to UAPI
Quoted 90 lines · Leon Romanovsky
From: Yishai Hadas <[email protected]>
These constants are going to be used in the ioctl interface in coming patches so they are part of the UAPI, place them in the correct header for clarity.
Signed-off-by Yishai Hadas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>include/rdma/ib_verbs.h | 43 ++++++++++++++----------- include/uapi/rdma/ib_user_ioctl_verbs.h | 34 +++++++++++++++++++ 2 files changed, 58 insertions(+), 19 deletions(-)include/rdma/ib_verbs.h +20
-15+++ b/include/rdma/ib_verbs.h@@ -1012,9 +1012,9 @@ enum ib_cq_notify_flags { };enum ib_srq_type { -IB_SRQT_BASIC , -IB_SRQT_XRC , -IB_SRQT_TM , +IB_SRQT_BASIC =IB_UVERBS_SRQT_BASIC , +IB_SRQT_XRC =IB_UVERBS_SRQT_XRC , +IB_SRQT_TM =IB_UVERBS_SRQT_TM , };static inline bool ib_srq_has_cq (enum ib_srq_type srq_type)@@ -1083,16 +1083,16 @@ enum ib_qp_type {IB_QPT_SMI ,IB_QPT_GSI , -IB_QPT_RC , -IB_QPT_UC , -IB_QPT_UD , +IB_QPT_RC =IB_UVERBS_QPT_RC , +IB_QPT_UC =IB_UVERBS_QPT_UC , +IB_QPT_UD =IB_UVERBS_QPT_UD ,IB_QPT_RAW_IPV6 ,IB_QPT_RAW_ETHERTYPE , -IB_QPT_RAW_PACKET =8 , -IB_QPT_XRC_INI =9 , -IB_QPT_XRC_TGT , +IB_QPT_RAW_PACKET =IB_UVERBS_QPT_RAW_PACKET , +IB_QPT_XRC_INI =IB_UVERBS_QPT_XRC_INI , +IB_QPT_XRC_TGT =IB_UVERBS_QPT_XRC_TGT ,IB_QPT_MAX , -IB_QPT_DRIVER =0xFF , +IB_QPT_DRIVER =IB_UVERBS_QPT_DRIVER ,/* Reserve a range for qp types internal to the low level driver. * These qp types will not be visible at the IB core layer, so the * IB_QPT_MAX usages should not be affected in the core layer @@ -1111,17 +1111,21 @@ enum ib_qp_type {enum ib_qp_create_flags {IB_QP_CREATE_IPOIB_UD_LSO =1 <<0 , -IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK =1 <<1 , +IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = +IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK ,IB_QP_CREATE_CROSS_CHANNEL =1 <<2 ,IB_QP_CREATE_MANAGED_SEND =1 <<3 ,IB_QP_CREATE_MANAGED_RECV =1 <<4 ,IB_QP_CREATE_NETIF_QP =1 <<5 ,IB_QP_CREATE_INTEGRITY_EN =1 <<6 ,/* FREE = 1 << 7, */ -IB_QP_CREATE_SCATTER_FCS =1 <<8 , -IB_QP_CREATE_CVLAN_STRIPPING =1 <<9 , +IB_QP_CREATE_SCATTER_FCS = +IB_UVERBS_QP_CREATE_SCATTER_FCS , +IB_QP_CREATE_CVLAN_STRIPPING = +IB_UVERBS_QP_CREATE_CVLAN_STRIPPING ,IB_QP_CREATE_SOURCE_QPN =1 <<10 , -IB_QP_CREATE_PCI_WRITE_END_PADDING =1 <<11 , +IB_QP_CREATE_PCI_WRITE_END_PADDING = +IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING ,/* reserve bits 26-31 for low level drivers' internal use */ IB_QP_CREATE_RESERVED_START =1 <<26 ,IB_QP_CREATE_RESERVED_END =1 <<31 ,@@ -1626,7 +1630,7 @@ enum ib_raw_packet_caps { };enum ib_wq_type { -IB_WQT_RQ +IB_WQT_RQ =IB_UVERBS_WQT_RQ , };enum ib_wq_state {@@ -1649,10 +1653,11 @@ struct ib_wq { };
include/rdma/ib_verbs.h struct ib_wq { · line 1660
Quoted 10 lines
include/rdma/ib_verbs.h +5
-4enum ib_wq_flags { -IB_WQ_FLAGS_CVLAN_STRIPPING =1 <<0 , -IB_WQ_FLAGS_SCATTER_FCS =1 <<1 , -IB_WQ_FLAGS_DELAY_DROP =1 <<2 , -IB_WQ_FLAGS_PCI_WRITE_END_PADDING =1 <<3 , +IB_WQ_FLAGS_CVLAN_STRIPPING =IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING , +IB_WQ_FLAGS_SCATTER_FCS =IB_UVERBS_WQ_FLAGS_SCATTER_FCS , +IB_WQ_FLAGS_DELAY_DROP =IB_UVERBS_WQ_FLAGS_DELAY_DROP , +IB_WQ_FLAGS_PCI_WRITE_END_PADDING = +IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING ,
For flags that are not used by kernel ULPs, like these, it makes more sense to have the driver refer to the IB_UVERBS_* constant and remove this stuff from the ULP facing header. Probably as individual patches
Same above from the create flags I suppose
Jason
PATCH 7/10 IB/uverbs: Introduce create/destroy SRQ commands over ioctl
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce create/destroy SRQ commands over the ioctl interface to let it be extended to get an asynchronous event FD.
--- drivers/infiniband/core/Makefile | 3 +- drivers/infiniband/core/rdma_core.h | 1 + drivers/infiniband/core/uverbs_std_types.c | 32 --- .../infiniband/core/uverbs_std_types_srq.c | 233 ++++++++++++++++++ drivers/infiniband/core/uverbs_uapi.c | 1 + include/uapi/rdma/ib_user_ioctl_cmds.h | 27 ++ 6 files changed, 264 insertions(+), 33 deletions(-) create mode 100644 drivers/infiniband/core/uverbs_std_types_srq.c
drivers/infiniband/core/Makefile +2 -1
@@ -36,6 +36,7 @@ ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ uverbs_std_types_flow_action.o uverbs_std_types_dm.o \ uverbs_std_types_mr.o uverbs_std_types_counters.o \ uverbs_uapi.o uverbs_std_types_device.o \ - uverbs_std_types_async_fd.o + uverbs_std_types_async_fd.o \ + uverbs_std_types_srq.o ib_uverbs-$(CONFIG_INFINIBAND_USER_MEM) += umem.o ib_uverbs-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o
drivers/infiniband/core/rdma_core.h +1 -0
@@ -159,6 +159,7 @@ extern const struct uapi_definition uverbs_def_obj_dm[];extern const struct uapi_definition uverbs_def_obj_flow_action[];extern const struct uapi_definition uverbs_def_obj_intf[];extern const struct uapi_definition uverbs_def_obj_mr[]; +extern const struct uapi_definition uverbs_def_obj_srq[];extern const struct uapi_definition uverbs_def_write_intf[]; static inline const struct uverbs_api_write_method *
drivers/infiniband/core/uverbs_std_types.c +0 -32
@@ -142,31 +142,6 @@ static int uverbs_free_wq(struct ib_uobject *uobject,return ret; } -static int uverbs_free_srq (struct ib_uobject *uobject, -enum rdma_remove_reason why, -struct uverbs_attr_bundle *attrs) -{ -struct ib_srq *srq = uobject->object; -struct ib_uevent_object *uevent = - container_of(uobject, struct ib_uevent_object, uobject); -enum ib_srq_type srq_type = srq->srq_type; -int ret; - - ret =ib_destroy_srq_user (srq, &attrs->driver_udata); -if (ib_is_destroy_retryable (ret, why, uobject)) -return ret; - -if (srq_type ==IB_SRQT_XRC ) { -struct ib_usrq_object *us = - container_of(uevent, struct ib_usrq_object, uevent); - -atomic_dec (&us->uxrcd->refcnt); - } - -ib_uverbs_release_uevent (uevent); -return ret; -} -static int uverbs_free_xrcd (struct ib_uobject *uobject,enum rdma_remove_reason why,struct uverbs_attr_bundle *attrs)
@@ -267,11 +242,6 @@ DECLARE_UVERBS_NAMED_OBJECT(UVERBS_OBJECT_MW,UVERBS_TYPE_ALLOC_IDR (uverbs_free_mw), &UVERBS_METHOD(UVERBS_METHOD_MW_DESTROY)); -DECLARE_UVERBS_NAMED_OBJECT ( -UVERBS_OBJECT_SRQ , -UVERBS_TYPE_ALLOC_IDR_SZ (sizeof (struct ib_usrq_object ), - uverbs_free_srq)); - DECLARE_UVERBS_NAMED_METHOD_DESTROY( UVERBS_METHOD_AH_DESTROY, UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_AH_HANDLE,
@@ -346,8 +316,6 @@ const struct uapi_definition uverbs_def_obj_intf[] = { UAPI_DEF_OBJ_NEEDS_FN(destroy_ah)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_MW ,UAPI_DEF_OBJ_NEEDS_FN (dealloc_mw)), -UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_SRQ , -UAPI_DEF_OBJ_NEEDS_FN (destroy_srq)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_FLOW ,UAPI_DEF_OBJ_NEEDS_FN (destroy_flow)), UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_WQ,
drivers/infiniband/core/uverbs_std_types_srq.c new file +233 -0
233 lines not on this page · raw message
drivers/infiniband/core/uverbs_uapi.c +1 -0
@@ -634,6 +634,7 @@ static const struct uapi_definition uverbs_core_api[] = {UAPI_DEF_CHAIN (uverbs_def_obj_flow_action),UAPI_DEF_CHAIN (uverbs_def_obj_intf),UAPI_DEF_CHAIN (uverbs_def_obj_mr), +UAPI_DEF_CHAIN (uverbs_def_obj_srq), UAPI_DEF_CHAIN(uverbs_def_write_intf), {}, };
include/uapi/rdma/ib_user_ioctl_cmds.h +27 -0
@@ -121,6 +121,33 @@ enum uverbs_attrs_destroy_flow_action_esp { UVERBS_ATTR_DESTROY_FLOW_ACTION_HANDLE, }; +enum uverbs_attrs_create_srq_cmd_attr_ids { +UVERBS_ATTR_CREATE_SRQ_HANDLE , +UVERBS_ATTR_CREATE_SRQ_PD_HANDLE , +UVERBS_ATTR_CREATE_SRQ_XRCD_HANDLE , +UVERBS_ATTR_CREATE_SRQ_CQ_HANDLE , +UVERBS_ATTR_CREATE_SRQ_USER_HANDLE , +UVERBS_ATTR_CREATE_SRQ_MAX_WR , +UVERBS_ATTR_CREATE_SRQ_MAX_SGE , +UVERBS_ATTR_CREATE_SRQ_LIMIT , +UVERBS_ATTR_CREATE_SRQ_MAX_NUM_TAGS , +UVERBS_ATTR_CREATE_SRQ_TYPE , +UVERBS_ATTR_CREATE_SRQ_EVENT_FD , +UVERBS_ATTR_CREATE_SRQ_RESP_MAX_WR , +UVERBS_ATTR_CREATE_SRQ_RESP_MAX_SGE , +UVERBS_ATTR_CREATE_SRQ_RESP_SRQ_NUM , +}; + +enum uverbs_attrs_destroy_srq_cmd_attr_ids { +UVERBS_ATTR_DESTROY_SRQ_HANDLE , +UVERBS_ATTR_DESTROY_SRQ_RESP , +}; + +enum uverbs_methods_srq { +UVERBS_METHOD_SRQ_CREATE , +UVERBS_METHOD_SRQ_DESTROY , +}; +enum uverbs_methods_cq {UVERBS_METHOD_CQ_CREATE ,UVERBS_METHOD_CQ_DESTROY ,
Signature · 1 line
2.26.2
Re: [PATCH rdma-next v1 07/10] IB/uverbs: Introduce create/destroy SRQ commands over ioctl
Quoted 21 lines · Leon Romanovsky
drivers/infiniband/core/uverbs_std_types_srq.c new file +17
-0+++ b/drivers/infiniband/core/uverbs_std_types_srq.c@@ -0,0 +1,233 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* +* Copyright (c) 2020, Mellanox Technologies inc. All rights reserved. +*/ + +#include <rdma/uverbs_std_types.h> +#include "rdma_core.h" +#include "uverbs.h" + +static int uverbs_free_srq (struct ib_uobject *uobject, +enum rdma_remove_reason why, +struct uverbs_attr_bundle *attrs) +{ +struct ib_srq *srq = uobject->object; +struct ib_uevent_object *uevent = + container_of(uobject, struct ib_uevent_object, uobject);
drivers/infiniband/core/uverbs_std_types_srq.c line 26
Quoted 10 lines
drivers/infiniband/core/uverbs_std_types_srq.c new file +10
-0+enum ib_srq_type srq_type = srq->srq_type; +int ret; + + ret =ib_destroy_srq_user (srq, &attrs->driver_udata); +if (ib_is_destroy_retryable (ret, why, uobject)) +return ret; + +if (srq_type ==IB_SRQT_XRC ) { +struct ib_usrq_object *us = + container_of(uevent, struct ib_usrq_object, uevent);
Why is this here? The uobject can't be something other than an ib_usrq_object, so the above uevent should be just
struct ib_usrq_object *us =
container_of(uobject, struct ib_usrq_object, uevent.object);
And the other bits simplified
drivers/infiniband/core/uverbs_std_types_srq.c line 44
Quoted 10 lines
drivers/infiniband/core/uverbs_std_types_srq.c new file +10
-0+static int UVERBS_HANDLER (UVERBS_METHOD_SRQ_CREATE )( +struct uverbs_attr_bundle *attrs) +{ +struct ib_usrq_object *obj =container_of ( +uverbs_attr_get_uobject (attrs,UVERBS_ATTR_CREATE_SRQ_HANDLE ), +typeof (*obj), uevent.uobject); +struct ib_pd *pd = +uverbs_attr_get_obj (attrs,UVERBS_ATTR_CREATE_SRQ_PD_HANDLE ); +struct ib_srq_init_attr attr = {}; +struct ib_uobject *uninitialized_var (xrcd_uobj );
Why do we need uninitalized_var? Looks like it should be fine to me
Jason
PATCH 8/10 IB/uverbs: Fix create WQ to use the given user handle
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Fix create WQ to use the given user handle, in addition dropped some duplicated code from this flow.
--- drivers/infiniband/core/uverbs_cmd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +1 -2
@@ -2970,6 +2970,7 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) wq_init_attr.event_handler = ib_uverbs_wq_event_handler; wq_init_attr.create_flags = cmd.create_flags;INIT_LIST_HEAD (&obj->uevent.event_list); + obj->uevent.uobject.user_handle = cmd.user_handle; wq = pd->device->ops.create_wq (pd, &wq_init_attr, &attrs->driver_udata);if (IS_ERR (wq)) {
@@ -2986,8 +2987,6 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)atomic_set (&wq->usecnt,0 );atomic_inc (&pd->usecnt);atomic_inc (&cq->usecnt); - wq->uobject = obj; - obj->uevent.uobject.object = wq; obj->uevent.event_file = attrs->ufile->default_async_file;if (obj->uevent.event_file)uverbs_uobject_get (&obj->uevent.event_file->uobj);
Signature · 1 line
2.26.2
PATCH 9/10 IB/uverbs: Introduce create/destroy WQ commands over ioctl
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce create/destroy WQ commands over the ioctl interface to let it be extended to get an asynchronous event FD.
--- drivers/infiniband/core/Makefile | 3 +- drivers/infiniband/core/rdma_core.h | 1 + drivers/infiniband/core/uverbs_std_types.c | 23 --- drivers/infiniband/core/uverbs_std_types_wq.c | 194 ++++++++++++++++++ drivers/infiniband/core/uverbs_uapi.c | 1 + include/uapi/rdma/ib_user_ioctl_cmds.h | 25 +++ 6 files changed, 223 insertions(+), 24 deletions(-) create mode 100644 drivers/infiniband/core/uverbs_std_types_wq.c
drivers/infiniband/core/Makefile +2 -1
@@ -37,6 +37,7 @@ ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ uverbs_std_types_mr.o uverbs_std_types_counters.o \ uverbs_uapi.o uverbs_std_types_device.o \ uverbs_std_types_async_fd.o \ - uverbs_std_types_srq.o + uverbs_std_types_srq.o \ + uverbs_std_types_wq.o ib_uverbs-$(CONFIG_INFINIBAND_USER_MEM) += umem.o ib_uverbs-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o
drivers/infiniband/core/rdma_core.h +1 -0
@@ -160,6 +160,7 @@ extern const struct uapi_definition uverbs_def_obj_flow_action[];extern const struct uapi_definition uverbs_def_obj_intf[];extern const struct uapi_definition uverbs_def_obj_mr[];extern const struct uapi_definition uverbs_def_obj_srq[]; +extern const struct uapi_definition uverbs_def_obj_wq[];extern const struct uapi_definition uverbs_def_write_intf[]; static inline const struct uverbs_api_write_method *
drivers/infiniband/core/uverbs_std_types.c +0 -23
@@ -125,23 +125,6 @@ static int uverbs_free_rwq_ind_tbl(struct ib_uobject *uobject,return ret; } -static int uverbs_free_wq (struct ib_uobject *uobject, -enum rdma_remove_reason why, -struct uverbs_attr_bundle *attrs) -{ -struct ib_wq *wq = uobject->object; -struct ib_uwq_object *uwq = - container_of(uobject, struct ib_uwq_object, uevent.uobject); -int ret; - - ret =ib_destroy_wq (wq, &attrs->driver_udata); -if (ib_is_destroy_retryable (ret, why, uobject)) -return ret; - -ib_uverbs_release_uevent (&uwq->uevent); -return ret; -} -static int uverbs_free_xrcd (struct ib_uobject *uobject,enum rdma_remove_reason why,struct uverbs_attr_bundle *attrs)
@@ -266,10 +249,6 @@ DECLARE_UVERBS_NAMED_OBJECT( uverbs_free_flow), &UVERBS_METHOD(UVERBS_METHOD_FLOW_DESTROY)); -DECLARE_UVERBS_NAMED_OBJECT ( -UVERBS_OBJECT_WQ , -UVERBS_TYPE_ALLOC_IDR_SZ (sizeof (struct ib_uwq_object ), uverbs_free_wq)); - DECLARE_UVERBS_NAMED_METHOD_DESTROY( UVERBS_METHOD_RWQ_IND_TBL_DESTROY, UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_RWQ_IND_TBL_HANDLE,
@@ -318,8 +297,6 @@ const struct uapi_definition uverbs_def_obj_intf[] = { UAPI_DEF_OBJ_NEEDS_FN(dealloc_mw)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_FLOW ,UAPI_DEF_OBJ_NEEDS_FN (destroy_flow)), -UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_WQ , -UAPI_DEF_OBJ_NEEDS_FN (destroy_wq)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_RWQ_IND_TBL , UAPI_DEF_OBJ_NEEDS_FN(destroy_rwq_ind_table)),
drivers/infiniband/core/uverbs_std_types_wq.c new file +194 -0
194 lines not on this page · raw message
drivers/infiniband/core/uverbs_uapi.c +1 -0
@@ -635,6 +635,7 @@ static const struct uapi_definition uverbs_core_api[] = {UAPI_DEF_CHAIN (uverbs_def_obj_intf),UAPI_DEF_CHAIN (uverbs_def_obj_mr),UAPI_DEF_CHAIN (uverbs_def_obj_srq), +UAPI_DEF_CHAIN (uverbs_def_obj_wq), UAPI_DEF_CHAIN(uverbs_def_write_intf), {}, };
include/uapi/rdma/ib_user_ioctl_cmds.h +25 -0
@@ -153,6 +153,31 @@ enum uverbs_methods_cq { UVERBS_METHOD_CQ_DESTROY, }; +enum uverbs_attrs_create_wq_cmd_attr_ids { +UVERBS_ATTR_CREATE_WQ_HANDLE , +UVERBS_ATTR_CREATE_WQ_PD_HANDLE , +UVERBS_ATTR_CREATE_WQ_CQ_HANDLE , +UVERBS_ATTR_CREATE_WQ_USER_HANDLE , +UVERBS_ATTR_CREATE_WQ_TYPE , +UVERBS_ATTR_CREATE_WQ_EVENT_FD , +UVERBS_ATTR_CREATE_WQ_MAX_WR , +UVERBS_ATTR_CREATE_WQ_MAX_SGE , +UVERBS_ATTR_CREATE_WQ_FLAGS , +UVERBS_ATTR_CREATE_WQ_RESP_MAX_WR , +UVERBS_ATTR_CREATE_WQ_RESP_MAX_SGE , +UVERBS_ATTR_CREATE_WQ_RESP_WQ_NUM , +}; + +enum uverbs_attrs_destroy_wq_cmd_attr_ids { +UVERBS_ATTR_DESTROY_WQ_HANDLE , +UVERBS_ATTR_DESTROY_WQ_RESP , +}; + +enum uverbs_methods_wq { +UVERBS_METHOD_WQ_CREATE , +UVERBS_METHOD_WQ_DESTROY , +}; +enum uverbs_methods_actions_flow_action_ops {UVERBS_METHOD_FLOW_ACTION_ESP_CREATE ,UVERBS_METHOD_FLOW_ACTION_DESTROY ,
Signature · 1 line
2.26.2
Re: [PATCH rdma-next v1 09/10] IB/uverbs: Introduce create/destroy WQ commands over ioctl
Quoted 44 lines · Leon Romanovsky
drivers/infiniband/core/uverbs_std_types_wq.c new file +44
-0+static int UVERBS_HANDLER (UVERBS_METHOD_WQ_CREATE )( +struct uverbs_attr_bundle *attrs) +{ +struct ib_uwq_object *obj =container_of ( +uverbs_attr_get_uobject (attrs,UVERBS_ATTR_CREATE_WQ_HANDLE ), +typeof (*obj), uevent.uobject); +struct ib_pd *pd = +uverbs_attr_get_obj (attrs,UVERBS_ATTR_CREATE_WQ_PD_HANDLE ); +struct ib_cq *cq = +uverbs_attr_get_obj (attrs,UVERBS_ATTR_CREATE_WQ_CQ_HANDLE ); +struct ib_wq_init_attr wq_init_attr = {}; +struct ib_wq *wq; +u64 user_handle; +int ret; + + ret =uverbs_get_flags32 (&wq_init_attr.create_flags, attrs, +UVERBS_ATTR_CREATE_WQ_FLAGS , +IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING | +IB_UVERBS_WQ_FLAGS_SCATTER_FCS | +IB_UVERBS_WQ_FLAGS_DELAY_DROP | +IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING ); +if (!ret) + ret =uverbs_copy_from (&wq_init_attr.max_sge, attrs, +UVERBS_ATTR_CREATE_WQ_MAX_SGE ); +if (!ret) + ret =uverbs_copy_from (&wq_init_attr.max_wr, attrs, +UVERBS_ATTR_CREATE_WQ_MAX_WR ); +if (!ret) + ret =uverbs_copy_from (&user_handle, attrs, +UVERBS_ATTR_CREATE_WQ_USER_HANDLE ); +if (!ret) + ret =uverbs_get_const (&wq_init_attr.wq_type, attrs, +UVERBS_ATTR_CREATE_WQ_TYPE ); +if (ret) +return ret; + +if (wq_init_attr.wq_type !=IB_WQT_RQ ) +return -EINVAL ; + + obj->uevent.event_file =ib_uverbs_get_async_event (attrs, +UVERBS_ATTR_CREATE_WQ_EVENT_FD ); + obj->uevent.uobject.user_handle = user_handle; +INIT_LIST_HEAD (&obj->uevent.event_list); + wq_init_attr.event_handler = ib_uverbs_wq_event_handler;
drivers/infiniband/core/uverbs_std_types_wq.c line 80
Quoted 10 lines
drivers/infiniband/core/uverbs_std_types_wq.c new file +10
-0+ wq_init_attr.wq_context = attrs->ufile; + wq_init_attr.cq = cq; + + wq = pd->device->ops.create_wq (pd, &wq_init_attr, &attrs->driver_udata); +if (IS_ERR (wq)) { + ret =PTR_ERR (wq); + goto err; + } + +uverbs_finalize_uobj_create (attrs,UVERBS_ATTR_CREATE_WQ_HANDLE );
The object should be really finalized before calling this, ie all of this stuff:
drivers/infiniband/core/uverbs_std_types_wq.c line 90
Quoted 10 lines
drivers/infiniband/core/uverbs_std_types_wq.c new file +10
-0+ obj->uevent.uobject.object = wq; + wq->wq_type = wq_init_attr.wq_type; + wq->cq = cq; + wq->pd = pd; + wq->device = pd->device; + wq->wq_context = wq_init_attr.wq_context; +atomic_set (&wq->usecnt,0 ); +atomic_inc (&pd->usecnt); +atomic_inc (&cq->usecnt); + wq->uobject = obj;
Should be before. Same remark for the other patches
Jason
PATCH 10/10 IB/uverbs: Introduce create/destroy QP commands over ioctl
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce create/destroy QP commands over the ioctl interface to let it be extended to get an asynchronous event FD.
--- drivers/infiniband/core/Makefile | 3 +- drivers/infiniband/core/rdma_core.h | 1 + drivers/infiniband/core/uverbs_std_types.c | 40 -- drivers/infiniband/core/uverbs_std_types_qp.c | 401 ++++++++++++++++++ drivers/infiniband/core/uverbs_uapi.c | 1 + include/uapi/rdma/ib_user_ioctl_cmds.h | 28 ++ include/uapi/rdma/ib_user_ioctl_verbs.h | 9 + 7 files changed, 442 insertions(+), 41 deletions(-) create mode 100644 drivers/infiniband/core/uverbs_std_types_qp.c
drivers/infiniband/core/Makefile +2 -1
@@ -38,6 +38,7 @@ ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ uverbs_uapi.o uverbs_std_types_device.o \ uverbs_std_types_async_fd.o \ uverbs_std_types_srq.o \ - uverbs_std_types_wq.o + uverbs_std_types_wq.o \ + uverbs_std_types_qp.o ib_uverbs-$(CONFIG_INFINIBAND_USER_MEM) += umem.o ib_uverbs-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o
drivers/infiniband/core/rdma_core.h +1 -0
@@ -159,6 +159,7 @@ extern const struct uapi_definition uverbs_def_obj_dm[];extern const struct uapi_definition uverbs_def_obj_flow_action[];extern const struct uapi_definition uverbs_def_obj_intf[];extern const struct uapi_definition uverbs_def_obj_mr[]; +extern const struct uapi_definition uverbs_def_obj_qp[];extern const struct uapi_definition uverbs_def_obj_srq[];extern const struct uapi_definition uverbs_def_obj_wq[];extern const struct uapi_definition uverbs_def_write_intf[];
drivers/infiniband/core/uverbs_std_types.c +0 -40
@@ -75,40 +75,6 @@ static int uverbs_free_mw(struct ib_uobject *uobject,return uverbs_dealloc_mw ((struct ib_mw *)uobject->object); } -static int uverbs_free_qp (struct ib_uobject *uobject, -enum rdma_remove_reason why, -struct uverbs_attr_bundle *attrs) -{ -struct ib_qp *qp = uobject->object; -struct ib_uqp_object *uqp = - container_of(uobject, struct ib_uqp_object, uevent.uobject); -int ret; - -/* -* If this is a user triggered destroy then do not allow destruction -* until the user cleans up all the mcast bindings. Unlike in other -* places we forcibly clean up the mcast attachments for !DESTROY -* because the mcast attaches are not ubojects and will not be -* destroyed by anything else during cleanup processing. -*/ -if (why ==RDMA_REMOVE_DESTROY ) { -if (!list_empty (&uqp->mcast_list)) -return -EBUSY ; - }else if (qp == qp->real_qp) { -ib_uverbs_detach_umcast (qp, uqp); - } - - ret =ib_destroy_qp_user (qp, &attrs->driver_udata); -if (ib_is_destroy_retryable (ret, why, uobject)) -return ret; - -if (uqp->uxrcd) -atomic_dec (&uqp->uxrcd->refcnt); - -ib_uverbs_release_uevent (&uqp->uevent); -return ret; -} -static int uverbs_free_rwq_ind_tbl (struct ib_uobject *uobject,enum rdma_remove_reason why,struct uverbs_attr_bundle *attrs)
@@ -210,10 +176,6 @@ DECLARE_UVERBS_NAMED_OBJECT("[infinibandevent]" , O_RDONLY)); -DECLARE_UVERBS_NAMED_OBJECT ( -UVERBS_OBJECT_QP , -UVERBS_TYPE_ALLOC_IDR_SZ (sizeof (struct ib_uqp_object ), uverbs_free_qp)); - DECLARE_UVERBS_NAMED_METHOD_DESTROY( UVERBS_METHOD_MW_DESTROY, UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MW_HANDLE,
@@ -289,8 +251,6 @@ const struct uapi_definition uverbs_def_obj_intf[] = { UAPI_DEF_OBJ_NEEDS_FN(dealloc_pd)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_COMP_CHANNEL ,UAPI_DEF_OBJ_NEEDS_FN (dealloc_pd)), -UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_QP , -UAPI_DEF_OBJ_NEEDS_FN (destroy_qp)),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (UVERBS_OBJECT_AH ,UAPI_DEF_OBJ_NEEDS_FN (destroy_ah)), UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MW,
drivers/infiniband/core/uverbs_std_types_qp.c new file +401 -0
401 lines not on this page · raw message
drivers/infiniband/core/uverbs_uapi.c +1 -0
@@ -634,6 +634,7 @@ static const struct uapi_definition uverbs_core_api[] = {UAPI_DEF_CHAIN (uverbs_def_obj_flow_action),UAPI_DEF_CHAIN (uverbs_def_obj_intf),UAPI_DEF_CHAIN (uverbs_def_obj_mr), +UAPI_DEF_CHAIN (uverbs_def_obj_qp),UAPI_DEF_CHAIN (uverbs_def_obj_srq),UAPI_DEF_CHAIN (uverbs_def_obj_wq), UAPI_DEF_CHAIN(uverbs_def_write_intf),
include/uapi/rdma/ib_user_ioctl_cmds.h +28 -0
@@ -121,6 +121,34 @@ enum uverbs_attrs_destroy_flow_action_esp { UVERBS_ATTR_DESTROY_FLOW_ACTION_HANDLE, }; +enum uverbs_attrs_create_qp_cmd_attr_ids { +UVERBS_ATTR_CREATE_QP_HANDLE , +UVERBS_ATTR_CREATE_QP_XRCD_HANDLE , +UVERBS_ATTR_CREATE_QP_PD_HANDLE , +UVERBS_ATTR_CREATE_QP_SRQ_HANDLE , +UVERBS_ATTR_CREATE_QP_SEND_CQ_HANDLE , +UVERBS_ATTR_CREATE_QP_RECV_CQ_HANDLE , +UVERBS_ATTR_CREATE_QP_IND_TABLE_HANDLE , +UVERBS_ATTR_CREATE_QP_USER_HANDLE , +UVERBS_ATTR_CREATE_QP_CAP , +UVERBS_ATTR_CREATE_QP_TYPE , +UVERBS_ATTR_CREATE_QP_FLAGS , +UVERBS_ATTR_CREATE_QP_SOURCE_QPN , +UVERBS_ATTR_CREATE_QP_EVENT_FD , +UVERBS_ATTR_CREATE_QP_RESP_CAP , +UVERBS_ATTR_CREATE_QP_RESP_QP_NUM , +}; + +enum uverbs_attrs_destroy_qp_cmd_attr_ids { +UVERBS_ATTR_DESTROY_QP_HANDLE , +UVERBS_ATTR_DESTROY_QP_RESP , +}; + +enum uverbs_methods_qp { +UVERBS_METHOD_QP_CREATE , +UVERBS_METHOD_QP_DESTROY , +}; +enum uverbs_attrs_create_srq_cmd_attr_ids {UVERBS_ATTR_CREATE_SRQ_HANDLE ,UVERBS_ATTR_CREATE_SRQ_PD_HANDLE ,
include/uapi/rdma/ib_user_ioctl_verbs.h +9 -0
@@ -96,6 +96,7 @@ enum ib_uverbs_qp_create_flags {IB_UVERBS_QP_CREATE_SCATTER_FCS =1 <<8 ,IB_UVERBS_QP_CREATE_CVLAN_STRIPPING =1 <<9 ,IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING =1 <<11 , + IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 1 << 12, }; enum ib_uverbs_query_port_cap_flags {
@@ -219,6 +220,14 @@ struct ib_uverbs_query_port_resp_ex {__u8 reserved[6 ]; }; +struct ib_uverbs_qp_cap { +__u32 max_send_wr; +__u32 max_recv_wr; +__u32 max_send_sge; +__u32 max_recv_sge; +__u32 max_inline_data; +}; +enum rdma_driver_id {RDMA_DRIVER_UNKNOWN ,RDMA_DRIVER_MLX5 ,
Signature · 1 line
2.26.2
Quoted 3 lines · Leon Romanovsky
RDMA/core: Consolidate
ib_create_srqflows IB/uverbs: Cleanup wq/srq context usage from uverbs layer IB/uverbs: Fix create WQ to use the given user handle
I took these small fixed to for-next, the others need some minor adjusting
Thanks,
Jason
Quoted 8 lines · Jason Gunthorpe
Quoted 3 lines · Leon Romanovsky
RDMA/core: Consolidate
ib_create_srqflows IB/uverbs: Cleanup wq/srq context usage from uverbs layer IB/uverbs: Fix create WQ to use the given user handleI took these small fixed to for-next, the others need some minor adjusting
Thanks, I saw your comments and agree with all of them, we will fix.
Thanks
Quoted 3 lines
Thanks,
Jason