1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
3 * Copyright (c) 2020, Mellanox Technologies inc. All rights reserved.
6 #include <rdma/uverbs_std_types.h>
10 static int uverbs_free_wq(struct ib_uobject *uobject,
11 enum rdma_remove_reason why,
12 struct uverbs_attr_bundle *attrs)
14 struct ib_wq *wq = uobject->object;
15 struct ib_uwq_object *uwq =
16 container_of(uobject, struct ib_uwq_object, uevent.uobject);
19 ret = ib_destroy_wq_user(wq, &attrs->driver_udata);
23 ib_uverbs_release_uevent(&uwq->uevent);
27 static int UVERBS_HANDLER(UVERBS_METHOD_WQ_CREATE)(
28 struct uverbs_attr_bundle *attrs)
30 struct ib_uwq_object *obj = container_of(
31 uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_WQ_HANDLE),
32 typeof(*obj), uevent.uobject);
34 uverbs_attr_get_obj(attrs, UVERBS_ATTR_CREATE_WQ_PD_HANDLE);
36 uverbs_attr_get_obj(attrs, UVERBS_ATTR_CREATE_WQ_CQ_HANDLE);
37 struct ib_wq_init_attr wq_init_attr = {};
42 ret = uverbs_get_flags32(&wq_init_attr.create_flags, attrs,
43 UVERBS_ATTR_CREATE_WQ_FLAGS,
44 IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING |
45 IB_UVERBS_WQ_FLAGS_SCATTER_FCS |
46 IB_UVERBS_WQ_FLAGS_DELAY_DROP |
47 IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING);
49 ret = uverbs_copy_from(&wq_init_attr.max_sge, attrs,
50 UVERBS_ATTR_CREATE_WQ_MAX_SGE);
52 ret = uverbs_copy_from(&wq_init_attr.max_wr, attrs,
53 UVERBS_ATTR_CREATE_WQ_MAX_WR);
55 ret = uverbs_copy_from(&user_handle, attrs,
56 UVERBS_ATTR_CREATE_WQ_USER_HANDLE);
58 ret = uverbs_get_const(&wq_init_attr.wq_type, attrs,
59 UVERBS_ATTR_CREATE_WQ_TYPE);
63 if (wq_init_attr.wq_type != IB_WQT_RQ)
66 obj->uevent.event_file = ib_uverbs_get_async_event(attrs,
67 UVERBS_ATTR_CREATE_WQ_EVENT_FD);
68 obj->uevent.uobject.user_handle = user_handle;
69 INIT_LIST_HEAD(&obj->uevent.event_list);
70 wq_init_attr.event_handler = ib_uverbs_wq_event_handler;
71 wq_init_attr.wq_context = attrs->ufile;
74 wq = pd->device->ops.create_wq(pd, &wq_init_attr, &attrs->driver_udata);
80 obj->uevent.uobject.object = wq;
81 wq->wq_type = wq_init_attr.wq_type;
84 wq->device = pd->device;
85 wq->wq_context = wq_init_attr.wq_context;
86 atomic_set(&wq->usecnt, 0);
87 atomic_inc(&pd->usecnt);
88 atomic_inc(&cq->usecnt);
90 uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_CREATE_WQ_HANDLE);
92 ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_WQ_RESP_MAX_WR,
94 sizeof(wq_init_attr.max_wr));
98 ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_WQ_RESP_MAX_SGE,
99 &wq_init_attr.max_sge,
100 sizeof(wq_init_attr.max_sge));
104 ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_WQ_RESP_WQ_NUM,
110 if (obj->uevent.event_file)
111 uverbs_uobject_put(&obj->uevent.event_file->uobj);
115 DECLARE_UVERBS_NAMED_METHOD(
116 UVERBS_METHOD_WQ_CREATE,
117 UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_WQ_HANDLE,
121 UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_WQ_PD_HANDLE,
125 UVERBS_ATTR_CONST_IN(UVERBS_ATTR_CREATE_WQ_TYPE,
128 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_WQ_USER_HANDLE,
129 UVERBS_ATTR_TYPE(u64),
131 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_WQ_MAX_WR,
132 UVERBS_ATTR_TYPE(u32),
134 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_WQ_MAX_SGE,
135 UVERBS_ATTR_TYPE(u32),
137 UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_CREATE_WQ_FLAGS,
138 enum ib_uverbs_wq_flags,
140 UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_WQ_CQ_HANDLE,
144 UVERBS_ATTR_FD(UVERBS_ATTR_CREATE_WQ_EVENT_FD,
145 UVERBS_OBJECT_ASYNC_EVENT,
148 UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_CREATE_WQ_RESP_MAX_WR,
149 UVERBS_ATTR_TYPE(u32),
151 UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_CREATE_WQ_RESP_MAX_SGE,
152 UVERBS_ATTR_TYPE(u32),
154 UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_CREATE_WQ_RESP_WQ_NUM,
155 UVERBS_ATTR_TYPE(u32),
159 static int UVERBS_HANDLER(UVERBS_METHOD_WQ_DESTROY)(
160 struct uverbs_attr_bundle *attrs)
162 struct ib_uobject *uobj =
163 uverbs_attr_get_uobject(attrs, UVERBS_ATTR_DESTROY_WQ_HANDLE);
164 struct ib_uwq_object *obj =
165 container_of(uobj, struct ib_uwq_object, uevent.uobject);
167 return uverbs_copy_to(attrs, UVERBS_ATTR_DESTROY_WQ_RESP,
168 &obj->uevent.events_reported,
169 sizeof(obj->uevent.events_reported));
172 DECLARE_UVERBS_NAMED_METHOD(
173 UVERBS_METHOD_WQ_DESTROY,
174 UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_WQ_HANDLE,
176 UVERBS_ACCESS_DESTROY,
178 UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_DESTROY_WQ_RESP,
179 UVERBS_ATTR_TYPE(u32),
183 DECLARE_UVERBS_NAMED_OBJECT(
185 UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uwq_object), uverbs_free_wq),
186 &UVERBS_METHOD(UVERBS_METHOD_WQ_CREATE),
187 &UVERBS_METHOD(UVERBS_METHOD_WQ_DESTROY)
190 const struct uapi_definition uverbs_def_obj_wq[] = {
191 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_WQ,
192 UAPI_DEF_OBJ_NEEDS_FN(destroy_wq)),