Re: [PATCH rdma-next v3 17/19] RDMA/core: Share driver structure size with core

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

 



On Thu, Jan 31, 2019 at 09:02:19AM -0700, Jason Gunthorpe wrote:
> On Thu, Jan 31, 2019 at 11:40:31AM +0200, Leon Romanovsky wrote:
> > On Wed, Jan 30, 2019 at 09:37:05PM -0700, Jason Gunthorpe wrote:
> > > On Wed, Jan 30, 2019 at 12:49:09PM +0200, Leon Romanovsky wrote:
> > > > From: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> > > >
> > > > Add new macros to be used in drivers while registering ops structure
> > > > and IB/core while calling allocation routines, so drivers won't need
> > > > to perform kzalloc/kfree in their paths.
> > > >
> > > > The change in allocation stage allows us to initialize common fields
> > > > prior to calling to drivers (e.g. restrack).
> > > >
> > > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> > > >  drivers/infiniband/core/device.c |  2 ++
> > > >  include/rdma/ib_verbs.h          | 13 +++++++++++++
> > > >  2 files changed, 15 insertions(+)
> > > >
> > > > diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
> > > > index d13491b416dc..c332398376fc 100644
> > > > +++ b/drivers/infiniband/core/device.c
> > > > @@ -1221,6 +1221,8 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
> > > >  				(ptr)->name = ops->name;                       \
> > > >  	} while (0)
> > > >
> > > > +#define SET_OBJ_SIZE(ptr, name) SET_DEVICE_OP(ptr, size_##name)
> > > > +
> > > >  	SET_DEVICE_OP(dev_ops, add_gid);
> > > >  	SET_DEVICE_OP(dev_ops, advise_mr);
> > > >  	SET_DEVICE_OP(dev_ops, alloc_dm);
> > > > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> > > > index d54c87640f89..4423de3b3738 100644
> > > > +++ b/include/rdma/ib_verbs.h
> > > > @@ -2264,6 +2264,19 @@ struct ib_counters_read_attr {
> > > >
> > > >  struct uverbs_attr_bundle;
> > > >
> > > > +#define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member)                      \
> > > > +	.size_##ib_struct =                                                    \
> > > > +		(sizeof(struct drv_struct) +                                   \
> > > > +		 BUILD_BUG_ON_ZERO(offsetof(struct drv_struct, member)) +      \
> > > > +		 BUILD_BUG_ON_ZERO(                                            \
> > > > +			 !__same_type(((struct drv_struct *)NULL)->member,     \
> > > > +				      struct ib_struct)))
> > > > +
> > > > +#define rdma_zalloc_drv_obj(ib_dev, ib_type)                                   \
> > > > +	kzalloc(ib_dev->ops.size_##ib_type, GFP_KERNEL)
> > >
> > > Since we know the type, this should cast to the ib struct:
> > >
> > >   ((struct ib_type *)kzalloc(...))
> >
> > No, it is useless to cast (void*), both checkpatch, C standard and C FAQ
> > are not agree with you. I prefer to follow C standard here and not to
> > cast.
>
> No, you are mixing the advice of not open coding
>    pd = (struct ib_pd *)kzalloc()
>
> in a caller with an API design that should be type safe.
>
> The macro is an API, as such it should, as much as possible, take
> fixed types as inputs and outputs, to make it type-safe.
>
> You wouldn't return void * from a function if you know that the type
> is really ib_pd.
>
> This is the same reason that container_of casts its output rather than
> just returning void *

Jason,

I disagree with you, but will change it to make this patchset moving forward.

Thanks

>
> Jason

Attachment: signature.asc
Description: PGP signature


[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