Commit cda9ee49 authored by Yishai Hadas's avatar Yishai Hadas Committed by Jason Gunthorpe

IB/uverbs: Extend CQ to get its own asynchronous event FD

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.

Link: https://lore.kernel.org/r/20200519072711.257271-4-leon@kernel.orgSigned-off-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 98a8890f
...@@ -297,6 +297,24 @@ static inline u32 make_port_cap_flags(const struct ib_port_attr *attr) ...@@ -297,6 +297,24 @@ static inline u32 make_port_cap_flags(const struct ib_port_attr *attr)
return res; 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 = READ_ONCE(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, void copy_port_attr_to_resp(struct ib_port_attr *attr,
struct ib_uverbs_query_port_resp *resp, struct ib_uverbs_query_port_resp *resp,
......
...@@ -100,9 +100,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( ...@@ -100,9 +100,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
uverbs_uobject_get(ev_file_uobj); uverbs_uobject_get(ev_file_uobj);
} }
obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file); obj->uevent.event_file = ib_uverbs_get_async_event(
if (obj->uevent.event_file) attrs, UVERBS_ATTR_CREATE_CQ_EVENT_FD);
uverbs_uobject_get(&obj->uevent.event_file->uobj);
if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) { if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) {
ret = -EINVAL; ret = -EINVAL;
...@@ -173,6 +172,10 @@ DECLARE_UVERBS_NAMED_METHOD( ...@@ -173,6 +172,10 @@ DECLARE_UVERBS_NAMED_METHOD(
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_CREATE_CQ_RESP_CQE, UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_CREATE_CQ_RESP_CQE,
UVERBS_ATTR_TYPE(u32), UVERBS_ATTR_TYPE(u32),
UA_MANDATORY), UA_MANDATORY),
UVERBS_ATTR_FD(UVERBS_ATTR_CREATE_CQ_EVENT_FD,
UVERBS_OBJECT_ASYNC_EVENT,
UVERBS_ACCESS_READ,
UA_OPTIONAL),
UVERBS_ATTR_UHW()); UVERBS_ATTR_UHW());
static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)( static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(
......
...@@ -95,6 +95,7 @@ enum uverbs_attrs_create_cq_cmd_attr_ids { ...@@ -95,6 +95,7 @@ enum uverbs_attrs_create_cq_cmd_attr_ids {
UVERBS_ATTR_CREATE_CQ_COMP_VECTOR, UVERBS_ATTR_CREATE_CQ_COMP_VECTOR,
UVERBS_ATTR_CREATE_CQ_FLAGS, UVERBS_ATTR_CREATE_CQ_FLAGS,
UVERBS_ATTR_CREATE_CQ_RESP_CQE, UVERBS_ATTR_CREATE_CQ_RESP_CQE,
UVERBS_ATTR_CREATE_CQ_EVENT_FD,
}; };
enum uverbs_attrs_destroy_cq_cmd_attr_ids { enum uverbs_attrs_destroy_cq_cmd_attr_ids {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment