diff options
| author | Chunming Zhou <David1.Zhou@amd.com> | 2016-04-25 10:28:24 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-05-11 12:31:14 -0400 | 
| commit | 444066b915c1b9d0aa4ec7b2d2bbe627e08bf7a6 (patch) | |
| tree | 6c4ea3a9b09075a9c7ec4edfcec37939b93bb488 /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
| parent | 2e726dc4b4e2dd3ae3fe675f9d3af88a2d593ee1 (diff) | |
| download | blackbird-obmc-linux-444066b915c1b9d0aa4ec7b2d2bbe627e08bf7a6.tar.gz blackbird-obmc-linux-444066b915c1b9d0aa4ec7b2d2bbe627e08bf7a6.zip  | |
drm/amdgpu: fix wrong release of vmid owner
The release of the vmid owner was not handled
correctly.  We need to take the lock and walk
the lru list.
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 856116a874bb..e06d0661549f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1454,6 +1454,7 @@ error_free_sched_entity:  void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  {  	struct amdgpu_bo_va_mapping *mapping, *tmp; +	struct amdgpu_vm_id *id, *id_tmp;  	int i;  	amd_sched_entity_fini(vm->entity.sched, &vm->entity); @@ -1478,14 +1479,17 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	amdgpu_bo_unref(&vm->page_directory);  	fence_put(vm->page_directory_fence); -	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { -		struct amdgpu_vm_id *id = vm->ids[i]; - +	mutex_lock(&adev->vm_manager.lock); +	list_for_each_entry_safe(id, id_tmp, &adev->vm_manager.ids_lru, +				 list) {  		if (!id)  			continue; - -		atomic_long_cmpxchg(&id->owner, (long)vm, 0); +		if (atomic_long_read(&id->owner) == (long)vm) { +			atomic_long_set(&id->owner, 0); +			id->pd_gpu_addr = 0; +		}  	} +	mutex_unlock(&adev->vm_manager.lock);  }  /**  | 

