lkml.org 
[lkml]   [2015]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 085/102] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
    Date
    3.19.8-ckt3 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com>

    commit ee18e599251ed06bf0c8ade7c434a0de311342ca upstream.

    Some error paths didn't unreserve the BO. This resulted in a deadlock
    down the road on the next attempt to reserve the (still reserved) BO.

    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90873
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/gpu/drm/radeon/radeon_vm.c | 17 ++++++++++++-----
    1 file changed, 12 insertions(+), 5 deletions(-)

    diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
    index de42fc4..9c3377c 100644
    --- a/drivers/gpu/drm/radeon/radeon_vm.c
    +++ b/drivers/gpu/drm/radeon/radeon_vm.c
    @@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
    /* make sure object fit at this offset */
    eoffset = soffset + size;
    if (soffset >= eoffset) {
    - return -EINVAL;
    + r = -EINVAL;
    + goto error_unreserve;
    }

    last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
    if (last_pfn > rdev->vm_manager.max_pfn) {
    dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
    last_pfn, rdev->vm_manager.max_pfn);
    - return -EINVAL;
    + r = -EINVAL;
    + goto error_unreserve;
    }

    } else {
    @@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
    "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
    soffset, tmp->bo, tmp->it.start, tmp->it.last);
    mutex_unlock(&vm->mutex);
    - return -EINVAL;
    + r = -EINVAL;
    + goto error_unreserve;
    }
    }

    @@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
    tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
    if (!tmp) {
    mutex_unlock(&vm->mutex);
    - return -ENOMEM;
    + r = -ENOMEM;
    + goto error_unreserve;
    }
    tmp->it.start = bo_va->it.start;
    tmp->it.last = bo_va->it.last;
    @@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
    r = radeon_vm_clear_bo(rdev, pt);
    if (r) {
    radeon_bo_unref(&pt);
    - radeon_bo_reserve(bo_va->bo, false);
    return r;
    }

    @@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,

    mutex_unlock(&vm->mutex);
    return 0;
    +
    +error_unreserve:
    + radeon_bo_unreserve(bo_va->bo);
    + return r;
    }

    /**
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-07-07 21:01    [W:4.210 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site