[PATCH] drm/amdgpu: Ignore KFD eviction fences invalidating preemptible DMABuf imports

Eric Huang jinhuieric.huang at amd.com
Fri Apr 28 19:51:28 UTC 2023



On 2023-04-28 15:42, Felix Kuehling wrote:
> On 2023-04-28 14:09, Eric Huang wrote:
>>
>> On 2023-04-28 12:41, Felix Kuehling wrote:
>>> On 2023-04-28 10:17, Eric Huang wrote:
>>>>
>>>> On 2023-04-27 23:46, Kuehling, Felix wrote:
>>>>> [AMD Official Use Only - General]
>>>>>
>>>>> Re-mapping typically happens after evictions, before a new 
>>>>> eviction fence gets attached. At that time the old eviction fence 
>>>>> should be in the signaled state already, so it can't be signaled 
>>>>> again. Therefore I would expect my patch to help with unmapping 
>>>>> the DMABuf import, without breaking the eviction case.
>>>>>
>>>>> Are you talking about remapping with a map-to-gpu call from user 
>>>>> mode? I think that would only be a problem if the KFD BO was 
>>>>> unmapped and remapped multiple times. The first time it's mapped, 
>>>>> the fresh dmabuf import should be in the SYSTEM domain, so the 
>>>>> validation in the SYSTEM domain before GTT would be a no-op.
>>>> Yes. The case scenario I am talking about is from user mode, 
>>>> mapping->unmapping->re-mapping to the KFD GTT BO will trigger the 
>>>> eviction.
>>>>>
>>>>> I sort of agree that we don't really rely on the eviction fence on 
>>>>> the DMABuf import. The reservation object is shared with the 
>>>>> original BO. Moving the original BO triggers the eviction fence, 
>>>>> so we don't need to trigger it again on the dmabuf import. Other 
>>>>> than moving the original BO, I don't think we can do anything to 
>>>>> the DMABuf import that would require an eviction for KFD use case. 
>>>>> It is a special use case because we control both the import and 
>>>>> the export in the same context.
>>>> I am thinking about no adding KFD eviction fence in first place of 
>>>> mapping original GTT BO, because I don't see it can be evicted in 
>>>> any cases.
>>>
>>> That's not an option. We're not adding an eviction fence. The 
>>> reservation object with the eviction fence is shared between the 
>>> exported BO and the imported one. That's just how DMABuf works. If 
>>> you wait for the fences on the imported BO, you are effectively 
>>> waiting for the fences on the exported BOs. And you can't remove the 
>>> eviction fence from the exported BO.
>>
>> What if the exported BO will be never evicted in reality? I 
>> understand how DMABuf works, and imported BO doesn't have eviction 
>> fence, it shares with exported BO's one if eviction happens, but I 
>> don't see the exported BO can be evicted.
>
> The exported BO can be evicted like any other BO. For example 
> KFDEvictTest is there to cause and test evictions of KFD VRAM BOs. 
> Exporting the BO does not pin it (if DMABUF_MOVE_NOTIFIER is enabled, 
> which it in the upstream kernel), so the exported BO can still be 
> evicted.

Yes. KFD VRAM BO can be evicted, but DMABuf 's original exported BO is 
non-paged/GTT BO. Can GTT BO be evicted? It should be like paged/userptr 
that doesn't have KFD eviction fence.

Regards,
Eric

