lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 187/775] drm: rcar-du: Fix leak of CMM platform device reference
    Date
    From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

    [ Upstream commit 9fa120458da142da0d1d3eaf6f6a3a2c2c91d27b ]

    The device references acquired by of_find_device_by_node() are not
    released by the driver. Fix this by registering a cleanup action.

    Fixes: 8de707aeb452 ("drm: rcar-du: kms: Initialize CMM instances")
    Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
    Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/rcar-du/rcar_du_kms.c | 22 +++++++++++++++++++---
    1 file changed, 19 insertions(+), 3 deletions(-)

    diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
    index 7015e22872bbe..ecc894f0bc430 100644
    --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
    +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
    @@ -14,6 +14,7 @@
    #include <drm/drm_fb_cma_helper.h>
    #include <drm/drm_gem_cma_helper.h>
    #include <drm/drm_gem_framebuffer_helper.h>
    +#include <drm/drm_managed.h>
    #include <drm/drm_probe_helper.h>
    #include <drm/drm_vblank.h>

    @@ -726,8 +727,12 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu)
    * disabled: return 0 and let the DU continue probing.
    */
    ret = rcar_cmm_init(pdev);
    - if (ret)
    + if (ret) {
    + platform_device_put(pdev);
    return ret == -ENODEV ? 0 : ret;
    + }
    +
    + rcdu->cmms[i] = pdev;

    /*
    * Enforce suspend/resume ordering by making the CMM a provider
    @@ -739,13 +744,20 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu)
    "Failed to create device link to CMM%u\n", i);
    return -EINVAL;
    }
    -
    - rcdu->cmms[i] = pdev;
    }

    return 0;
    }

    +static void rcar_du_modeset_cleanup(struct drm_device *dev, void *res)
    +{
    + struct rcar_du_device *rcdu = to_rcar_du_device(dev);
    + unsigned int i;
    +
    + for (i = 0; i < ARRAY_SIZE(rcdu->cmms); ++i)
    + platform_device_put(rcdu->cmms[i]);
    +}
    +
    int rcar_du_modeset_init(struct rcar_du_device *rcdu)
    {
    static const unsigned int mmio_offsets[] = {
    @@ -766,6 +778,10 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
    if (ret)
    return ret;

    + ret = drmm_add_action(&rcdu->ddev, rcar_du_modeset_cleanup, NULL);
    + if (ret)
    + return ret;
    +
    dev->mode_config.min_width = 0;
    dev->mode_config.min_height = 0;
    dev->mode_config.normalize_zpos = true;
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 01:52    [W:4.049 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site