IB/uverbs: Expose UAPI to query ucontext
authorYishai Hadas <yishaih@mellanox.com>
Tue, 30 Jun 2020 09:39:12 +0000 (12:39 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 6 Jul 2020 22:50:33 +0000 (19:50 -0300)
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>
drivers/infiniband/core/device.c
drivers/infiniband/core/uverbs_std_types_device.c
include/rdma/ib_verbs.h
include/uapi/rdma/ib_user_ioctl_cmds.h

index 40cf07129f662bd19f3ef4edba300f62804b9c23..1900c0df3c8a975e9e09b3a951cd6169925a14b2 100644 (file)
@@ -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_qp);
        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, read_counters);
        SET_DEVICE_OP(dev_ops, reg_dm_mr);
index ae4a59d6f9b14558c8760b1880b53f7cbd1f2ff4..8e58605a17be4e56d1e6f8b83486995dc197738f 100644 (file)
@@ -229,6 +229,37 @@ static int UVERBS_HANDLER(UVERBS_METHOD_GET_CONTEXT)(
        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(
        UVERBS_METHOD_GET_CONTEXT,
        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_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(
        UVERBS_METHOD_INFO_HANDLES,
        /* 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_INVOKE_WRITE),
                              &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[] = {
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DEVICE),
index 20c801730fed17419aabab9de37a9228fdc4fd5e..6c72bb194148784105c4f1a9c2fc694b845752c9 100644 (file)
@@ -2645,6 +2645,10 @@ struct ib_device_ops {
         */
        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_cq);
        DECLARE_RDMA_OBJ_SIZE(ib_pd);
index 4961d5e858eb577a7aeb16247eb8d00baed53929..83b6e71ea216971487816c8198d26f650eec5b85 100644 (file)
@@ -69,6 +69,7 @@ enum uverbs_methods_device {
        UVERBS_METHOD_INFO_HANDLES,
        UVERBS_METHOD_QUERY_PORT,
        UVERBS_METHOD_GET_CONTEXT,
+       UVERBS_METHOD_QUERY_CONTEXT,
 };
 
 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,
 };
 
+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 {
        UVERBS_ATTR_CREATE_CQ_HANDLE,
        UVERBS_ATTR_CREATE_CQ_CQE,