[PATCH 5/8] drm/amdgpu: cleanup and simplify amdgpu_vmid_grab_reserved

Chunming Zhou zhoucm1 at amd.com
Thu Feb 1 06:16:57 UTC 2018


Reviewed-by: Chunming Zhou <david1.zhou at amd.com>


On 2018年01月31日 23:47, Christian König wrote:
> Drop the "_locked" from the name, cleanup and simplify the logic a bit.
> Add missing comments.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 58 ++++++++++++++++++++-------------
>   1 file changed, 35 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> index 2cb4e1750d10..86d012b21554 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> @@ -248,12 +248,22 @@ static int amdgpu_vmid_grab_idle(struct amdgpu_vm *vm,
>   	return 0;
>   }
>   
> -/* idr_mgr->lock must be held */
> -static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
> -					    struct amdgpu_ring *ring,
> -					    struct amdgpu_sync *sync,
> -					    struct dma_fence *fence,
> -					    struct amdgpu_job *job)
> +/**
> + * amdgpu_vm_grab_reserved - try to assign reserved VMID
> + *
> + * @vm: vm to allocate id for
> + * @ring: ring we want to submit job to
> + * @sync: sync object where we add dependencies
> + * @fence: fence protecting ID from reuse
> + * @job: job who wants to use the VMID
> + *
> + * Try to assign a reserved VMID.
> + */
> +static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm,
> +				     struct amdgpu_ring *ring,
> +				     struct amdgpu_sync *sync,
> +				     struct dma_fence *fence,
> +				     struct amdgpu_job *job)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	unsigned vmhub = ring->funcs->vmhub;
> @@ -261,18 +271,21 @@ static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
>   	struct amdgpu_vmid *id = vm->reserved_vmid[vmhub];
>   	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>   	struct dma_fence *updates = sync->last_vm_update;
> -	int r = 0;
> -	struct dma_fence *flushed, *tmp;
>   	bool needs_flush = vm->use_cpu_for_update;
> +	int r = 0;
> +
> +	if (updates && id->flushed_updates &&
> +	    updates->context == id->flushed_updates->context &&
> +	    !dma_fence_is_later(updates, id->flushed_updates))
> +	    updates = NULL;
> +
> +	if (id->owner != vm->entity.fence_context ||
> +	    job->vm_pd_addr != id->pd_gpu_addr ||
> +	    updates || !id->last_flush ||
> +	    (id->last_flush->context != fence_context &&
> +	     !dma_fence_is_signaled(id->last_flush))) {
> +		struct dma_fence *tmp;
>   
> -	flushed  = id->flushed_updates;
> -	if ((id->owner != vm->entity.fence_context) ||
> -	    (job->vm_pd_addr != id->pd_gpu_addr) ||
> -	    (updates && (!flushed || updates->context != flushed->context ||
> -			dma_fence_is_later(updates, flushed))) ||
> -	    (!id->last_flush || (id->last_flush->context != fence_context &&
> -				 !dma_fence_is_signaled(id->last_flush)))) {
> -		needs_flush = true;
>   		/* to prevent one context starved by another context */
>   		id->pd_gpu_addr = 0;
>   		tmp = amdgpu_sync_peek_fence(&id->active, ring);
> @@ -280,6 +293,7 @@ static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
>   			r = amdgpu_sync_fence(adev, sync, tmp, false);
>   			return r;
>   		}
> +		needs_flush = true;
>   	}
>   
>   	/* Good we can use this VMID. Remember this submission as
> @@ -287,10 +301,9 @@ static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
>   	*/
>   	r = amdgpu_sync_fence(ring->adev, &id->active, fence, false);
>   	if (r)
> -		goto out;
> +		return r;
>   
> -	if (updates && (!flushed || updates->context != flushed->context ||
> -			dma_fence_is_later(updates, flushed))) {
> +	if (updates) {
>   		dma_fence_put(id->flushed_updates);
>   		id->flushed_updates = dma_fence_get(updates);
>   	}
> @@ -304,8 +317,7 @@ static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
>   	job->vmid = id - id_mgr->ids;
>   	job->pasid = vm->pasid;
>   	trace_amdgpu_vm_grab_id(vm, ring, job);
> -out:
> -	return r;
> +	return 0;
>   }
>   
>   /**
> @@ -315,6 +327,7 @@ static int amdgpu_vmid_grab_reserved_locked(struct amdgpu_vm *vm,
>    * @ring: ring we want to submit job to
>    * @sync: sync object where we add dependencies
>    * @fence: fence protecting ID from reuse
> + * @job: job who wants to use the VMID
>    *
>    * Allocate an id for the vm, adding fences to the sync obj as necessary.
>    */
> @@ -336,8 +349,7 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
>   		goto error;
>   
>   	if (vm->reserved_vmid[vmhub]) {
> -		r = amdgpu_vmid_grab_reserved_locked(vm, ring, sync,
> -						     fence, job);
> +		r = amdgpu_vmid_grab_reserved(vm, ring, sync, fence, job);
>   		mutex_unlock(&id_mgr->lock);
>   		return r;
>   	}



More information about the amd-gfx mailing list