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 40cf071..1900c0d 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 ae4a59d..8e58605 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,
@@ -238,6 +269,13 @@ DECLARE_UVERBS_NAMED_METHOD(
        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 */
        UVERBS_ATTR_CONST_IN(UVERBS_ATTR_INFO_OBJECT_ID,
@@ -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 20c8017..6c72bb1 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 4961d5e..83b6e71 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,