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

Reply via email to