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

zhoucm1 david1.zhou at amd.com
Thu Apr 27 10:26:31 UTC 2017



On 2017年04月27日 17:51, Christian König wrote:
> 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.
Yes.
>
> 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)))
added.
>
>> +        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.
good catch.

>
> 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.
I don't catch your opinion, when you object concurrent flush, isn't it 
expected?

>
>> +    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;
changed.

Regards,
David Zhou
>
> 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