> -----Original Message----- > From: linux-rdma-owner@xxxxxxxxxxxxxxx [mailto:linux-rdma- > owner@xxxxxxxxxxxxxxx] On Behalf Of Leon Romanovsky > Sent: Thursday, March 8, 2018 12:20 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 11/12] IB/uverbs: Expose parsing tree of all > common objects to providers > > From: Matan Barak <matanb@xxxxxxxxxxxx> > > The ioctl() based uverbs is based on merging feature trees. This teaches > the generic parser how to parse methods according to the provider's > support. In order to support merging with the common objects, exporting > the common-object-tree to the provider drivers. > > Reviewed-by: Yishai Hadas <yishaih@xxxxxxxxxxxx> > Signed-off-by: Matan Barak <matanb@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > --- > drivers/infiniband/core/uverbs.h | 16 +++++++++++++ > drivers/infiniband/core/uverbs_std_types.c | 36 +++++++++++++++++------ > ------- > include/rdma/uverbs_std_types.h | 24 ++------------------ > 3 files changed, 39 insertions(+), 37 deletions(-) > > diff --git a/drivers/infiniband/core/uverbs.h > b/drivers/infiniband/core/uverbs.h > index 43e6b2a40741..3a0dfce46411 100644 > --- a/drivers/infiniband/core/uverbs.h > +++ b/drivers/infiniband/core/uverbs.h > @@ -46,6 +46,7 @@ > #include <rdma/ib_verbs.h> > #include <rdma/ib_umem.h> > #include <rdma/ib_user_verbs.h> > +#include <rdma/uverbs_std_types.h> > > static inline void > ib_uverbs_init_udata(struct ib_udata *udata, > @@ -261,6 +262,21 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum > ib_flow_spec_type type, > size_t kern_filter_sz, > union ib_flow_spec *ib_spec); > > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_DEVICE); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_PD); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_MR); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_CQ); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_QP); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_AH); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_MW); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_SRQ); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_FLOW); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_WQ); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_XRCD); > +extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION); > + > #define IB_UVERBS_DECLARE_CMD(name) > \ > ssize_t ib_uverbs_##name(struct ib_uverbs_file *file, \ > struct ib_device *ib_dev, \ > diff --git a/drivers/infiniband/core/uverbs_std_types.c > b/drivers/infiniband/core/uverbs_std_types.c > index 50cd7ed32c4e..80baaea1e114 100644 > --- a/drivers/infiniband/core/uverbs_std_types.c > +++ b/drivers/infiniband/core/uverbs_std_types.c > @@ -794,18 +794,24 @@ DECLARE_COMMON_OBJECT(UVERBS_OBJECT_PD, > > DECLARE_COMMON_OBJECT(UVERBS_OBJECT_DEVICE, NULL); > > -DECLARE_UVERBS_OBJECT_TREE(uverbs_default_objects, > - &UVERBS_OBJECT(UVERBS_OBJECT_DEVICE), > - &UVERBS_OBJECT(UVERBS_OBJECT_PD), > - &UVERBS_OBJECT(UVERBS_OBJECT_MR), > - > &UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL), > - &UVERBS_OBJECT(UVERBS_OBJECT_CQ), > - &UVERBS_OBJECT(UVERBS_OBJECT_QP), > - &UVERBS_OBJECT(UVERBS_OBJECT_AH), > - &UVERBS_OBJECT(UVERBS_OBJECT_MW), > - &UVERBS_OBJECT(UVERBS_OBJECT_SRQ), > - &UVERBS_OBJECT(UVERBS_OBJECT_FLOW), > - &UVERBS_OBJECT(UVERBS_OBJECT_WQ), > - > &UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL), > - &UVERBS_OBJECT(UVERBS_OBJECT_XRCD), > - > &UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION)); > +static DECLARE_UVERBS_OBJECT_TREE(uverbs_default_objects, > + > &UVERBS_OBJECT(UVERBS_OBJECT_DEVICE), > + &UVERBS_OBJECT(UVERBS_OBJECT_PD), > + &UVERBS_OBJECT(UVERBS_OBJECT_MR), > + > &UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL), > + &UVERBS_OBJECT(UVERBS_OBJECT_CQ), > + &UVERBS_OBJECT(UVERBS_OBJECT_QP), > + &UVERBS_OBJECT(UVERBS_OBJECT_AH), > + &UVERBS_OBJECT(UVERBS_OBJECT_MW), > + &UVERBS_OBJECT(UVERBS_OBJECT_SRQ), > + &UVERBS_OBJECT(UVERBS_OBJECT_FLOW), > + &UVERBS_OBJECT(UVERBS_OBJECT_WQ), > + > &UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL), > + &UVERBS_OBJECT(UVERBS_OBJECT_XRCD), > + > &UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION)); > + > +const struct uverbs_object_tree_def *uverbs_default_get_objects(void) > +{ > + return &uverbs_default_objects; > +} > +EXPORT_SYMBOL_GPL(uverbs_default_get_objects); I found that in order to use the: UVERBS_TYPE_ALLOC_IDR() and UVERBS_TYPE_ALLOC_FDR() ALLOC types, I also needed to export (at a minimum): EXPORT_SYMBOL(uverbs_idr_class); EXPORT_SYMBOL(uverbs_fd_class); EXPORT_SYMBOL(uverbs_close_fd); If this is going to be "enabled", these symbols should be considered as well. Thanks, Mike > diff --git a/include/rdma/uverbs_std_types.h > b/include/rdma/uverbs_std_types.h > index e93bd7e1f1a0..9d56cdb84655 100644 > --- a/include/rdma/uverbs_std_types.h > +++ b/include/rdma/uverbs_std_types.h > @@ -37,30 +37,10 @@ > #include <rdma/uverbs_ioctl.h> > #include <rdma/ib_user_ioctl_verbs.h> > > -#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS) > - > #define UVERBS_OBJECT(id) uverbs_object_##id > > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_DEVICE); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_PD); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_MR); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_CQ); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_QP); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_AH); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_MW); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_SRQ); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_FLOW); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_WQ); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_XRCD); > -extern const struct uverbs_object_def > UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION); > - > -extern const struct uverbs_object_tree_def uverbs_default_objects; > -static inline const struct uverbs_object_tree_def > *uverbs_default_get_objects(void) > -{ > - return &uverbs_default_objects; > -} > +#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS) > +const struct uverbs_object_tree_def *uverbs_default_get_objects(void); > #else > static inline const struct uverbs_object_tree_def > *uverbs_default_get_objects(void) > { > -- > 2.16.2 > > -- > 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