[PATCH] drm/ttm: stop warning on TT shrinker failure

Christian König ckoenig.leichtzumerken at gmail.com
Sat Mar 20 09:04:31 UTC 2021


Am 19.03.21 um 20:06 schrieb Daniel Vetter:
> On Fri, Mar 19, 2021 at 07:53:48PM +0100, Christian König wrote:
>> Am 19.03.21 um 18:52 schrieb Daniel Vetter:
>>> On Fri, Mar 19, 2021 at 03:08:57PM +0100, Christian König wrote:
>>>> Don't print a warning when we fail to allocate a page for swapping things out.
>>>>
>>>> Also rely on memalloc_nofs_save/memalloc_nofs_restore instead of GFP_NOFS.
>>> Uh this part doesn't make sense. Especially since you only do it for the
>>> debugfs file, not in general. Which means you've just completely broken
>>> the shrinker.
>> Are you sure? My impression is that GFP_NOFS should now work much more out
>> of the box with the memalloc_nofs_save()/memalloc_nofs_restore().
> Yeah, if you'd put it in the right place :-)
>
> But also -mm folks are very clear that memalloc_no*() family is for dire
> situation where there's really no other way out. For anything where you
> know what you're doing, you really should use explicit gfp flags.

My impression is just the other way around. You should try to avoid the 
NOFS/NOIO flags and use the memalloc_no* approach instead.

>>> If this is just to paper over the seq_printf doing the wrong allocations,
>>> then just move that out from under the fs_reclaim_acquire/release part.
>> No, that wasn't the problem.
>>
>> We have just seen to many failures to allocate pages for swapout and I think
>> that would improve this because in a lot of cases we can then immediately
>> swap things out instead of having to rely on upper layers.
> Yeah, you broke it. Now the real shrinker is running with GFP_KERNEL,
> because your memalloc_no is only around the debugfs function. And ofc it's
> much easier to allocate with GFP_KERNEL, right until you deadlock :-)

The problem here is that for example kswapd calls the shrinker without 
holding a FS lock as far as I can see.

And it is rather sad that we can't optimize this case directly.

Anyway you are right if some caller doesn't use the memalloc_no*() 
approach we are busted.

Going to change the patch to only not warn for the moment.

Regards,
Christian.

>
> Shrinking is hard, there's no easy way out here.
>
> Cheers, Daniel
>
>> Regards,
>> Christian.
>>
>>
>>> __GFP_NOWARN should be there indeed I think.
>>> -Daniel
>>>
>>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>>> ---
>>>>    drivers/gpu/drm/ttm/ttm_tt.c | 5 ++++-
>>>>    1 file changed, 4 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
>>>> index 2f0833c98d2c..86fa3e82dacc 100644
>>>> --- a/drivers/gpu/drm/ttm/ttm_tt.c
>>>> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
>>>> @@ -369,7 +369,7 @@ static unsigned long ttm_tt_shrinker_scan(struct shrinker *shrink,
>>>>    	};
>>>>    	int ret;
>>>> -	ret = ttm_bo_swapout(&ctx, GFP_NOFS);
>>>> +	ret = ttm_bo_swapout(&ctx, GFP_KERNEL | __GFP_NOWARN);
>>>>    	return ret < 0 ? SHRINK_EMPTY : ret;
>>>>    }
>>>> @@ -389,10 +389,13 @@ static unsigned long ttm_tt_shrinker_count(struct shrinker *shrink,
>>>>    static int ttm_tt_debugfs_shrink_show(struct seq_file *m, void *data)
>>>>    {
>>>>    	struct shrink_control sc = { .gfp_mask = GFP_KERNEL };
>>>> +	unsigned int flags;
>>>>    	fs_reclaim_acquire(GFP_KERNEL);
>>>> +	flags = memalloc_nofs_save();
>>>>    	seq_printf(m, "%lu/%lu\n", ttm_tt_shrinker_count(&mm_shrinker, &sc),
>>>>    		   ttm_tt_shrinker_scan(&mm_shrinker, &sc));
>>>> +	memalloc_nofs_restore(flags);
>>>>    	fs_reclaim_release(GFP_KERNEL);
>>>>    	return 0;
>>>> -- 
>>>> 2.25.1
>>>>
>>>> _______________________________________________
>>>> dri-devel mailing list
>>>> dri-devel at lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel



More information about the dri-devel mailing list