On Sun, Jul 01, 2018 at 05:38:26PM +0300, Yishai Hadas wrote: > On 6/26/2018 1:12 AM, Jason Gunthorpe wrote: > >From: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > > > >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@xxxxxxxxxxxx> > > .../core/uverbs_std_types_counters.c | 7 +- > > drivers/infiniband/core/uverbs_std_types_cq.c | 4 +- > > drivers/infiniband/core/uverbs_std_types_dm.c | 5 +- > > .../core/uverbs_std_types_flow_action.c | 7 +- > > drivers/infiniband/core/uverbs_std_types_mr.c | 2 +- > > drivers/infiniband/hw/mlx5/devx.c | 18 ++--- > > include/rdma/uverbs_ioctl.h | 18 ----- > > include/rdma/uverbs_named_ioctl.h | 73 ++++++++++--------- > > 8 files changed, 60 insertions(+), 74 deletions(-) > > > >diff --git a/include/rdma/uverbs_named_ioctl.h b/include/rdma/uverbs_named_ioctl.h > >index 228421f2a427b6..06eac48ec4f233 100644 > >+++ b/include/rdma/uverbs_named_ioctl.h > >@@ -45,14 +45,32 @@ > > #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__) > >@@ -62,33 +80,22 @@ > > #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)) > >- > > This patch removes the above macro which enables drivers to add a method > with given attributes to an existing object. We are in progress in other > series to use this functionality, let's please don't delete it without > supplying an alternative macro for that. Yes.. The patch below looked like the right direction, lets review it as part of a series that introduces a user please. Jason -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html