Re: [PATCH rdma-next 11/12] IB/uverbs: Expose parsing tree of all common objects to providers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux