IB/uverbs: Expose UAPI to query MR
authorYishai Hadas <yishaih@mellanox.com>
Tue, 30 Jun 2020 09:39:16 +0000 (12:39 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 6 Jul 2020 22:50:34 +0000 (19:50 -0300)
Expose UAPI to query MR, this will let user space application that
didn't allocate the MR but has access to by owning the matching command
FD to retrieve its information.

Link: https://lore.kernel.org/r/20200630093916.332097-8-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_std_types_mr.c
include/uapi/rdma/ib_user_ioctl_cmds.h

index a2722ef8496e9a03bf40c574e0f882c62c674d36..62f58ad56afd554aa48074086f6b71456e9fccd7 100644 (file)
@@ -148,6 +148,36 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(
        return ret;
 }
 
+static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_MR)(
+       struct uverbs_attr_bundle *attrs)
+{
+       struct ib_mr *mr =
+               uverbs_attr_get_obj(attrs, UVERBS_ATTR_QUERY_MR_HANDLE);
+       int ret;
+
+       ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_LKEY, &mr->lkey,
+                            sizeof(mr->lkey));
+       if (ret)
+               return ret;
+
+       ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_RKEY,
+                            &mr->rkey, sizeof(mr->rkey));
+
+       if (ret)
+               return ret;
+
+       ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_LENGTH,
+                            &mr->length, sizeof(mr->length));
+
+       if (ret)
+               return ret;
+
+       ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_IOVA,
+                            &mr->iova, sizeof(mr->iova));
+
+       return IS_UVERBS_COPY_ERR(ret) ? ret : 0;
+}
+
 DECLARE_UVERBS_NAMED_METHOD(
        UVERBS_METHOD_ADVISE_MR,
        UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE,
@@ -165,6 +195,25 @@ DECLARE_UVERBS_NAMED_METHOD(
                           UA_MANDATORY,
                           UA_ALLOC_AND_COPY));
 
+DECLARE_UVERBS_NAMED_METHOD(
+       UVERBS_METHOD_QUERY_MR,
+       UVERBS_ATTR_IDR(UVERBS_ATTR_QUERY_MR_HANDLE,
+                       UVERBS_OBJECT_MR,
+                       UVERBS_ACCESS_READ,
+                       UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_RKEY,
+                           UVERBS_ATTR_TYPE(u32),
+                           UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_LKEY,
+                           UVERBS_ATTR_TYPE(u32),
+                           UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_LENGTH,
+                           UVERBS_ATTR_TYPE(u64),
+                           UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_IOVA,
+                           UVERBS_ATTR_TYPE(u64),
+                           UA_OPTIONAL));
+
 DECLARE_UVERBS_NAMED_METHOD(
        UVERBS_METHOD_DM_MR_REG,
        UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DM_MR_HANDLE,
@@ -206,7 +255,8 @@ DECLARE_UVERBS_NAMED_OBJECT(
        UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr),
        &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG),
        &UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY),
-       &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR));
+       &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR),
+       &UVERBS_METHOD(UVERBS_METHOD_QUERY_MR));
 
 const struct uapi_definition uverbs_def_obj_mr[] = {
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR,
index 83b6e71ea216971487816c8198d26f650eec5b85..99dcabf61a7111707a4ecfa15ec5d432b6f9d051 100644 (file)
@@ -248,6 +248,7 @@ enum uverbs_methods_mr {
        UVERBS_METHOD_DM_MR_REG,
        UVERBS_METHOD_MR_DESTROY,
        UVERBS_METHOD_ADVISE_MR,
+       UVERBS_METHOD_QUERY_MR,
 };
 
 enum uverbs_attrs_mr_destroy_ids {
@@ -261,6 +262,14 @@ enum uverbs_attrs_advise_mr_cmd_attr_ids {
        UVERBS_ATTR_ADVISE_MR_SGE_LIST,
 };
 
+enum uverbs_attrs_query_mr_cmd_attr_ids {
+       UVERBS_ATTR_QUERY_MR_HANDLE,
+       UVERBS_ATTR_QUERY_MR_RESP_LKEY,
+       UVERBS_ATTR_QUERY_MR_RESP_RKEY,
+       UVERBS_ATTR_QUERY_MR_RESP_LENGTH,
+       UVERBS_ATTR_QUERY_MR_RESP_IOVA,
+};
+
 enum uverbs_attrs_create_counters_cmd_attr_ids {
        UVERBS_ATTR_CREATE_COUNTERS_HANDLE,
 };