lkml.org 
[lkml]   [2018]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/44] coresight: Document error handling in coresight_register
    Date
    From: Suzuki K Poulose <suzuki.poulose@arm.com>

    commit 6403587a930c ("coresight: use put_device() instead of kfree()")
    fixes the double freeing of resources and ensures that the device
    refcount is dropped properly. Add a comment to explain this to
    help the readers and prevent people trying to "unfix" it again.

    While at it, rename the labels for better readability.

    Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
    Cc: Arvind Yadav <arvind.yadav.cs@gmail.com>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    ---
    drivers/hwtracing/coresight/coresight.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
    index 3e07fd335f8c..9fd0c387e678 100644
    --- a/drivers/hwtracing/coresight/coresight.c
    +++ b/drivers/hwtracing/coresight/coresight.c
    @@ -1006,7 +1006,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
    csdev = kzalloc(sizeof(*csdev), GFP_KERNEL);
    if (!csdev) {
    ret = -ENOMEM;
    - goto err_kzalloc_csdev;
    + goto err_out;
    }

    if (desc->type == CORESIGHT_DEV_TYPE_LINK ||
    @@ -1022,7 +1022,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
    refcnts = kcalloc(nr_refcnts, sizeof(*refcnts), GFP_KERNEL);
    if (!refcnts) {
    ret = -ENOMEM;
    - goto err_kzalloc_refcnts;
    + goto err_free_csdev;
    }

    csdev->refcnt = refcnts;
    @@ -1035,7 +1035,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
    conns = kcalloc(csdev->nr_outport, sizeof(*conns), GFP_KERNEL);
    if (!conns) {
    ret = -ENOMEM;
    - goto err_kzalloc_conns;
    + goto err_free_refcnts;
    }

    for (i = 0; i < csdev->nr_outport; i++) {
    @@ -1062,7 +1062,11 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
    ret = device_register(&csdev->dev);
    if (ret) {
    put_device(&csdev->dev);
    - goto err_kzalloc_csdev;
    + /*
    + * All resources are free'd explicitly via
    + * coresight_device_release(), triggered from put_device().
    + */
    + goto err_out;
    }

    mutex_lock(&coresight_mutex);
    @@ -1074,11 +1078,11 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)

    return csdev;

    -err_kzalloc_conns:
    +err_free_refcnts:
    kfree(refcnts);
    -err_kzalloc_refcnts:
    +err_free_csdev:
    kfree(csdev);
    -err_kzalloc_csdev:
    +err_out:
    return ERR_PTR(ret);
    }
    EXPORT_SYMBOL_GPL(coresight_register);
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-09-20 21:23    [W:3.503 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site