lkml.org 
[lkml]   [2021]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH rdma-next 7/7] RDMA/core: Create clean QP creations interface for uverbs
    Date
    From: Leon Romanovsky <leonro@nvidia.com>

    Unify create QP creation interface to make clean approach to create
    XRC_TGT and regular QPs.

    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    ---
    drivers/infiniband/core/core_priv.h | 21 +++++-
    drivers/infiniband/core/uverbs_cmd.c | 12 +--
    drivers/infiniband/core/uverbs_std_types_qp.c | 9 +--
    drivers/infiniband/core/verbs.c | 73 +++++++++++--------
    4 files changed, 63 insertions(+), 52 deletions(-)

    diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h
    index d8f464b43dbc..dd4c2e560b59 100644
    --- a/drivers/infiniband/core/core_priv.h
    +++ b/drivers/infiniband/core/core_priv.h
    @@ -316,10 +316,23 @@ struct ib_device *ib_device_get_by_index(const struct net *net, u32 index);
    void nldev_init(void);
    void nldev_exit(void);

    -struct ib_qp *_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
    - struct ib_qp_init_attr *attr,
    - struct ib_udata *udata, struct ib_uqp_object *uobj,
    - const char *caller);
    +struct ib_qp *ib_create_qp_user(struct ib_device *dev, struct ib_pd *pd,
    + struct ib_qp_init_attr *attr,
    + struct ib_udata *udata,
    + struct ib_uqp_object *uobj, const char *caller);
    +static inline struct ib_qp *ib_create_qp_uverbs(struct ib_device *dev,
    + struct ib_pd *pd,
    + struct ib_qp_init_attr *attr,
    + struct ib_udata *udata,
    + struct ib_uqp_object *uobj)
    +{
    + if (attr->qp_type == IB_QPT_XRC_TGT)
    + return ib_create_qp_user(dev, pd, attr, NULL, uobj,
    + KBUILD_MODNAME);
    +
    + return ib_create_qp_user(dev, pd, attr, udata, uobj, NULL);
    +}
    +
    void ib_qp_usecnt_inc(struct ib_qp *qp);
    void ib_qp_usecnt_dec(struct ib_qp *qp);

    diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
    index 62cafd768d89..39206ecdeaad 100644
    --- a/drivers/infiniband/core/uverbs_cmd.c
    +++ b/drivers/infiniband/core/uverbs_cmd.c
    @@ -1435,23 +1435,13 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
    attr.source_qpn = cmd->source_qpn;
    }

    - if (cmd->qp_type == IB_QPT_XRC_TGT)
    - qp = ib_create_qp(pd, &attr);
    - else
    - qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
    - NULL);
    -
    + qp = ib_create_qp_uverbs(device, pd, &attr, &attrs->driver_udata, obj);
    if (IS_ERR(qp)) {
    ret = PTR_ERR(qp);
    goto err_put;
    }
    ib_qp_usecnt_inc(qp);

    - if (cmd->qp_type == IB_QPT_XRC_TGT) {
    - /* It is done in _ib_create_qp for other QP types */
    - qp->uobject = obj;
    - }
    -
    obj->uevent.uobject.object = qp;
    obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file);
    if (obj->uevent.event_file)
    diff --git a/drivers/infiniband/core/uverbs_std_types_qp.c b/drivers/infiniband/core/uverbs_std_types_qp.c
    index a0e734735ba5..15ea00188363 100644
    --- a/drivers/infiniband/core/uverbs_std_types_qp.c
    +++ b/drivers/infiniband/core/uverbs_std_types_qp.c
    @@ -248,12 +248,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(
    set_caps(&attr, &cap, true);
    mutex_init(&obj->mcast_lock);

    - if (attr.qp_type == IB_QPT_XRC_TGT)
    - qp = ib_create_qp(pd, &attr);
    - else
    - qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
    - NULL);
    -
    + qp = ib_create_qp_uverbs(device, pd, &attr, &attrs->driver_udata, obj);
    if (IS_ERR(qp)) {
    ret = PTR_ERR(qp);
    goto err_put;
    @@ -264,8 +259,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(
    obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object,
    uobject);
    atomic_inc(&obj->uxrcd->refcnt);
    - /* It is done in _ib_create_qp for other QP types */
    - qp->uobject = obj;
    }

    obj->uevent.uobject.object = qp;
    diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
    index acf866038277..9414fa8b54c4 100644
    --- a/drivers/infiniband/core/verbs.c
    +++ b/drivers/infiniband/core/verbs.c
    @@ -1200,21 +1200,10 @@ static struct ib_qp *create_xrc_qp_user(struct ib_qp *qp,
    return qp;
    }

    -/**
    - * _ib_create_qp - Creates a QP associated with the specified protection domain
    - * @dev: IB device
    - * @pd: The protection domain associated with the QP.
    - * @attr: A list of initial attributes required to create the
    - * QP. If QP creation succeeds, then the attributes are updated to
    - * the actual capabilities of the created QP.
    - * @udata: User data
    - * @uobj: uverbs obect
    - * @caller: caller's build-time module name
    - */
    -struct ib_qp *_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
    - struct ib_qp_init_attr *attr,
    - struct ib_udata *udata, struct ib_uqp_object *uobj,
    - const char *caller)
    +static struct ib_qp *create_qp(struct ib_device *dev, struct ib_pd *pd,
    + struct ib_qp_init_attr *attr,
    + struct ib_udata *udata,
    + struct ib_uqp_object *uobj, const char *caller)
    {
    struct ib_udata dummy = {};
    struct ib_qp *qp;
    @@ -1273,7 +1262,44 @@ struct ib_qp *_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
    return ERR_PTR(ret);

    }
    -EXPORT_SYMBOL(_ib_create_qp);
    +
    +/**
    + * ib_create_qp_user - Creates a QP associated with the specified protection
    + * domain.
    + * @dev: IB device
    + * @pd: The protection domain associated with the QP.
    + * @attr: A list of initial attributes required to create the
    + * QP. If QP creation succeeds, then the attributes are updated to
    + * the actual capabilities of the created QP.
    + * @udata: User data
    + * @uobj: uverbs obect
    + * @caller: caller's build-time module name
    + */
    +struct ib_qp *ib_create_qp_user(struct ib_device *dev, struct ib_pd *pd,
    + struct ib_qp_init_attr *attr,
    + struct ib_udata *udata,
    + struct ib_uqp_object *uobj, const char *caller)
    +{
    + struct ib_uqp_object *obj = uobj;
    + struct ib_qp *qp, *xrc_qp;
    +
    + if (attr->qp_type == IB_QPT_XRC_TGT)
    + obj = NULL;
    +
    + qp = create_qp(dev, pd, attr, udata, obj, caller);
    + if (attr->qp_type != IB_QPT_XRC_TGT || IS_ERR(qp))
    + return qp;
    +
    + xrc_qp = create_xrc_qp_user(qp, attr);
    + if (IS_ERR(xrc_qp)) {
    + ib_destroy_qp(qp);
    + return xrc_qp;
    + }
    +
    + xrc_qp->uobject = uobj;
    + return xrc_qp;
    +}
    +EXPORT_SYMBOL(ib_create_qp_user);

    void ib_qp_usecnt_inc(struct ib_qp *qp)
    {
    @@ -1318,7 +1344,7 @@ struct ib_qp *ib_create_qp_kernel(struct ib_pd *pd,
    struct ib_qp_init_attr *qp_init_attr,
    const char *caller)
    {
    - struct ib_device *device = pd ? pd->device : qp_init_attr->xrcd->device;
    + struct ib_device *device = pd->device;
    struct ib_qp *qp;
    int ret;

    @@ -1331,21 +1357,10 @@ struct ib_qp *ib_create_qp_kernel(struct ib_pd *pd,
    if (qp_init_attr->cap.max_rdma_ctxs)
    rdma_rw_init_qp(device, qp_init_attr);

    - qp = _ib_create_qp(device, pd, qp_init_attr, NULL, NULL, caller);
    + qp = create_qp(device, pd, qp_init_attr, NULL, NULL, caller);
    if (IS_ERR(qp))
    return qp;

    - if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
    - struct ib_qp *xrc_qp =
    - create_xrc_qp_user(qp, qp_init_attr);
    -
    - if (IS_ERR(xrc_qp)) {
    - ret = PTR_ERR(xrc_qp);
    - goto err;
    - }
    - return xrc_qp;
    - }
    -
    ib_qp_usecnt_inc(qp);

    if (qp_init_attr->cap.max_rdma_ctxs) {
    --
    2.31.1
    \
     
     \ /
      Last update: 2021-07-21 08:23    [W:2.913 / U:2.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site