OSDN Git Service

RDMA/uverbs: Simplify method definition macros
authorJason Gunthorpe <jgg@mellanox.com>
Wed, 4 Jul 2018 05:50:26 +0000 (08:50 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 4 Jul 2018 19:47:01 +0000 (13:47 -0600)
Instead of the large set of indirecting macros, define the few needed
macros to directly instantiate the struct uverbs_method_def and associated
attributes list.

This is small amount of code duplication but the readability is far
better.

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
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/hw/mlx5/devx.c
include/rdma/uverbs_ioctl.h
include/rdma/uverbs_named_ioctl.h

index 6d0b1ce..61fd65b 100644 (file)
@@ -124,21 +124,20 @@ err_read:
        return ret;
 }
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_COUNTERS_CREATE,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_COUNTERS_CREATE,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_COUNTERS_HANDLE,
                         UVERBS_OBJECT_COUNTERS,
                         UVERBS_ACCESS_NEW,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(UVERBS_METHOD_COUNTERS_DESTROY,
-       uverbs_destroy_def_handler,
+DECLARE_UVERBS_NAMED_METHOD_DESTROY(UVERBS_METHOD_COUNTERS_DESTROY,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_COUNTERS_HANDLE,
                         UVERBS_OBJECT_COUNTERS,
                         UVERBS_ACCESS_DESTROY,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
 #define MAX_COUNTERS_BUFF_SIZE USHRT_MAX
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_COUNTERS_READ,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_COUNTERS_READ,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_READ_COUNTERS_HANDLE,
                         UVERBS_OBJECT_COUNTERS,
                         UVERBS_ACCESS_READ,
index f67b089..ca0f6a7 100644 (file)
@@ -147,7 +147,7 @@ err_event_file:
        return ret;
 };
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_CQ_CREATE,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_CQ_CREATE,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_CQ_HANDLE, UVERBS_OBJECT_CQ,
                         UVERBS_ACCESS_NEW,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
@@ -196,7 +196,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(struct ib_device *ib_dev,
                              sizeof(resp));
 }
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_CQ_DESTROY,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_CQ_DESTROY,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_CQ_HANDLE, UVERBS_OBJECT_CQ,
                         UVERBS_ACCESS_DESTROY,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
index d294660..75ac20b 100644 (file)
@@ -85,7 +85,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)(struct ib_device *ib_dev,
        return 0;
 }
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_ALLOC,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_ALLOC,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_ALLOC_DM_HANDLE, UVERBS_OBJECT_DM,
                         UVERBS_ACCESS_NEW,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
@@ -96,8 +96,7 @@ static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_ALLOC,
                            UVERBS_ATTR_TYPE(u32),
                            UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(UVERBS_METHOD_DM_FREE,
-       uverbs_destroy_def_handler,
+DECLARE_UVERBS_NAMED_METHOD_DESTROY(UVERBS_METHOD_DM_FREE,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_FREE_DM_HANDLE,
                         UVERBS_OBJECT_DM,
                         UVERBS_ACCESS_DESTROY,
index 1ba55d4..1a572bd 100644 (file)
@@ -385,7 +385,7 @@ static const struct uverbs_attr_spec uverbs_flow_action_esp_replay[] = {
        },
 };
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_FLOW_ACTION_ESP_HANDLE,
                         UVERBS_OBJECT_FLOW_ACTION,
                         UVERBS_ACCESS_NEW,
@@ -403,7 +403,7 @@ static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE,
        &UVERBS_ATTR_PTR_IN(UVERBS_ATTR_FLOW_ACTION_ESP_ENCAP,
                            UVERBS_ATTR_STRUCT(struct ib_uverbs_flow_action_esp_encap, type)));
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_MODIFY_FLOW_ACTION_ESP_HANDLE,
                         UVERBS_OBJECT_FLOW_ACTION,
                         UVERBS_ACCESS_WRITE,
@@ -419,8 +419,7 @@ static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY,
        &UVERBS_ATTR_PTR_IN(UVERBS_ATTR_FLOW_ACTION_ESP_ENCAP,
                            UVERBS_ATTR_STRUCT(struct ib_uverbs_flow_action_esp_encap, type)));
 
