On Wed, Apr 07, 2021 at 03:44:35PM +0000, Parav Pandit wrote: > > If it returns EOPNOTUPP then the remove is never called so if it allocated > > memory and left it allocated then it is leaking memory. > > > I probably confused you. There is no leak today because add_one > allocates memory, and later on when SA/CM etc per port cap is not > present, it is unused left there which is freed on remove_one(). > Returning EOPNOTUPP is fine at start of add_one() before allocation. Most of ULPs are OK, eg umad does: umad_dev = kzalloc(struct_size(umad_dev, ports, e - s + 1), GFP_KERNEL); if (!umad_dev) return -ENOMEM; for (i = s; i <= e; ++i) { if (!rdma_cap_ib_mad(device, i)) continue; if (!count) { ret = -EOPNOTSUPP; goto free; free: /* balances kref_init */ ib_umad_dev_put(umad_dev); It looks like only cm.c and cma.c need fixing, just fix those two. The CM using ULPs have a different issue though.. Jason