>From 7676fc70738699dddca5627e21be0d82e91aea05 Mon Sep 17 00:00:00 2001 From: Chunming Zhou Date: Tue, 11 Sep 2018 13:37:31 +0800 Subject: [PATCH] drm/amdgpu: changing of shadow bo reference should take shadow lock because shadow list doesn't reference shadow bo. Signed-off-by: Chunming Zhou --- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index b0e14a3d54ef..50651157203b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -101,11 +101,9 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo) drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg); drm_gem_object_release(&bo->gem_base); amdgpu_bo_unref(&bo->parent); - if (!list_empty(&bo->shadow_list)) { - mutex_lock(&adev->shadow_list_lock); + if (!list_empty(&bo->shadow_list)) list_del_init(&bo->shadow_list); - mutex_unlock(&adev->shadow_list_lock); - } + kfree(bo->metadata); kfree(bo); } @@ -838,13 +836,21 @@ struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo) void amdgpu_bo_unref(struct amdgpu_bo **bo) { struct ttm_buffer_object *tbo; + bool locked = false; if ((*bo) == NULL) return; + if (bo->parent && bo->parent->shadow == bo && + !list_empty(&bo->parent->shadow_list)) { + mutex_lock(&adev->shadow_list_lock); + locked = true; + } tbo = &((*bo)->tbo); ttm_bo_put(tbo); *bo = NULL; + if (locked) + mutex_unlock(&adev->shadow_list_lock); } /** -- 2.17.1