[Intel-gfx] [PATCH] drm/i915/gem: Fix gem_madvise for ttm+shmem objects

Thomas Hellström thomas.hellstrom at linux.intel.com
Mon Nov 8 08:08:22 UTC 2021


On 11/5/21 16:18, Matthew Auld wrote:
> On 05/11/2021 13:03, Thomas Hellström wrote:
>> Gem-TTM objects that are backed by shmem might have populated
>> page-vectors without having the Gem pages set. Those objects
>> aren't moved to the correct shrinker / purge list by the
>> gem_madvise. Furthermore they are purged directly on
>> MADV_DONTNEED rather than waiting for the shrinker to do that.
>>
>> For such objects, identified by having the
>> _SELF_MANAGED_SHRINK_LIST set, make sure they end up on the
>> correct list and defer purging to the shrinker.
>>
>> Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
>> ---
>>   drivers/gpu/drm/i915/i915_gem.c | 6 ++++--
>>   1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_gem.c 
>> b/drivers/gpu/drm/i915/i915_gem.c
>> index d0e642c82064..da972c8d45b1 100644
>> --- a/drivers/gpu/drm/i915/i915_gem.c
>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>> @@ -1005,7 +1005,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, 
>> void *data,
>>               obj->ops->adjust_lru(obj);
>>       }
>>   -    if (i915_gem_object_has_pages(obj)) {
>> +    if (i915_gem_object_has_pages(obj) ||
>> +        i915_gem_object_has_self_managed_shrink_list(obj)) {
>
> Makes sense.
>
>>           unsigned long flags;
>>             spin_lock_irqsave(&i915->mm.obj_lock, flags);
>> @@ -1024,7 +1025,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, 
>> void *data,
>>         /* if the object is no longer attached, discard its backing 
>> storage */
>>       if (obj->mm.madv == I915_MADV_DONTNEED &&
>> -        !i915_gem_object_has_pages(obj))
>> +        !i915_gem_object_has_pages(obj) &&
>> +        !i915_gem_object_has_self_managed_shrink_list(obj))
>>           i915_gem_object_truncate(obj);
>
> And it looks like this also matches the workings of lmem, where under 
> memory pressure we also just purge such objects, instead of moving 
> them, making sure to keep them first in the LRU?
>
> One thing is to maybe immediately discard already swapped-out objects 
> here, since the shrinker will be oblivious to them, and they sort of 
> just linger in swap until the object is destroyed?

This might be a bit ugly if we want to avoid exposing even more gem 
object ops.

Could we perhaps for the truncate callback only truncate swapped-out 
objects if we have a self-managed shrinker list? That will match all the 
current call-sites AFAICT since truncate is never called from the 
shrinker  with the self-managed shrinker list...

/Thomas

>
>>         args->retained = obj->mm.madv != __I915_MADV_PURGED;
>>


More information about the Intel-gfx mailing list