lkml.org 
[lkml]   [2024]   [Mar]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.6 44/75] drm/amd/amdgpu: Fix potential ioremap() memory leaks in amdgpu_device_init()
    Date
    From: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>

    [ Upstream commit eb4f139888f636614dab3bcce97ff61cefc4b3a7 ]

    This ensures that the memory mapped by ioremap for adev->rmmio, is
    properly handled in amdgpu_device_init(). If the function exits early
    due to an error, the memory is unmapped. If the function completes
    successfully, the memory remains mapped.

    Reported by smatch:
    drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:4337 amdgpu_device_init() warn: 'adev->rmmio' from ioremap() not released on lines: 4035,4045,4051,4058,4068,4337

    Cc: Christian König <christian.koenig@amd.com>
    Cc: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 16 ++++++++++------
    1 file changed, 10 insertions(+), 6 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
    index 79261bec26542..d0be5e485530c 100644
    --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
    +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
    @@ -3638,8 +3638,10 @@ int amdgpu_device_init(struct amdgpu_device *adev,
    * early on during init and before calling to RREG32.
    */
    adev->reset_domain = amdgpu_reset_create_reset_domain(SINGLE_DEVICE, "amdgpu-reset-dev");
    - if (!adev->reset_domain)
    - return -ENOMEM;
    + if (!adev->reset_domain) {
    + r = -ENOMEM;
    + goto unmap_memory;
    + }

    /* detect hw virtualization here */
    amdgpu_detect_virtualization(adev);
    @@ -3649,20 +3651,20 @@ int amdgpu_device_init(struct amdgpu_device *adev,
    r = amdgpu_device_get_job_timeout_settings(adev);
    if (r) {
    dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n");
    - return r;
    + goto unmap_memory;
    }

    /* early init functions */
    r = amdgpu_device_ip_early_init(adev);
    if (r)
    - return r;
    + goto unmap_memory;

    amdgpu_device_set_mcbp(adev);

    /* Get rid of things like offb */
    r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver);
    if (r)
    - return r;
    + goto unmap_memory;

    /* Enable TMZ based on IP_VERSION */
    amdgpu_gmc_tmz_set(adev);
    @@ -3672,7 +3674,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
    if (adev->gmc.xgmi.supported) {
    r = adev->gfxhub.funcs->get_xgmi_info(adev);
    if (r)
    - return r;
    + goto unmap_memory;
    }

    /* enable PCIE atomic ops */
    @@ -3929,6 +3931,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,
    failed:
    amdgpu_vf_error_trans_all(adev);

    +unmap_memory:
    + iounmap(adev->rmmio);
    return r;
    }

    --
    2.43.0

    \
     
     \ /
      Last update: 2024-05-27 16:15    [W:3.028 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site