On Sat, Jan 19, 2019 at 10:00:25AM +0200, Leon Romanovsky wrote: > On Fri, Jan 18, 2019 at 09:59:31PM +0000, Jason Gunthorpe wrote: > > On Thu, Jan 17, 2019 at 08:04:45PM +0200, Leon Romanovsky wrote: > > > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > > > > > Adapt mlx5 to share restrack ID instead of local variable. > > > > > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > > drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++++------- > > > drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 - > > > drivers/infiniband/hw/mlx5/mr.c | 16 ++++++++-------- > > > drivers/infiniband/hw/mlx5/qp.c | 22 +++++++++++++--------- > > > drivers/infiniband/hw/mlx5/srq.c | 2 +- > > > 5 files changed, 37 insertions(+), 26 deletions(-) > > > > > > diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c > > > index b32b5c7f1cfd..9db041465266 100644 > > > +++ b/drivers/infiniband/hw/mlx5/main.c > > > @@ -2262,11 +2262,14 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, > > > u32 out[MLX5_ST_SZ_DW(alloc_pd_out)] = {}; > > > u32 in[MLX5_ST_SZ_DW(alloc_pd_in)] = {}; > > > u16 uid = 0; > > > + u32 pdn; > > > > > > pd = kzalloc(sizeof(*pd), GFP_KERNEL); > > > if (!pd) > > > return ERR_PTR(-ENOMEM); > > > > > > + pd->ibpd.device = ibdev; > > > > This needs to be re-ordered now? Don't like.. > > I need "device" to know where to store restrack objects. > Because we don't have "priv" for those ib_* objects, we can't > preallocate them before drivers (we don't know the allocation > size). What about if we introduce new functions in IB/core for > all objects to allocate structure and set device? I would prefer if the core could still do the restrack_add just using the device provided ID number.. Is that not possible? I didn't look closely yet > Something like this: > void *alloc_object(struct ib_device *dev, size_t s, uint64_t offset_to_device_pointer_in_driver) > { > void *a; > > a = kzalloc(s, GFP_KERNEL); > if (!a) > return ERR_PTR(-ENOMEM); > *(a + offset_to_device_pointer_in_driver) = dev; > return a; > } Yuk, if we are messing with this we should include the allocation sizes in the ops structure and have the core provide an allocated pointer. Would remove lots of driver code, but is a huge amount of work.. Jason