mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
RDMA/core: Consolidate ib_create_srq flows
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. Link: https://lore.kernel.org/r/20200506082444.14502-6-leon@kernel.org Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
@@ -3444,38 +3444,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 = ib_create_srq_user(pd, &attr, obj, udata);
|
||||
if (IS_ERR(srq)) {
|
||||
ret = PTR_ERR(srq);
|
||||
goto err_put_pd;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
atomic_inc(&pd->usecnt);
|
||||
atomic_set(&srq->usecnt, 0);
|
||||
|
||||
obj->uevent.uobject.object = srq;
|
||||
obj->uevent.uobject.user_handle = cmd->user_handle;
|
||||
|
||||
memset(&resp, 0, sizeof resp);
|
||||
resp.srq_handle = obj->uevent.uobject.id;
|
||||
@@ -3501,13 +3478,8 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
|
||||
|
||||
err_copy:
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user