On Tue, Apr 23, 2019 at 09:24:07AM +0300, Kamal Heib wrote: > > > On 4/22/19 6:40 PM, Jason Gunthorpe wrote: > > On Mon, Apr 22, 2019 at 05:00:19PM +0300, Kamal Heib wrote: > >> Make sure to release the iwcm pointer that is allocated in > >> qedr_iw_register_device() but never released. > >> > >> Fixes: e6a38c54faf3 ("RDMA/qedr: Add support for registering an iWARP device") > >> Signed-off-by: Kamal Heib <kamalheib1@xxxxxxxxx> > >> drivers/infiniband/hw/qedr/main.c | 10 +++++++++- > >> 1 file changed, 9 insertions(+), 1 deletion(-) > >> > >> diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c > >> index 996d9ecd93e0..567f55178379 100644 > >> +++ b/drivers/infiniband/hw/qedr/main.c > >> @@ -293,7 +293,13 @@ static int qedr_register_device(struct qedr_dev *dev) > >> ib_set_device_ops(&dev->ibdev, &qedr_dev_ops); > >> > >> dev->ibdev.driver_id = RDMA_DRIVER_QEDR; > >> - return ib_register_device(&dev->ibdev, "qedr%d"); > >> + rc = ib_register_device(&dev->ibdev, "qedr%d"); > >> + if (rc) { > >> + if (IS_IWARP(dev)) > >> + kfree(dev->ibdev.iwcm); > >> + } > >> + > >> + return rc; > >> } > >> > >> /* This function allocates fast-path status block memory */ > >> @@ -937,6 +943,8 @@ static void qedr_remove(struct qedr_dev *dev) > >> * of the registered clients. > >> */ > >> ib_unregister_device(&dev->ibdev); > >> + if (IS_IWARP(dev)) > >> + kfree(dev->ibdev.iwcm); > > > > This should probably just be in a dealloc_driver callback instead of > > duplicated > > > > Jason > > > > I don't think so Why? That is is the defined place to free memory linked to the struct ib_device > I think that we need to define a new interface in the core (iwcm.c) > for the IWARP devices to use when {allocate, setting ops to, > release} iwcm, what do you think? Why? Jason