lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.6 306/606] IB/qib: Call kobject_put() when kobject_init_and_add() fails
    Date
    From: Kaike Wan <kaike.wan@intel.com>

    [ Upstream commit a35cd6447effd5c239b564c80fa109d05ff3d114 ]

    When kobject_init_and_add() returns an error in the function
    qib_create_port_files(), the function kobject_put() is not called for the
    corresponding kobject, which potentially leads to memory leak.

    This patch fixes the issue by calling kobject_put() even if
    kobject_init_and_add() fails. In addition, the ppd->diagc_kobj is released
    along with other kobjects when the sysfs is unregistered.

    Fixes: f931551bafe1 ("IB/qib: Add new qib driver for QLogic PCIe InfiniBand adapters")
    Link: https://lore.kernel.org/r/20200512031328.189865.48627.stgit@awfm-01.aw.intel.com
    Cc: <stable@vger.kernel.org>
    Suggested-by: Lin Yi <teroincn@gmail.com>
    Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: Kaike Wan <kaike.wan@intel.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
    Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/hw/qib/qib_sysfs.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/drivers/infiniband/hw/qib/qib_sysfs.c b/drivers/infiniband/hw/qib/qib_sysfs.c
    index 568b21eb6ea1..021df0654ba7 100644
    --- a/drivers/infiniband/hw/qib/qib_sysfs.c
    +++ b/drivers/infiniband/hw/qib/qib_sysfs.c
    @@ -760,7 +760,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
    qib_dev_err(dd,
    "Skipping linkcontrol sysfs info, (err %d) port %u\n",
    ret, port_num);
    - goto bail;
    + goto bail_link;
    }
    kobject_uevent(&ppd->pport_kobj, KOBJ_ADD);

    @@ -770,7 +770,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
    qib_dev_err(dd,
    "Skipping sl2vl sysfs info, (err %d) port %u\n",
    ret, port_num);
    - goto bail_link;
    + goto bail_sl;
    }
    kobject_uevent(&ppd->sl2vl_kobj, KOBJ_ADD);

    @@ -780,7 +780,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
    qib_dev_err(dd,
    "Skipping diag_counters sysfs info, (err %d) port %u\n",
    ret, port_num);
    - goto bail_sl;
    + goto bail_diagc;
    }
    kobject_uevent(&ppd->diagc_kobj, KOBJ_ADD);

    @@ -793,7 +793,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
    qib_dev_err(dd,
    "Skipping Congestion Control sysfs info, (err %d) port %u\n",
    ret, port_num);
    - goto bail_diagc;
    + goto bail_cc;
    }

    kobject_uevent(&ppd->pport_cc_kobj, KOBJ_ADD);
    @@ -854,6 +854,7 @@ void qib_verbs_unregister_sysfs(struct qib_devdata *dd)
    &cc_table_bin_attr);
    kobject_put(&ppd->pport_cc_kobj);
    }
    + kobject_put(&ppd->diagc_kobj);
    kobject_put(&ppd->sl2vl_kobj);
    kobject_put(&ppd->pport_kobj);
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 01:24    [W:2.721 / U:0.212 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site