forked from luck/tmp_suning_uos_patched
IB/uverbs: Expose UAPI to query ucontext
Expose UAPI to query ucontext, this will let user space application that didn't allocate the ucontext but has access to by owning the matching command FD to retrieve the ucontext information. Link: https://lore.kernel.org/r/20200630093916.332097-4-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@nvidia.com>
This commit is contained in:
parent
04c0a5fcfc
commit
1c8fb1ea5a
|
@ -2674,6 +2674,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
|
||||||
SET_DEVICE_OP(dev_ops, query_port);
|
SET_DEVICE_OP(dev_ops, query_port);
|
||||||
SET_DEVICE_OP(dev_ops, query_qp);
|
SET_DEVICE_OP(dev_ops, query_qp);
|
||||||
SET_DEVICE_OP(dev_ops, query_srq);
|
SET_DEVICE_OP(dev_ops, query_srq);
|
||||||
|
SET_DEVICE_OP(dev_ops, query_ucontext);
|
||||||
SET_DEVICE_OP(dev_ops, rdma_netdev_get_params);
|
SET_DEVICE_OP(dev_ops, rdma_netdev_get_params);
|
||||||
SET_DEVICE_OP(dev_ops, read_counters);
|
SET_DEVICE_OP(dev_ops, read_counters);
|
||||||
SET_DEVICE_OP(dev_ops, reg_dm_mr);
|
SET_DEVICE_OP(dev_ops, reg_dm_mr);
|
||||||
|
|
|
@ -229,6 +229,37 @@ static int UVERBS_HANDLER(UVERBS_METHOD_GET_CONTEXT)(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_CONTEXT)(
|
||||||
|
struct uverbs_attr_bundle *attrs)
|
||||||
|
{
|
||||||
|
u64 core_support = IB_UVERBS_CORE_SUPPORT_OPTIONAL_MR_ACCESS;
|
||||||
|
struct ib_ucontext *ucontext;
|
||||||
|
struct ib_device *ib_dev;
|
||||||
|
u32 num_comp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ucontext = ib_uverbs_get_ucontext(attrs);
|
||||||
|
if (IS_ERR(ucontext))
|
||||||
|
return PTR_ERR(ucontext);
|
||||||
|
ib_dev = ucontext->device;
|
||||||
|
|
||||||
|
if (!ib_dev->ops.query_ucontext)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
num_comp = attrs->ufile->device->num_comp_vectors;
|
||||||
|
ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_CONTEXT_NUM_COMP_VECTORS,
|
||||||
|
&num_comp, sizeof(num_comp));
|
||||||
|
if (IS_UVERBS_COPY_ERR(ret))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_CONTEXT_CORE_SUPPORT,
|
||||||
|
&core_support, sizeof(core_support));
|
||||||
|
if (IS_UVERBS_COPY_ERR(ret))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return ucontext->device->ops.query_ucontext(ucontext, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
DECLARE_UVERBS_NAMED_METHOD(
|
DECLARE_UVERBS_NAMED_METHOD(
|
||||||
UVERBS_METHOD_GET_CONTEXT,
|
UVERBS_METHOD_GET_CONTEXT,
|
||||||
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_GET_CONTEXT_NUM_COMP_VECTORS,
|
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_GET_CONTEXT_NUM_COMP_VECTORS,
|
||||||
|
@ -237,6 +268,13 @@ DECLARE_UVERBS_NAMED_METHOD(
|
||||||
UVERBS_ATTR_TYPE(u64), UA_OPTIONAL),
|
UVERBS_ATTR_TYPE(u64), UA_OPTIONAL),
|
||||||
UVERBS_ATTR_UHW());
|
UVERBS_ATTR_UHW());
|
||||||
|
|
||||||
|
DECLARE_UVERBS_NAMED_METHOD(
|
||||||
|
UVERBS_METHOD_QUERY_CONTEXT,
|
||||||
|
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_CONTEXT_NUM_COMP_VECTORS,
|
||||||
|
UVERBS_ATTR_TYPE(u32), UA_OPTIONAL),
|
||||||
|
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_CONTEXT_CORE_SUPPORT,
|
||||||
|
UVERBS_ATTR_TYPE(u64), UA_OPTIONAL));
|
||||||
|
|
||||||
DECLARE_UVERBS_NAMED_METHOD(
|
DECLARE_UVERBS_NAMED_METHOD(
|
||||||
UVERBS_METHOD_INFO_HANDLES,
|
UVERBS_METHOD_INFO_HANDLES,
|
||||||
/* Also includes any device specific object ids */
|
/* Also includes any device specific object ids */
|
||||||
|
@ -260,7 +298,8 @@ DECLARE_UVERBS_GLOBAL_METHODS(UVERBS_OBJECT_DEVICE,
|
||||||
&UVERBS_METHOD(UVERBS_METHOD_GET_CONTEXT),
|
&UVERBS_METHOD(UVERBS_METHOD_GET_CONTEXT),
|
||||||
&UVERBS_METHOD(UVERBS_METHOD_INVOKE_WRITE),
|
&UVERBS_METHOD(UVERBS_METHOD_INVOKE_WRITE),
|
||||||
&UVERBS_METHOD(UVERBS_METHOD_INFO_HANDLES),
|
&UVERBS_METHOD(UVERBS_METHOD_INFO_HANDLES),
|
||||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_PORT));
|
&UVERBS_METHOD(UVERBS_METHOD_QUERY_PORT),
|
||||||
|
&UVERBS_METHOD(UVERBS_METHOD_QUERY_CONTEXT));
|
||||||
|
|
||||||
const struct uapi_definition uverbs_def_obj_device[] = {
|
const struct uapi_definition uverbs_def_obj_device[] = {
|
||||||
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DEVICE),
|
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DEVICE),
|
||||||
|
|
|
@ -2645,6 +2645,10 @@ struct ib_device_ops {
|
||||||
*/
|
*/
|
||||||
int (*fill_stat_mr_entry)(struct sk_buff *msg, struct ib_mr *ibmr);
|
int (*fill_stat_mr_entry)(struct sk_buff *msg, struct ib_mr *ibmr);
|
||||||
|
|
||||||
|
/* query driver for its ucontext properties */
|
||||||
|
int (*query_ucontext)(struct ib_ucontext *context,
|
||||||
|
struct uverbs_attr_bundle *attrs);
|
||||||
|
|
||||||
DECLARE_RDMA_OBJ_SIZE(ib_ah);
|
DECLARE_RDMA_OBJ_SIZE(ib_ah);
|
||||||
DECLARE_RDMA_OBJ_SIZE(ib_cq);
|
DECLARE_RDMA_OBJ_SIZE(ib_cq);
|
||||||
DECLARE_RDMA_OBJ_SIZE(ib_pd);
|
DECLARE_RDMA_OBJ_SIZE(ib_pd);
|
||||||
|
|
|
@ -69,6 +69,7 @@ enum uverbs_methods_device {
|
||||||
UVERBS_METHOD_INFO_HANDLES,
|
UVERBS_METHOD_INFO_HANDLES,
|
||||||
UVERBS_METHOD_QUERY_PORT,
|
UVERBS_METHOD_QUERY_PORT,
|
||||||
UVERBS_METHOD_GET_CONTEXT,
|
UVERBS_METHOD_GET_CONTEXT,
|
||||||
|
UVERBS_METHOD_QUERY_CONTEXT,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum uverbs_attrs_invoke_write_cmd_attr_ids {
|
enum uverbs_attrs_invoke_write_cmd_attr_ids {
|
||||||
|
@ -87,6 +88,11 @@ enum uverbs_attrs_get_context_attr_ids {
|
||||||
UVERBS_ATTR_GET_CONTEXT_CORE_SUPPORT,
|
UVERBS_ATTR_GET_CONTEXT_CORE_SUPPORT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum uverbs_attrs_query_context_attr_ids {
|
||||||
|
UVERBS_ATTR_QUERY_CONTEXT_NUM_COMP_VECTORS,
|
||||||
|
UVERBS_ATTR_QUERY_CONTEXT_CORE_SUPPORT,
|
||||||
|
};
|
||||||
|
|
||||||
enum uverbs_attrs_create_cq_cmd_attr_ids {
|
enum uverbs_attrs_create_cq_cmd_attr_ids {
|
||||||
UVERBS_ATTR_CREATE_CQ_HANDLE,
|
UVERBS_ATTR_CREATE_CQ_HANDLE,
|
||||||
UVERBS_ATTR_CREATE_CQ_CQE,
|
UVERBS_ATTR_CREATE_CQ_CQE,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user