>
> Regards,
>   Felix
>
>
>>
>> Regards,
>> Eric
>>
>>>
>>> Regards,
>>>   Felix
>>>
>>>
>>>> In theory GTT BO is mapped by user calling mmap() in system memory 
>>>> like userptr, unlike VRAM it will be not evicted by amdgpu vram 
>>>> manager. The only thing is CPU invalidation, but GTT BO doesn't 
>>>> register mmu notifier, that will be a potential problem when 
>>>> switching paged/userptr to non-paged/GTT for mes scheduler.
>>>>
>>>> Regards,
>>>> Eric
>>>>>
>>>>> In the general case dmabuf imports need their eviction fences. For 
>>>>> example when we're importing a DMABuf from somewhere else, so the 
>>>>> eviction fence is not shared with a BO that we already control. 
>>>>> Even then, unmapping a dmabuf from our KFD VM does not need to 
>>>>> wait for any fences on the DMABuf.
>>>>>
>>>>> Regards,
>>>>>    Felix
>>>>>
>>>>> -----Original Message-----
>>>>> From: Huang, JinHuiEric <JinHuiEric.Huang at amd.com>
>>>>> Sent: Thursday, April 27, 2023 14:58
>>>>> To: Kuehling, Felix <Felix.Kuehling at amd.com>; Koenig, Christian 
>>>>> <Christian.Koenig at amd.com>; Christian König 
>>>>> <ckoenig.leichtzumerken at gmail.com>; amd-gfx at lists.freedesktop.org
>>>>> Subject: Re: [PATCH] drm/amdgpu: Ignore KFD eviction fences 
>>>>> invalidating preemptible DMABuf imports
>>>>>
>>>>> Hi Felix,
>>>>>
>>>>> I tested your patch on mGPU systems. It doesn't break any KFD 
>>>>> eviction tests, because tests don't allocate DMABuf import, that 
>>>>> doesn't trigger it's eviction fence. The only thing the patch 
>>>>> affects is in re-mapping DMABuf imports that the eviction will 
>>>>> still be triggered.
>>>>>
>>>>> I have an idea that we probably can remove eviction fence for GTT 
>>>>> bo, because currently the only way to trigger the eviction fence 
>>>>> is by calling ttm_bo_validate for CPU domain in 
>>>>> kfd_mem_dmaunmap_dmabuf. Do you know there is other case to 
>>>>> trigger GTT bo's eviction?
>>>>>
>>>>> Regards,
>>>>> Eric
>>>>>
>>>>> On 2023-04-26 22:21, Felix Kuehling wrote:
>>>>>> Hi Eric,
>>>>>>
>>>>>> Can you try if the attached patch fixes the problem without breaking
>>>>>> the eviction tests on a multi-GPU PCIe P2P system?
>>>>>>
>>>>>> Thanks,
>>>>>>    Felix
>>>>>>
>>>>>>
>>>>>> On 2023-04-26 13:02, Christian König wrote:
>>>>>>> Am 26.04.23 um 18:58 schrieb Felix Kuehling:
>>>>>>>> On 2023-04-26 9:03, Christian König wrote:
>>>>>>>>> Am 25.04.23 um 16:11 schrieb Eric Huang:
>>>>>>>>>> Hi Christian,
>>>>>>>>>>
>>>>>>>>>> What do you think about Felix's explanation?
>>>>>>>>> That's unfortunately not something we can do here.
>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>> Eric
>>>>>>>>>>
>>>>>>>>>> On 2023-04-13 09:28, Felix Kuehling wrote:
>>>>>>>>>>> Am 2023-04-13 um 07:35 schrieb Christian König:
>>>>>>>>>>>> Am 13.04.23 um 03:01 schrieb Felix Kuehling:
>>>>>>>>>>>>> Am 2023-04-12 um 18:25 schrieb Eric Huang:
>>>>>>>>>>>>>> It is to avoid redundant eviction for KFD's DMAbuf import bo
>>>>>>>>>>>>>> when dmaunmapping DMAbuf. The DMAbuf import bo has been 
>>>>>>>>>>>>>> set as
>>>>>>>>>>>>>> AMDGPU_PL_PREEMPT in KFD when mapping.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Signed-off-by: Eric Huang <jinhuieric.huang at amd.com>
>>>>>>>>>>>>> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'd like to get an Acked-by from Christian as well before
>>>>>>>>>>>>> submitting this.
>>>>>>>>>>>> I have to admit that I only partially followed the internal
>>>>>>>>>>>> discussion, but in general you need a *really* good 
>>>>>>>>>>>> explanation
>>>>>>>>>>>> for this.
>>>>>>>>>>>>
>>>>>>>>>>>> E.g. add code comment and explain in the commit message
>>>>>>>>>>>> extensively why this is needed and why there are no 
>>>>>>>>>>>> alternatives.
>>>>>>>>>>> OK. I'll give it a shot:
>>>>>>>>>>>
>>>>>>>>>>>     This code path is used among other things when invalidating
>>>>>>>>>>> DMABuf
>>>>>>>>>>>     imports. These imports share a reservation object with the
>>>>>>>>>>> exported
>>>>>>>>>>>     BO. Waiting on all the fences in this reservation will 
>>>>>>>>>>> trigger
>>>>>>>>>>> KFD
>>>>>>>>>>>     eviction fences unnecessarily, for example when a DMABuf
>>>>>>>>>>> import for
>>>>>>>>>>>     a DMA mapping on a secondary GPU is being unmapped 
>>>>>>>>>>> explicitly.
>>>>>>>>>>> Only
>>>>>>>>>>>     moving the original exported BO requires stopping KFD user
>>>>>>>>>>> mode
>>>>>>>>>>>     queues. If the invalidation is triggered through a move
>>>>>>>>>>> notifier
>>>>>>>>>>>     from the exported BO, then moving the original BO already
>>>>>>>>>>> triggered
>>>>>>>>>>>     the eviction fence and we don't need to wait for it 
>>>>>>>>>>> again on
>>>>>>>>>>> the import.
>>>>>>>>>>>
>>>>>>>>>>>     We can identify DMABuf imports in KFD for secondary GPU DMA
>>>>>>>>>>> mappings
>>>>>>>>>>>     by the mem_type AMDGPU_PL_PREEMPT. In this case, use a wait
>>>>>>>>>>>     operation that ignores KFD eviction fences.
>>>>>>>>>>>
>>>>>>>>>>> How does this sound?
>>>>>>>>> To be honest like quite a bad idea. Why in the world are imported
>>>>>>>>> BOs moved from GTT to SYSTEM in the first place?
>>>>>>>> As I understand it, the way to update SG tables in SG BOs (e.g.
>>>>>>>> userptr and dmabuf imports) is to move them back and forth between
>>>>>>>> system and GTT domains. If we left the import in the GTT domain 
>>>>>>>> all
>>>>>>>> the time, we would have no way to update it, e.g. after an 
>>>>>>>> eviction.
>>>>>>>> Currently the move to the system domain is done in the unmap 
>>>>>>>> code path.
>>>>>>>>
>>>>>>>> Before memory is freed, we also need to unmap it from GPUVM,
>>>>>>>> including the DMABuf imports on remote GPUs. For the above reason
>>>>>>>> that currently includes moving the import to the system domain. If
>>>>>>>> we removed that from the unmap code path, we'd need to do the move
>>>>>>>> to system somewhere else, maybe in the mapping/validation path.
>>>>>>>>
>>>>>>>>
>>>>>>>>> The only reason for this I can think of is that the DMA mappings
>>>>>>>>> become invalid for some reasons and in this case waiting for the
>>>>>>>>> KFD fence is actually the absolutely right thing to do.
>>>>>>>> In this case the reason the only reason for unmapping the 
>>>>>>>> memory is
>>>>>>>> that we're about to free the memory and its DMABuf imports on 
>>>>>>>> other
>>>>>>>> GPUs. This is coming from the application with a promise "I'm no
>>>>>>>> longer accessing the memory". We don't need to wait for fences 
>>>>>>>> here.
>>>>>>>> We only need to invalidate the PTEs to make sure that any further
>>>>>>>> buggy access by the application will fault.
>>>>>>> Well in this case just free the BO and it's bo_va structure. The 
>>>>>>> core
>>>>>>> handling should take care of clearing all the freed up regions.
>>>>>>>
>>>>>>> As for updating the SG of a BO you indeed need to move it from 
>>>>>>> GTT to
>>>>>>> SYSTEM and back, but in this case we should either indeed wait for
>>>>>>> the KFD fence since page tables in between the operation still have
>>>>>>> the old entries or we should destroy the BO and create a new 
>>>>>>> one. The
>>>>>>> later would overwrite the PTEs with invalid entries first and then
>>>>>>> fill in new valid ones.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Christian.
>>>>>>>
>>>>>>>> Regards,
>>>>>>>>    Felix
>>>>>>>>
>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Christian.
>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>>    Felix
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> Regards,
>>>>>>>>>>>> Christian.
>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>    Felix
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> ---
>>>>>>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 7 ++++++-
>>>>>>>>>>>>>>    1 file changed, 6 insertions(+), 1 deletion(-)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>>>>>>>>>>> index 2430f3e9f3a7..64795fe9eecb 100644
>>>>>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>>>>>>>>>>> @@ -526,7 +526,12 @@ static int amdgpu_bo_move(struct
>>>>>>>>>>>>>> ttm_buffer_object *bo, bool evict,
>>>>>>>>>>>>>>        if ((old_mem->mem_type == TTM_PL_TT ||
>>>>>>>>>>>>>>             old_mem->mem_type == AMDGPU_PL_PREEMPT) &&
>>>>>>>>>>>>>>            new_mem->mem_type == TTM_PL_SYSTEM) {
>>>>>>>>>>>>>> -        r = ttm_bo_wait_ctx(bo, ctx);
>>>>>>>>>>>>>> +        if (old_mem->mem_type == AMDGPU_PL_PREEMPT)
>>>>>>>>>>>>>> +            r = amdgpu_bo_sync_wait(abo,
>>>>>>>>>>>>>> + AMDGPU_FENCE_OWNER_KFD,
>>>>>>>>>>>>>> + ctx->interruptible);
>>>>>>>>>>>>>> +        else
>>>>>>>>>>>>>> +            r = ttm_bo_wait_ctx(bo, ctx);
>>>>>>>>>>>>>>            if (r)
>>>>>>>>>>>>>>                return r;
>>>>
>>



More information about the amd-gfx mailing list