IB/uverbs: Add macros to simplify adding driver specific attributes
authorMatan Barak <matanb@mellanox.com>
Mon, 19 Mar 2018 13:02:39 +0000 (15:02 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 19 Mar 2018 20:45:17 +0000 (14:45 -0600)
Previously, adding driver specific attributes required drivers to
declare all the hierarchy - object tree, object, methods and the
attributes themselves. A common use case is adding a few attributes to
an existing common method.
In order to simplify the driver's code, we add some macros to do all
these declarations automatically.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
include/rdma/uverbs_named_ioctl.h

index a7f0565ca784db50e39b6e64fece29992258519c..c5bb4ebdb0b0ddbefdfb5df20491d07f708eed53 100644 (file)
 #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.
+ */
+#define ADD_UVERBS_ATTRIBUTES_SIMPLE(_name, _object, _method, ...)          \
+       ADD_UVERBS_ATTRIBUTES(_name, _object, _method, UVERBS_NO_OVERRIDE,   \
+                             UVERBS_NO_OVERRIDE, ##__VA_ARGS__)
+
 #endif