[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:39:21 UTC 2021


On 11/8/21 09:08, Thomas Hellström wrote:
>
> 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...
>
Or actually, Thinking of it, if we don't have GEM pages, even if there 
are CPU PTEs set up, I can't see why we shouldn't purge this object 
immediately. I'll just revert that last hunk.

/Thomas



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


More information about the Intel-gfx mailing list