RDMA/uverbs: Require all objects to have a driver destroy function
authorJason Gunthorpe <jgg@mellanox.com>
Mon, 12 Nov 2018 20:59:54 +0000 (22:59 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 22 Nov 2018 18:57:32 +0000 (11:57 -0700)
If we can't destroy the object then we certainly shouldn't allow it be
created or used. Remove it from the uverbs_uapi in this case.

This also disables methods of other objects that have mandatory object
handle inputs - ie REG_DM_MR is now automatically removed if DM objects
cannot be created.

Typically drivers not supporting an interface will mark all of the
supporting functions as NULL, including destroy.

This is intended to automatically eliminate entire corner cases in the API
that are difficult to test.

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/infiniband/core/rdma_core.h
drivers/infiniband/core/uverbs_std_types.c
drivers/infiniband/core/uverbs_std_types_counters.c
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/uverbs_std_types_dm.c
drivers/infiniband/core/uverbs_std_types_flow_action.c
drivers/infiniband/core/uverbs_std_types_mr.c
drivers/infiniband/core/uverbs_uapi.c

index ce042e51fc0069edc21d40b5bd32416dc64a71bd..93da02c12c3872412c33e780d749e803ba9d14cc 100644 (file)
@@ -161,6 +161,11 @@ void uapi_compute_bundle_size(struct uverbs_api_ioctl_method *method_elm,
                              unsigned int num_attrs);
 void uverbs_user_mmap_disassociate(struct ib_uverbs_file *ufile);
 
+extern const struct uapi_definition uverbs_def_obj_counters[];
+extern const struct uapi_definition uverbs_def_obj_cq[];
+extern const struct uapi_definition uverbs_def_obj_dm[];
+extern const struct uapi_definition uverbs_def_obj_flow_action[];
 extern const struct uapi_definition uverbs_def_obj_intf[];
+extern const struct uapi_definition uverbs_def_obj_mr[];
 
 #endif /* RDMA_CORE_H */
index 2db188ed825f95a60d899bdc50556fbb96410177..9e1abeaed57dbf4c67197d9caba8f7a67d0fb08b 100644 (file)
@@ -264,20 +264,26 @@ DECLARE_UVERBS_GLOBAL_METHODS(UVERBS_OBJECT_DEVICE);
 
 const struct uapi_definition uverbs_def_obj_intf[] = {
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DEVICE),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_PD),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_COMP_CHANNEL),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_CQ),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_QP),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_AH),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MW),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_SRQ),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_FLOW),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_WQ),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_RWQ_IND_TBL),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_XRCD),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_FLOW_ACTION),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DM),
-       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_COUNTERS),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_PD,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dealloc_pd)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_COMP_CHANNEL,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dealloc_pd)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_QP,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_qp)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_AH,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_ah)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MW,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dealloc_mw)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_SRQ,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_srq)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_FLOW,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_flow)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_WQ,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_wq)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
+               UVERBS_OBJECT_RWQ_IND_TBL,
+               UAPI_DEF_OBJ_NEEDS_FN(destroy_rwq_ind_table)),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_XRCD,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dealloc_xrcd)),
        {}
 };
index a0ffdcf9a51cd130b8bee57d9a46e3983d4cf27f..c4a78abffc10a3aa95364c60fba426f71c7d7331 100644 (file)
@@ -149,3 +149,9 @@ DECLARE_UVERBS_NAMED_OBJECT(UVERBS_OBJECT_COUNTERS,
                            &UVERBS_METHOD(UVERBS_METHOD_COUNTERS_CREATE),
                            &UVERBS_METHOD(UVERBS_METHOD_COUNTERS_DESTROY),
                            &UVERBS_METHOD(UVERBS_METHOD_COUNTERS_READ));
+
+const struct uapi_definition uverbs_def_obj_counters[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_COUNTERS,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_counters)),
+       {}
+};
index 5b5f2052cd5216c64270391b0db78e847cc2d475..f94fd877867b3a603b21c2b402fbd51808ae5dad 100644 (file)
@@ -207,3 +207,9 @@ DECLARE_UVERBS_NAMED_OBJECT(
        &UVERBS_METHOD(UVERBS_METHOD_CQ_DESTROY)
 #endif
 );
+
+const struct uapi_definition uverbs_def_obj_cq[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_CQ,
+                                     UAPI_DEF_OBJ_NEEDS_FN(destroy_cq)),
+       {}
+};
index edc3ff7733d47d38e6457c924efc85926a6c22ae..c40353331d90353d3f961f4721866e5b5289006e 100644 (file)
@@ -109,3 +109,9 @@ DECLARE_UVERBS_NAMED_OBJECT(UVERBS_OBJECT_DM,
                            UVERBS_TYPE_ALLOC_IDR(uverbs_free_dm),
                            &UVERBS_METHOD(UVERBS_METHOD_DM_ALLOC),
                            &UVERBS_METHOD(UVERBS_METHOD_DM_FREE));
+
+const struct uapi_definition uverbs_def_obj_dm[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DM,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dealloc_dm)),
+       {}
+};
index cb9486ad5c677609bbfc5311c0baba0730c08835..24ac332fc3e0a6fc89797373be392d8967a88109 100644 (file)
@@ -438,3 +438,10 @@ DECLARE_UVERBS_NAMED_OBJECT(
        &UVERBS_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE),
        &UVERBS_METHOD(UVERBS_METHOD_FLOW_ACTION_DESTROY),
        &UVERBS_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY));
+
+const struct uapi_definition uverbs_def_obj_flow_action[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
+               UVERBS_OBJECT_FLOW_ACTION,
+               UAPI_DEF_OBJ_NEEDS_FN(destroy_flow_action)),
+       {}
+};
index cf02e774303e3b2d4dfac0d73acd1ae6f5bf86c1..c400fd382b0fd813edb80681bddafc9b47b03f08 100644 (file)
@@ -147,3 +147,9 @@ DECLARE_UVERBS_NAMED_OBJECT(
        UVERBS_OBJECT_MR,
        UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr),
        &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG));
+
+const struct uapi_definition uverbs_def_obj_mr[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR,
+                                     UAPI_DEF_OBJ_NEEDS_FN(dereg_mr)),
+       {}
+};
index 9a904dd51694a6b0d0f160a03ef3717b1d9a74a8..363a2d25728a4486772f78c562f53aa318d4274e 100644 (file)
@@ -448,7 +448,12 @@ void uverbs_destroy_api(struct uverbs_api *uapi)
 }
 
 static const struct uapi_definition uverbs_core_api[] = {
+       UAPI_DEF_CHAIN(uverbs_def_obj_counters),
+       UAPI_DEF_CHAIN(uverbs_def_obj_cq),
+       UAPI_DEF_CHAIN(uverbs_def_obj_dm),
+       UAPI_DEF_CHAIN(uverbs_def_obj_flow_action),
        UAPI_DEF_CHAIN(uverbs_def_obj_intf),
+       UAPI_DEF_CHAIN(uverbs_def_obj_mr),
        {},
 };