[PATCH 0/6 v4] *** Dedicated vmid per process v4 ***

Christian König deathsimple at vodafone.de
Thu Apr 27 09:51:12 UTC 2017


Patch #1, #2, #4 and #6 are Reviewed-by: Christian König 
<christian.koenig at amd.com>.

Patch #3:
> +	/* Select the first entry VMID */
> +	idle = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vm_id, list);
> +	list_del_init(&idle->list);
> +	vm->reserved_vmid[vmhub] = idle;
> +	mutex_unlock(&id_mgr->lock);
I think we should wait for the VMID to be completely idle before we can 
use it, but that possible also go into the handling in patch #5.

Patch #5:
> +	if ((amdgpu_vm_had_gpu_reset(adev, id)) ||
> +	    (atomic64_read(&id->owner) != vm->client_id) ||
> +	    (job->vm_pd_addr != id->pd_gpu_addr) ||
> +	    (updates && (!flushed || updates->context != flushed->context ||
> +			fence_is_later(updates, flushed)))) {
You also need this check here as well:
                 if (!id->last_flush ||
                     (id->last_flush->context != fence_context &&
                      !fence_is_signaled(id->last_flush)))

> +		tmp = amdgpu_sync_get_fence(&id->active);
> +		if (tmp) {
> +			r = amdgpu_sync_fence(adev, sync, tmp);
> +			fence_put(tmp);
> +			return r;
> +		}
That won't work correctly.

The first problem is that amdgpu_sync_get_fence() removes the fence from 
the active fences. So a another command submission from a different 
context won't wait for all the necessary fences. I think using 
amdgpu_sync_peek_fence() instead should work here.

The second problem is that a context could be starved when it needs a VM 
flush while another context can still submit jobs without a flush. I 
think you could work around that by setting id->pd_gpu_addr to an 
invalid value when we hit this case. This way all other contexts would 
need to do a VM flush as well.

> +	id->pd_gpu_addr = job->vm_pd_addr;
> +	id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
> +	atomic64_set(&id->owner, vm->client_id);
> +	job->vm_needs_flush = needs_flush;
If we need a flush id->last_flush needs to be set to NULL here as well. 
E.g. do
         fence_put(id->last_flush);
         id->last_flush = NULL;

Regards,
Christian.

Am 27.04.2017 um 07:00 schrieb Chunming Zhou:
> The current kernel implementation, which grabs the idle VMID from pool when emitting the job may:
>
>      The back-to-back submission from one process could use different VMID.
>      The submission to different queues from single process could use different VMID
>
> It works well in most case but cannot work for the SQ thread trace capture.
>
> The VMID for the submission that set the {SQTT}_BASE, which refers to the address of the trace buffer, is stored in shader engine.
>
> If the profiling application have to use different VMIDs to submit IBs in its life cycle:
>
>      Some trace is not captured since it actually uses different VMID to submit jobs.
>      Some part of captured trace may come from different application since they are accidentally uses the owner’s VMID to submit jobs.
>
> V2:
> 1. address Christian's comments:
> 	a. drop context flags for tag process, instead, add vm ioctl.
> 	b. change order of patches.
> 	c. sync waiting only when vm flush needs.
>
> 2. address Alex's comments;
> 	bump module version
>
> V3:
>    address Jerry and Christian's comments.
>    and only reserve gfxhub vmid
>
> v4:
>    address Jerry and Christian's comments.
>    fix some race condistions.
>
> Chunming Zhou (6):
>    drm/amdgpu: add vm ioctl
>    drm/amdgpu: add reserved vmid field in vm struct v2
>    drm/amdgpu: reserve/unreserve vmid by vm ioctl v4
>    drm/amdgpu: add limitation for dedicated vm number v4
>    drm/amdgpu: implement grab reserved vmid V3
>    drm/amdgpu: bump module verion for reserved vmid
>
>   drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |   3 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |   1 +
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 152 ++++++++++++++++++++++++++++++--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |   6 ++
>   include/uapi/drm/amdgpu_drm.h           |  22 +++++
>   5 files changed, 178 insertions(+), 6 deletions(-)
>



More information about the amd-gfx mailing list