On Fri, Mar 9, 2018 at 2:59 PM, Ruhl, Michael J <michael.j.ruhl@xxxxxxxxx> wrote: >> -----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. > Yep, this is correct. I generally try to expose symbols only if they have an actual using module, but since this is a basic infrastructure, maybe we could add this code now. What do you think? > Thanks, > > Mike > Regards, Matan >> 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 -- 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