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

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


Am 27.04.2017 um 12:26 schrieb zhoucm1:
>
>
> 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?

Imagine the following scenario:

Two contexts in use by the application.

Context 1 has a bunch of jobs to do, but needs a VM flush before 
starting them.

So each job will just pick the first fence to wait for go to sleep again.

Context 2 has a bunch of jobs to do, but does NOT need a VM flush.

This will add more and more fences to the collection of active jobs for 
this id.

The result is that Context 1 will never be able to submit any of it's 
jobs because context 2 keeps the ID busy all the time.

Setting the pd_gpu_addr to some invalid value (or maybe the ID owner?) 
should fix that. In this case context 2 needs to flush as well and so 
context 1 will sooner or later get a chance as well.

Regards,
Christian.

>
>
>>
>>> +    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