diff options
| author | Christian König <christian.koenig@amd.com> | 2022-03-14 13:11:28 +0100 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2022-03-25 12:40:26 -0400 | 
| commit | 6e97c2f9689227b3fb6e2563127669f2146b5df5 (patch) | |
| tree | 1877d3cc9dfb0121285f8d5cd8b4380ea2bf370f /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
| parent | 3f8951cc123f102a4e21d61390993bc7d142b723 (diff) | |
drm/amdgpu: move VM PDEs to idle after update
Move the page tables to the idle list after updating the PDEs.
We have gone back and forth with that a couple of times because of problems
with the inter PD dependencies, but it should work now that we have the
state handling cleanly separated.
Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@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 | 42 | 
1 files changed, 10 insertions, 32 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index fc4563cf2828..eb9b86466336 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1364,25 +1364,6 @@ static int amdgpu_vm_update_pde(struct amdgpu_vm_update_params *params,  }  /** - * amdgpu_vm_invalidate_pds - mark all PDs as invalid - * - * @adev: amdgpu_device pointer - * @vm: related vm - * - * Mark all PD level as invalid after an error. - */ -static void amdgpu_vm_invalidate_pds(struct amdgpu_device *adev, -				     struct amdgpu_vm *vm) -{ -	struct amdgpu_vm_pt_cursor cursor; -	struct amdgpu_vm_bo_base *entry; - -	for_each_amdgpu_vm_pt_dfs_safe(adev, vm, NULL, cursor, entry) -		if (entry->bo && !entry->moved) -			amdgpu_vm_bo_relocated(entry); -} - -/**   * amdgpu_vm_update_pdes - make sure that all directories are valid   *   * @adev: amdgpu_device pointer @@ -1398,6 +1379,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  			  struct amdgpu_vm *vm, bool immediate)  {  	struct amdgpu_vm_update_params params; +	struct amdgpu_vm_bo_base *entry;  	int r, idx;  	if (list_empty(&vm->relocated)) @@ -1413,16 +1395,9 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	r = vm->update_funcs->prepare(¶ms, NULL, AMDGPU_SYNC_EXPLICIT);  	if (r) -		goto exit; - -	while (!list_empty(&vm->relocated)) { -		struct amdgpu_vm_bo_base *entry; - -		entry = list_first_entry(&vm->relocated, -					 struct amdgpu_vm_bo_base, -					 vm_status); -		amdgpu_vm_bo_idle(entry); +		goto error; +	list_for_each_entry(entry, &vm->relocated, vm_status) {  		r = amdgpu_vm_update_pde(¶ms, vm, entry);  		if (r)  			goto error; @@ -1431,12 +1406,15 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	r = vm->update_funcs->commit(¶ms, &vm->last_update);  	if (r)  		goto error; -	drm_dev_exit(idx); -	return 0; + +	while (!list_empty(&vm->relocated)) { +		entry = list_first_entry(&vm->relocated, +					 struct amdgpu_vm_bo_base, +					 vm_status); +		amdgpu_vm_bo_idle(entry); +	}  error: -	amdgpu_vm_invalidate_pds(adev, vm); -exit:  	drm_dev_exit(idx);  	return r;  }  | 