-static DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(UVERBS_METHOD_FLOW_ACTION_DESTROY,
-       uverbs_destroy_def_handler,
+DECLARE_UVERBS_NAMED_METHOD_DESTROY(UVERBS_METHOD_FLOW_ACTION_DESTROY,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_FLOW_ACTION_HANDLE,
                         UVERBS_OBJECT_FLOW_ACTION,
                         UVERBS_ACCESS_DESTROY,
index d7f7ba3..0366814 100644 (file)
@@ -115,7 +115,7 @@ err_dereg:
        return ret;
 }
 
-static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_MR_REG,
+DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_MR_REG,
        &UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DM_MR_HANDLE, UVERBS_OBJECT_MR,
                         UVERBS_ACCESS_NEW,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
index 2f75edc..ecd0900 100644 (file)
@@ -984,7 +984,7 @@ static int devx_umem_cleanup(struct ib_uobject *uobject,
        return 0;
 }
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_UMEM_REG,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_UMEM_REG,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE,
                         MLX5_IB_OBJECT_DEVX_UMEM,
                         UVERBS_ACCESS_NEW,
@@ -998,25 +998,25 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_UMEM_REG,
        &UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID, UVERBS_ATTR_TYPE(u32),
                             UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_UMEM_DEREG,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_UMEM_DEREG,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_DEREG_HANDLE,
                         MLX5_IB_OBJECT_DEVX_UMEM,
                         UVERBS_ACCESS_DESTROY,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_EQN,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_EQN,
        &UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC, UVERBS_ATTR_TYPE(u32),
                            UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
        &UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_EQN_DEV_EQN, UVERBS_ATTR_TYPE(u32),
                             UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR,
        &UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX, UVERBS_ATTR_TYPE(u32),
                            UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
        &UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX, UVERBS_ATTR_TYPE(u32),
                             UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
        &UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
                            UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
                            UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
@@ -1028,7 +1028,7 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
                                      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO))
 );
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE,
                         MLX5_IB_OBJECT_DEVX_OBJ,
                         UVERBS_ACCESS_NEW,
@@ -1043,13 +1043,13 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
                             UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
                                      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE,
                         MLX5_IB_OBJECT_DEVX_OBJ,
                         UVERBS_ACCESS_DESTROY,
                         UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE,
                         MLX5_IB_OBJECT_DEVX_OBJ,
                         UVERBS_ACCESS_WRITE,
@@ -1064,7 +1064,7 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
                             UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
                                      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
 
-static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY,
+DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY,
        &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE,
                         MLX5_IB_OBJECT_DEVX_OBJ,
                         UVERBS_ACCESS_READ,
