[PATCH 1/5] drm/amdgpu: allow direct submission in the VM backends

Kuehling, Felix Felix.Kuehling at amd.com
Tue Jul 2 19:35:52 UTC 2019


This assumes that page tables are resident when a page fault is handled. 
I think it's possible that a page table gets evicted while a page fault 
is pending. Maybe not with graphics, but definitely with compute where 
waves can be preempted while waiting for a page fault. In that case the 
direct access would break.

Even with graphics I think it's still possible that new page tables need 
to be allocated to handle a page fault. When that happens, you need to 
wait for fences to let new page tables be validated and initialized.

Patch #2 deals with updating page directories. That pretty much implies 
that page tables have moved or been reallocated. Wouldn't that be a 
counter-indication for using direct page table updates? In other words, 
if you need to update page directories, a direct page table updates is 
unsafe by definition.

Regards,
   Felix

On 2019-06-28 8:18 a.m., Christian König wrote:
> This allows us to update page tables directly while in a page fault.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h      |  5 ++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c  |  4 +++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c | 29 +++++++++++++--------
>   3 files changed, 27 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 489a162ca620..5941accea061 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -197,6 +197,11 @@ struct amdgpu_vm_update_params {
>   	 */
>   	struct amdgpu_vm *vm;
>   
> +	/**
> +	 * @direct: if changes should be made directly
> +	 */
> +	bool direct;
> +
>   	/**
>   	 * @pages_addr:
>   	 *
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c
> index 5222d165abfc..f94e4896079c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c
> @@ -49,6 +49,10 @@ static int amdgpu_vm_cpu_prepare(struct amdgpu_vm_update_params *p, void *owner,
>   {
>   	int r;
>   
> +	/* Don't wait for anything during page fault */
> +	if (p->direct)
> +		return 0;
> +
>   	/* Wait for PT BOs to be idle. PTs share the same resv. object
>   	 * as the root PD BO
>   	 */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c
> index ddd181f5ed37..891d597063cb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c
> @@ -68,17 +68,17 @@ static int amdgpu_vm_sdma_prepare(struct amdgpu_vm_update_params *p,
>   	if (r)
>   		return r;
>   
> -	r = amdgpu_sync_fence(p->adev, &p->job->sync, exclusive, false);
> -	if (r)
> -		return r;
> +	p->num_dw_left = ndw;
> +
> +	if (p->direct)
> +		return 0;
>   
> -	r = amdgpu_sync_resv(p->adev, &p->job->sync, root->tbo.resv,
> -			     owner, false);
> +	r = amdgpu_sync_fence(p->adev, &p->job->sync, exclusive, false);
>   	if (r)
>   		return r;
>   
> -	p->num_dw_left = ndw;
> -	return 0;
> +	return amdgpu_sync_resv(p->adev, &p->job->sync, root->tbo.resv,
> +				owner, false);
>   }
>   
>   /**
> @@ -99,13 +99,21 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,
>   	struct dma_fence *f;
>   	int r;
>   
> -	ring = container_of(p->vm->entity.rq->sched, struct amdgpu_ring, sched);
> +	if (p->direct)
> +		ring = p->adev->vm_manager.page_fault;
> +	else
> +		ring = container_of(p->vm->entity.rq->sched,
> +				    struct amdgpu_ring, sched);
>   
>   	WARN_ON(ib->length_dw == 0);
>   	amdgpu_ring_pad_ib(ring, ib);
>   	WARN_ON(ib->length_dw > p->num_dw_left);
> -	r = amdgpu_job_submit(p->job, &p->vm->entity,
> -			      AMDGPU_FENCE_OWNER_VM, &f);
> +
> +	if (p->direct)
> +		r = amdgpu_job_submit_direct(p->job, ring, &f);
> +	else
> +		r = amdgpu_job_submit(p->job, &p->vm->entity,
> +				      AMDGPU_FENCE_OWNER_VM, &f);
>   	if (r)
>   		goto error;
>   
> @@ -120,7 +128,6 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,
>   	return r;
>   }
>   
> -
>   /**
>    * amdgpu_vm_sdma_copy_ptes - copy the PTEs from mapping
>    *


More information about the amd-gfx mailing list