It requires validating the shared BO before updating its usage size; otherwise, there is a potential NULL pointer error when the BO released improperly.
Signed-off-by: Prike Liang <prike.li...@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index f042372d9f2e..a574effdd3ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -321,12 +321,26 @@ static void amdgpu_vm_bo_reset_state_machine(struct amdgpu_vm *vm) */ static void amdgpu_vm_update_shared(struct amdgpu_vm_bo_base *base) { - struct amdgpu_vm *vm = base->vm; - struct amdgpu_bo *bo = base->bo; - uint64_t size = amdgpu_bo_size(bo); - uint32_t bo_memtype = amdgpu_bo_mem_stats_placement(bo); + struct amdgpu_vm *vm; + struct amdgpu_bo *bo; + uint64_t size = 0; + uint32_t bo_memtype = TTM_PL_SYSTEM; bool shared; + if (likely(base)) { + vm = base->vm; + bo = base->bo; + } else { + return; + } + + if (likely(bo)) { + size = amdgpu_bo_size(bo); + bo_memtype = amdgpu_bo_mem_stats_placement(bo); + } else { + return; + } + spin_lock(&vm->status_lock); shared = drm_gem_object_is_shared_for_memory_stats(&bo->tbo.base); if (base->shared != shared) { @@ -353,6 +367,9 @@ void amdgpu_vm_bo_update_shared(struct amdgpu_bo *bo) { struct amdgpu_vm_bo_base *base; + if (unlikely(!bo)) + return; + for (base = bo->vm_bo; base; base = base->next) amdgpu_vm_update_shared(base); } -- 2.34.1