diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 12 | 
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 2bd1a54ee866..a70103ac0026 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -79,9 +79,10 @@ static void amdgpu_bo_user_destroy(struct ttm_buffer_object *tbo)  static void amdgpu_bo_vm_destroy(struct ttm_buffer_object *tbo)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); -	struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); +	struct amdgpu_bo *shadow_bo = ttm_to_amdgpu_bo(tbo), *bo;  	struct amdgpu_bo_vm *vmbo; +	bo = shadow_bo->parent;  	vmbo = to_amdgpu_bo_vm(bo);  	/* in case amdgpu_device_recover_vram got NULL of bo->parent */  	if (!list_empty(&vmbo->shadow_list)) { @@ -139,7 +140,7 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)  		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)  			places[c].lpfn = visible_pfn; -		else if (adev->gmc.real_vram_size != adev->gmc.visible_vram_size) +		else  			places[c].flags |= TTM_PL_FLAG_TOPDOWN;  		if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) @@ -694,11 +695,6 @@ int amdgpu_bo_create_vm(struct amdgpu_device *adev,  		return r;  	*vmbo_ptr = to_amdgpu_bo_vm(bo_ptr); -	INIT_LIST_HEAD(&(*vmbo_ptr)->shadow_list); -	/* Set destroy callback to amdgpu_bo_vm_destroy after vmbo->shadow_list -	 * is initialized. -	 */ -	bo_ptr->tbo.destroy = &amdgpu_bo_vm_destroy;  	return r;  } @@ -715,6 +711,8 @@ void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo)  	mutex_lock(&adev->shadow_list_lock);  	list_add_tail(&vmbo->shadow_list, &adev->shadow_list); +	vmbo->shadow->parent = amdgpu_bo_ref(&vmbo->bo); +	vmbo->shadow->tbo.destroy = &amdgpu_bo_vm_destroy;  	mutex_unlock(&adev->shadow_list_lock);  }  | 
