IB/uverbs: Add macros to simplify adding driver specific attributes

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>
This commit is contained in:
Matan Barak 2018-03-19 15:02:39 +02:00 committed by Jason Gunthorpe
parent 41b2a71fc8
commit 3d64addd43

View file

@ -56,4 +56,35 @@
#define DECLARE_UVERBS_NAMED_OBJECT(id, ...) \ #define DECLARE_UVERBS_NAMED_OBJECT(id, ...) \
DECLARE_UVERBS_OBJECT(UVERBS_OBJECT(id), id, ##__VA_ARGS__) 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 #endif