diff options
| author | Christian König <christian.koenig@amd.com> | 2016-05-23 15:30:08 +0200 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-07-07 14:51:22 -0400 | 
| commit | 36fd7c5c3ca6e03a265e8458905f453b552fe9df (patch) | |
| tree | 286cdb9cd0914ede8b685708b179f401b58b22f9 /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
| parent | 354202389614bc7c29b6fbb98677326fcc248055 (diff) | |
| download | blackbird-obmc-linux-36fd7c5c3ca6e03a265e8458905f453b552fe9df.tar.gz blackbird-obmc-linux-36fd7c5c3ca6e03a265e8458905f453b552fe9df.zip  | |
drm/amdgpu: prefer VMIDs idle on the current ring
Prefer to use a VMIDs which are idle on the ring we want to submit to. This
also removes bubbling idle VMIDs up on the LRU, which is actually not
beneficial.
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Chunming Zhou <david1.zhou@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 | 24 | 
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 711d92bb7ae2..cf989cf54072 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -236,21 +236,15 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,  	} while (i != ring->idx); -	id = list_first_entry(&adev->vm_manager.ids_lru, -			      struct amdgpu_vm_id, -			      list); - -	if (!amdgpu_sync_is_idle(&id->active, NULL)) { -		struct list_head *head = &adev->vm_manager.ids_lru; -		struct amdgpu_vm_id *tmp; - -		list_for_each_entry_safe(id, tmp, &adev->vm_manager.ids_lru, -					 list) { -			if (amdgpu_sync_is_idle(&id->active, NULL)) { -				list_move(&id->list, head); -				head = &id->list; -			} -		} +	/* Check if we have an idle VMID */ +	list_for_each_entry(id, &adev->vm_manager.ids_lru, list) { +		if (amdgpu_sync_is_idle(&id->active, ring)) +			break; + +	} + +	/* If we can't find a idle VMID to use, just wait for the oldest */ +	if (&id->list == &adev->vm_manager.ids_lru) {  		id = list_first_entry(&adev->vm_manager.ids_lru,  				      struct amdgpu_vm_id,  				      list);  | 