index a7246e9..12fa0ee 100644 (file)
@@ -258,24 +258,6 @@ struct uverbs_object_tree_def {
  *     Declaration helpers
  * =======================================
  */
-#define _UVERBS_METHOD_ATTRS_SZ(...)                                   \
-       (sizeof((const struct uverbs_attr_def * const []){__VA_ARGS__}) /\
-        sizeof(const struct uverbs_attr_def *))
-#define _UVERBS_METHOD(_id, _handler, _flags, ...)                     \
-       ((const struct uverbs_method_def) {                             \
-        .id = _id,                                                     \
-        .flags = _flags,                                               \
-        .handler = _handler,                                           \
-        .num_attrs = _UVERBS_METHOD_ATTRS_SZ(__VA_ARGS__),             \
-        .attrs = &(const struct uverbs_attr_def * const []){__VA_ARGS__} })
-#define DECLARE_UVERBS_METHOD(_name, _id, _handler, ...)               \
-       const struct uverbs_method_def _name =                          \
-               _UVERBS_METHOD(_id, _handler, 0, ##__VA_ARGS__)
-#define DECLARE_UVERBS_CTX_METHOD(_name, _id, _handler, _flags, ...)   \
-       const struct uverbs_method_def _name =                          \
-               _UVERBS_METHOD(_id, _handler,                           \
-                              UVERBS_ACTION_FLAG_CREATE_ROOT,          \
-                              ##__VA_ARGS__)
 #define _UVERBS_OBJECT_METHODS_SZ(...)                                 \
        (sizeof((const struct uverbs_method_def * const []){__VA_ARGS__}) / \
         sizeof(const struct uverbs_method_def *))
index 228421f..06eac48 100644 (file)
 #define UVERBS_HANDLER(id)     _UVERBS_NAME(UVERBS_MODULE_NAME, _handler_##id)
 #define UVERBS_OBJECT(id)      _UVERBS_NAME(UVERBS_MOUDLE_NAME, _object_##id)
 
-#define DECLARE_UVERBS_NAMED_METHOD(id, ...)   \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, UVERBS_HANDLER(id), ##__VA_ARGS__)
+#define UVERBS_METHOD_ATTRS(id)                                                \
+       _UVERBS_NAME(UVERBS_MODULE_NAME, _method_attrs_##id)
 
-#define DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(id, handler, ...)     \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, handler, ##__VA_ARGS__)
+#define DECLARE_UVERBS_NAMED_METHOD(_method_id, ...)                           \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { __VA_ARGS__ };                               \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .handler = UVERBS_HANDLER(_method_id),                         \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       }
 
-#define DECLARE_UVERBS_NAMED_METHOD_NO_OVERRIDE(id, handler, ...)      \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, NULL, ##__VA_ARGS__)
+/* Create a standard destroy method using the default handler. The handle_attr
+ * argument must be the attribute specifying the handle to destroy, the
+ * default handler does not support any other attributes.
+ */
+#define DECLARE_UVERBS_NAMED_METHOD_DESTROY(_method_id, _handle_attr)          \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { _handle_attr };                              \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .handler = uverbs_destroy_def_handler,                         \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       }
 
 #define DECLARE_UVERBS_NAMED_OBJECT(id, ...)   \
        DECLARE_UVERBS_OBJECT(UVERBS_OBJECT(id), id, ##__VA_ARGS__)
 
 #define _UVERBS_COMP_NAME(x, y, z) _UVERBS_NAME(_UVERBS_NAME(x, y), z)
 
-#define UVERBS_NO_OVERRIDE     NULL
-
-/* This declares a parsing tree with one object and one method. This is usually
- * used for merging driver attributes to the common attributes. The driver has
- * a chance to override the handler and type attrs of the original object.
- * The __VA_ARGS__ just contains a list of attributes.
- */
-#define ADD_UVERBS_ATTRIBUTES(_name, _object, _method, _type_attrs, _handler, ...) \
-static DECLARE_UVERBS_METHOD(_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _method_, _name),             \
-                            _method, _handler, ##__VA_ARGS__);              \
-                                                                            \
-static DECLARE_UVERBS_OBJECT(_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _object_, _name),             \
-                            _object, _type_attrs,                           \
-                            &_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _method_, _name));            \
-                                                                            \
-static DECLARE_UVERBS_OBJECT_TREE(_name,                                    \
-                                 &_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,     \
-                                                    _object_, _name))
-
-/* A very common use case is that the driver doesn't override the handler and
- * type_attrs. Therefore, we provide a simplified macro for this common case.
+/* Used by drivers to declare a complete parsing tree for a single method that
+ * differs only in having additional driver specific attributes.
  */
-#define ADD_UVERBS_ATTRIBUTES_SIMPLE(_name, _object, _method, ...)          \
-       ADD_UVERBS_ATTRIBUTES(_name, _object, _method, UVERBS_NO_OVERRIDE,   \
-                             UVERBS_NO_OVERRIDE, ##__VA_ARGS__)
+#define ADD_UVERBS_ATTRIBUTES_SIMPLE(_name, _object_id, _method_id, ...)       \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { __VA_ARGS__ };                               \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       };                                                                     \
+       static DECLARE_UVERBS_OBJECT(                                          \
+               _UVERBS_COMP_NAME(UVERBS_MODULE_NAME, _object_id, _name),      \
+               _object_id, NULL, &UVERBS_METHOD(_method_id));                 \
+       static DECLARE_UVERBS_OBJECT_TREE(                                     \
+               _name,                                                         \
+               &_UVERBS_COMP_NAME(UVERBS_MODULE_NAME, _object_id, _name))
 
 #endif