[PATCH 5/6] drm/amdgpu: always enable move threshold for BOs
Tvrtko Ursulin
tursulin at ursulin.net
Fri Jun 28 08:13:10 UTC 2024
Hey Christian,
Any thoughts on the below reply? Did I get it wrong or I found a
legitimate issue?
Regards,
Tvrtko
On 14/06/2024 17:06, Tvrtko Ursulin wrote:
>
> On 14/06/2024 10:53, Christian König wrote:
>>
>>>> if (domain & abo->preferred_domains &
>>>> AMDGPU_GEM_DOMAIN_VRAM &&
>>>> - !(adev->flags & AMD_IS_APU))
>>>> - places[c].flags |= TTM_PL_FLAG_FALLBACK;
>>>> + !(adev->flags & AMD_IS_APU)) {
>>>> + /*
>>>> + * When GTT is just an alternative to VRAM make sure
>>>> that we
>>>> + * only use it as fallback and still try to fill up
>>>> VRAM first.
>>>> + */
>>>> + if (abo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT)
>>>> + places[c].flags |= TTM_PL_FLAG_FALLBACK;
>>>> +
>>>> + /*
>>>> + * Enable GTT when the threshold of moved bytes is
>>>> + * reached. This prevents any non essential buffer move
>>>> + * when the links are already saturated.
>>>> + */
>>>> + places[c].flags |= TTM_PL_FLAG_MOVE_THRESHOLD;
>>>> + }
>>>
>>> For the APU case I *think* this works, but for discrete I am not sure
>>> yet.
>>
>> Agree, APUs are basically already fine as they are. VRAM is just used
>> so that it isn't wasted there.
>
> Well yeah it works, but because re-validation is broken so it cannot hit
> the broken migration budget. ;)
>
>>> As a side note and disclaimer, the TTM "resource compatible" logic
>>> has a half-life of about one week in my brain until I need to almost
>>> re-figure it all out. I don't know if it just me, but I find it
>>> really non-intuitive and almost like double, triple, or even
>>> quadruple negation way of thinking about things.
>>
>> Yeah I was also going back and forth between the different approaches
>> multiple times and just ended up in this implementation because it
>> seemed to do what I wanted to have.
>>
>> It's certainly not very intuitive what's going on here.
>>
>>>
>>> It is not helping that with this proposal you set threshold on just
>>> one of the possible object placements which further increases the
>>> asymmetry. For me intuitive thing would be that thresholds apply to
>>> the act of changing the current placement directly. Not indirectly
>>> via playing with one of the placement flags dynamically.
>>
>> Interesting idea, how would the handling then be? Currently we have
>> only the stages - 'don't evict' and 'evict'. Should we make it
>> something more like 'don't move', 'move', 'evict' ?
>
> Intuitively I would think "don't move" aligns with the "out of migration
> budget" concept.
>
> Since in this patch you add move_threshold to ttm_operation_context
> could it simply be used as the overall criteria if it is set?
>
> In a way like:
>
> 1. If the current placement is from the list of userspace supplied
> valid ones, and
> 2. Migration limit has been set, and
> 3. It is spent.
>
> -> Then just don't migrate, return "all is good" from ttm_bo_validate.
>
> Though I am not sure at the moment how that would interact with the
> amdgpu_evict_flags and placements userspace did not specify.
>
>>> Anyway, lets see.. So you set TTM_PL_FLAG_MOVE_THRESHOLD and
>>> TTM_PL_FLAG_FALLBACK on the GTT placement, with the logic that it
>>> will be considered compatible while under the migration budget?
>>>
>>> (Side note, the fact both flags are set I also find very difficult to
>>> mentally model.)
>>>
>>> Say a buffer was evicted to GTT already. What then brings it back to
>>> VRAM?
>>>
>>> The first subsequent ttm_bo_validate pass (!evicting) says GTT is
>>> fine (applicable) while ctx->bytes_moved < ctx->move_threshold, no?
>>> Isn't that the opposite of what would be required and causes nothing
>>> to be migrated back in? What am I missing?
>>
>> The flag says that GTT is fine when ctx->bytes_moved >=
>> ctx->move_threshold. The logic is exactly inverted to what you described.
>>
>> This way a BO will be moved back into VRAM as long as bytes moved
>> doesn't exceed the threshold.
>
> I'm afraid I need to sketch it out... If buffer is currently in GTT and
> placements are VRAM+GTT.
>
> ttm_bo_validate(evicting=false)
>
> 1st iteration:
> res=GTT != place=VRAM
> continue
>
> 2nd iteration:
> res=GTT == place=GTT+FALLBACK+THRESHOLD
>
> ttm_place_applicable(GTT)
> moved < threshold
> return true
>
> Buffer stays in GTT while under migration budget -> wrong, no? Or am I
> still confused?
>
> Regards,
>
> Tvrtko
>
>> Setting both flags has the effect of saying: It's ok that the BO stays
>> in GTT when you either above the move threshold or would have to evict
>> something.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Regards,
>>>
>>> Tvrtko
>>
More information about the dri-devel
mailing list