Message ID | 20220126060425.11124-1-linmq006@gmail.com (mailing list archive) |
---|---|
State | Rejected |
Delegated to: | Leon Romanovsky |
Headers | show |
Series | IB/usnic: Fix memory leak in usnic_ib_sysfs_qpn_add | expand |
On Wed, Jan 26, 2022 at 06:04:25AM +0000, Miaoqian Lin wrote: > kobject_init_and_add() takes reference even when it fails. > According to the doc of kobject_init_and_add(): > > If this function returns an error, kobject_put() must be called to > properly clean up the memory associated with the object. > > Fix memory leak by calling kobject_put(). There is no real memory leak here, this kobject will be released in usnic_ib_sysfs_qpn_remove(). Another possible solution is to delete "if (err)" completely. diff --git a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c index fdb63a8fb997..11723f54e200 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c +++ b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c @@ -271,17 +271,15 @@ void usnic_ib_sysfs_unregister_usdev(struct usnic_ib_dev *us_ibdev) void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp) { struct usnic_ib_dev *us_ibdev; - int err; us_ibdev = qp_grp->vf->pf; - err = kobject_init_and_add(&qp_grp->kobj, &usnic_ib_qpn_type, + kobject_init_and_add(&qp_grp->kobj, &usnic_ib_qpn_type, kobject_get(us_ibdev->qpn_kobj), "%d", qp_grp->grp_id); - if (err) { - kobject_put(us_ibdev->qpn_kobj); - return; - } + /* We don't care about failure here, the release will be performed in + * usnic_ib_sysfs_qpn_remove() anyway. + */ } void usnic_ib_sysfs_qpn_remove(struct usnic_ib_qp_grp *qp_grp) > > Fixes: e3cf00d0a87f ("IB/usnic: Add Cisco VIC low-level hardware driver") > Signed-off-by: Miaoqian Lin <linmq006@gmail.com> > --- > drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c > index 7d868f033bbf..69c5854deebc 100644 > --- a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c > +++ b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c > @@ -280,6 +280,7 @@ void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp) > kobject_get(us_ibdev->qpn_kobj), > "%d", qp_grp->grp_id); > if (err) { > + kobject_put(&qp_grp->kobj); > kobject_put(us_ibdev->qpn_kobj); > return; > } > -- > 2.17.1 >
diff --git a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c index 7d868f033bbf..69c5854deebc 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c +++ b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c @@ -280,6 +280,7 @@ void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp) kobject_get(us_ibdev->qpn_kobj), "%d", qp_grp->grp_id); if (err) { + kobject_put(&qp_grp->kobj); kobject_put(us_ibdev->qpn_kobj); return; }
kobject_init_and_add() takes reference even when it fails. According to the doc of kobject_init_and_add(): If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object. Fix memory leak by calling kobject_put(). Fixes: e3cf00d0a87f ("IB/usnic: Add Cisco VIC low-level hardware driver") Signed-off-by: Miaoqian Lin <linmq006@gmail.com> --- drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 1 + 1 file changed, 1 insertion(+)