On Thu, Mar 8, 2018 at 11:45 PM, Jason Gunthorpe <jgg@xxxxxxxx> wrote: > On Thu, Mar 08, 2018 at 09:16:32PM +0000, Ruhl, Michael J wrote: >> > From: linux-rdma-owner@xxxxxxxxxxxxxxx [mailto:linux-rdma- >> > owner@xxxxxxxxxxxxxxx] On Behalf Of Leon Romanovsky >> > Sent: Thursday, March 8, 2018 12:19 PM >> > To: Doug Ledford <dledford@xxxxxxxxxx>; Jason Gunthorpe >> > <jgg@xxxxxxxxxxxx> >> > Cc: Leon Romanovsky <leonro@xxxxxxxxxxxx>; RDMA mailing list <linux- >> > rdma@xxxxxxxxxxxxxxx>; Aviad Yehezkel <aviadye@xxxxxxxxxxxx>; Boris >> > Pismenny <borisp@xxxxxxxxxxxx>; Matan Barak <matanb@xxxxxxxxxxxx>; >> > Yishai Hadas <yishaih@xxxxxxxxxxxx> >> > Subject: [PATCH rdma-next 02/12] IB/uverbs: Move to new headers and >> > make naming consistent >> > >> > From: Matan Barak <matanb@xxxxxxxxxxxx> >> > >> > Use macros to make names consistent in ioctl() uAPI: >> > The ioctl() uAPI works with object-method hierarchy. The method part >> > also states which handler should be executed when this method is called >> > from user-space. Therefore, we need to tie method, method's id, method's >> > handler and the object owning this method together. >> > Previously, this was done through explicit developer chosen names. >> > This makes grepping the code harder. Changing the method's name, >> > method's handler and object's name to be automatically generated based >> > on the ids. >> > >> > The headers are split in a way so they be included and used by >> > user-space. One header strictly contains structures that are used >> > directly by user-space applications, where another header is used for >> > internal library (i.e. libibverbs) to form the ioctl() commands. >> > Other header simply contains the required general command structure. >> > >> > Reviewed-by: Yishai Hadas <yishaih@xxxxxxxxxxxx> >> > Signed-off-by: Matan Barak <matanb@xxxxxxxxxxxx> >> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> >> > drivers/infiniband/core/uverbs_std_types.c | 139 ++++++++++++-------- >> > >> > diff --git a/drivers/infiniband/core/uverbs_std_types.c >> > b/drivers/infiniband/core/uverbs_std_types.c >> > index df1360e6774f..99f971b6cc67 100644 >> > +++ b/drivers/infiniband/core/uverbs_std_types.c >> > @@ -210,15 +210,24 @@ static int >> > uverbs_hot_unplug_completion_event_file(struct ib_uobject_file *uobj_ >> > return 0; >> > }; >> > >> > +#define UVERBS_METHOD(id) uverbs_method_##id >> > +#define UVERBS_HANDLER(id) uverbs_handler_##id >> > + >> > +#define DECLARE_COMMON_METHOD(id, ...) \ >> > + DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, >> > UVERBS_HANDLER(id), ##__VA_ARGS__) >> > + >> > +#define DECLARE_COMMON_OBJECT(id, ...) \ >> > + DECLARE_UVERBS_OBJECT(UVERBS_OBJECT(id), id, >> > ##__VA_ARGS__) >> >> I applied this patch to my tree and noticed that the declarations for the >> METHODS and OBJECTS and HANDLERs had changed. >> >> I assumed that the above macros had been updated in the appropriate >> header files. When I tried to apply these "new" macros to my tree, I couldn't >> compile. >> >> So I cannot (easily) use the example of uverbs_std_verbs.c to set up my own >> stuff, and if I do, I have to copy the above macros to my files, or decipher these >> macros to figure out what I should use. > > Yeah, the normal DECLARE_UVERBS_METHOD/etc should just do this, we shouldn't > wrapper them in uvrebs_std_types.c > Ok, so this is the proposed change: diff --git a/include/rdma/uverbs_named_ioctl.h b/include/rdma/uverbs_named_ioctl.h new file mode 100644 index 000000000000..f9dff179a740 --- /dev/null +++ b/include/rdma/uverbs_named_ioctl.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _UVERBS_NAMED_IOCTL_ +#define _UVERBS_NAMED_IOCTL_ + +#include <rdma/uverbs_ioctl.h> + +#ifndef UVERBS_MODULE_NAME +#error "Please #define UVERBS_MODULE_NAME before including rdma/uverbs_named_ioctl.h" +#endif + +#define _UVERBS_PASTE(x, y) x ## y +#define _UVERBS_NAME(x, y) _UVERBS_PASTE(x, y) +#define UVERBS_METHOD(id) _UVERBS_NAME(UVERBS_MODULE_NAME, _method_##id) +#define UVERBS_HANDLER(id) _UVERBS_NAME(UVERBS_MODULE_NAME, _handler_##id) + +#define DECLARE_NAMED_METHOD(id, ...) \ + DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, UVERBS_HANDLER(id), ##__VA_ARGS__) + +#define DECLARE_NAMED_METHOD_WITH_HANDLER(id, handler, ...) \ + DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, handler, ##__VA_ARGS__) + +#define DECLARE_NAMED_METHOD_NO_HANDLER(id, handler, ...) \ + DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, NULL, ##__VA_ARGS__) + + +#define DECLARE_NAMED_OBJECT(id, ...) \ + DECLARE_UVERBS_OBJECT(UVERBS_OBJECT(id), id, ##__VA_ARGS__) + +#endif In order to use this layer of macros, you'll have to define your module name (UVERBS_MODULE_NAME). The other names follow automatically. I first tried to use KBUILD_MODNAME, but since it's a stringifyed version of our module name, it doesn't work :( Later on I intend to try adding here some easy-to-use macros to declare a parsing tree with one argument (that extends one of the common methods). Are you ok with that? > Jason Matan > -- > 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 -- 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