RDMA/mlx5: Implement the query ucontext functionality
authorYishai Hadas <yishaih@mellanox.com>
Tue, 30 Jun 2020 09:39:14 +0000 (12:39 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 6 Jul 2020 22:50:33 +0000 (19:50 -0300)
Implement the query ucontext functionality by returning the original
ucontext data as part of an extra mlx5 attribute that holds the driver
UAPI response.

Link: https://lore.kernel.org/r/20200630093916.332097-6-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/uverbs_ioctl.c
drivers/infiniband/hw/mlx5/main.c
include/uapi/rdma/mlx5_user_ioctl_cmds.h

index 2d882c0..ef04a26 100644 (file)
@@ -790,6 +790,7 @@ int uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
        }
        return uverbs_copy_to(bundle, idx, from, size);
 }
+EXPORT_SYMBOL(uverbs_copy_to_struct_or_zero);
 
 /* Once called an abort will call through to the type's destroy_hw() */
 void uverbs_finalize_uobj_create(const struct uverbs_attr_bundle *bundle,
index 56039fa..dc77388 100644 (file)
@@ -1990,6 +1990,29 @@ out_ctx:
        return err;
 }
 
+static int mlx5_ib_query_ucontext(struct ib_ucontext *ibcontext,
+                                 struct uverbs_attr_bundle *attrs)
+{
+       struct mlx5_ib_alloc_ucontext_resp uctx_resp = {};
+       int ret;
+
+       ret = set_ucontext_resp(ibcontext, &uctx_resp);
+       if (ret)
+               return ret;
+
+       uctx_resp.response_length =
+               min_t(size_t,
+                     uverbs_attr_get_len(attrs,
+                               MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX),
+                     sizeof(uctx_resp));
+
+       ret = uverbs_copy_to_struct_or_zero(attrs,
+                                       MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX,
+                                       &uctx_resp,
+                                       sizeof(uctx_resp));
+       return ret;
+}
+
 static void mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
 {
        struct mlx5_ib_ucontext *context = to_mucontext(ibcontext);
@@ -6364,6 +6387,16 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE(
        UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_CREATE_FLOW_ACTION_FLAGS,
                             enum mlx5_ib_uapi_flow_action_flags));
 
+ADD_UVERBS_ATTRIBUTES_SIMPLE(
+       mlx5_ib_query_context,
+       UVERBS_OBJECT_DEVICE,
+       UVERBS_METHOD_QUERY_CONTEXT,
+       UVERBS_ATTR_PTR_OUT(
+               MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX,
+               UVERBS_ATTR_STRUCT(struct mlx5_ib_alloc_ucontext_resp,
+                                  dump_fill_mkey),
+               UA_MANDATORY));
+
 static const struct uapi_definition mlx5_ib_defs[] = {
        UAPI_DEF_CHAIN(mlx5_ib_devx_defs),
        UAPI_DEF_CHAIN(mlx5_ib_flow_defs),
@@ -6372,6 +6405,7 @@ static const struct uapi_definition mlx5_ib_defs[] = {
        UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
                                &mlx5_ib_flow_action),
        UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DM, &mlx5_ib_dm),
+       UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DEVICE, &mlx5_ib_query_context),
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_VAR,
                                UAPI_DEF_IS_OBJ_SUPPORTED(var_is_supported)),
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_UAR),
@@ -6605,6 +6639,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops = {
        .query_pkey = mlx5_ib_query_pkey,
        .query_qp = mlx5_ib_query_qp,
        .query_srq = mlx5_ib_query_srq,
+       .query_ucontext = mlx5_ib_query_ucontext,
        .read_counters = mlx5_ib_read_counters,
        .reg_user_mr = mlx5_ib_reg_user_mr,
        .req_notify_cq = mlx5_ib_arm_cq,
index 8e316ef..496309e 100644 (file)
@@ -228,6 +228,10 @@ enum mlx5_ib_flow_matcher_methods {
        MLX5_IB_METHOD_FLOW_MATCHER_DESTROY,
 };
 
+enum mlx5_ib_device_query_context_attrs {
+       MLX5_IB_ATTR_QUERY_CONTEXT_RESP_UCTX = (1U << UVERBS_ID_NS_SHIFT),
+};
+
 #define MLX5_IB_DW_MATCH_PARAM 0x80
 
 struct mlx5_ib_match_params {