lkml.org 
[lkml]   [2022]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 040/262] drm/amdgpu: check vm ready by amdgpu_vm->evicting flag
    Date
    From: Qiang Yu <qiang.yu@amd.com>

    [ Upstream commit c1a66c3bc425ff93774fb2f6eefa67b83170dd7e ]

    Workstation application ANSA/META v21.1.4 get this error dmesg when
    running CI test suite provided by ANSA/META:
    [drm:amdgpu_gem_va_ioctl [amdgpu]] *ERROR* Couldn't update BO_VA (-16)

    This is caused by:
    1. create a 256MB buffer in invisible VRAM
    2. CPU map the buffer and access it causes vm_fault and try to move
    it to visible VRAM
    3. force visible VRAM space and traverse all VRAM bos to check if
    evicting this bo is valuable
    4. when checking a VM bo (in invisible VRAM), amdgpu_vm_evictable()
    will set amdgpu_vm->evicting, but latter due to not in visible
    VRAM, won't really evict it so not add it to amdgpu_vm->evicted
    5. before next CS to clear the amdgpu_vm->evicting, user VM ops
    ioctl will pass amdgpu_vm_ready() (check amdgpu_vm->evicted)
    but fail in amdgpu_vm_bo_update_mapping() (check
    amdgpu_vm->evicting) and get this error log

    This error won't affect functionality as next CS will finish the
    waiting VM ops. But we'd better clear the error log by checking
    the amdgpu_vm->evicting flag in amdgpu_vm_ready() to stop calling
    amdgpu_vm_bo_update_mapping() later.

    Another reason is amdgpu_vm->evicted list holds all BOs (both
    user buffer and page table), but only page table BOs' eviction
    prevent VM ops. amdgpu_vm->evicting flag is set only for page
    table BOs, so we should use evicting flag instead of evicted list
    in amdgpu_vm_ready().

    The side effect of this change is: previously blocked VM op (user
    buffer in "evicted" list but no page table in it) gets done
    immediately.

    v2: update commit comments.

    Acked-by: Paul Menzel <pmenzel@molgen.mpg.de>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Qiang Yu <qiang.yu@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
    index 6b15cad78de9d..a33cb2f4d7444 100644
    --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
    +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
    @@ -768,11 +768,16 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
    * Check if all VM PDs/PTs are ready for updates
    *
    * Returns:
    - * True if eviction list is empty.
    + * True if VM is not evicting.
    */
    bool amdgpu_vm_ready(struct amdgpu_vm *vm)
    {
    - return list_empty(&vm->evicted);
    + bool ret;
    +
    + amdgpu_vm_eviction_lock(vm);
    + ret = !vm->evicting;
    + amdgpu_vm_eviction_unlock(vm);
    + return ret;
    }

    /**
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-03-07 10:54    [W:12.691 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site