On Tue, Jan 19, 2021 at 01:18:20PM +0100, Christian König wrote: > Useful for testing. > > v2: add fs_reclaim_acquire()/_release() > > Signed-off-by: Christian König <christian.koenig@xxxxxxx> > --- > drivers/gpu/drm/ttm/ttm_pool.c | 53 ++++++++++++++++++++++------------ > 1 file changed, 35 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c > index 1d61e8fc0e81..98ecb9c9842c 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -33,6 +33,7 @@ > > #include <linux/module.h> > #include <linux/dma-mapping.h> > +#include <linux/sched/mm.h> > > #ifdef CONFIG_X86 > #include <asm/set_memory.h> > @@ -529,6 +530,28 @@ void ttm_pool_fini(struct ttm_pool *pool) > } > EXPORT_SYMBOL(ttm_pool_fini); > > +/* As long as pages are available make sure to release at least one */ > +static unsigned long ttm_pool_shrinker_scan(struct shrinker *shrink, > + struct shrink_control *sc) > +{ > + unsigned long num_freed = 0; > + > + do > + num_freed += ttm_pool_shrink(); > + while (!num_freed && atomic_long_read(&allocated_pages)); > + > + return num_freed; > +} > + > +/* Return the number of pages available or SHRINK_EMPTY if we have none */ > +static unsigned long ttm_pool_shrinker_count(struct shrinker *shrink, > + struct shrink_control *sc) > +{ > + unsigned long num_pages = atomic_long_read(&allocated_pages); > + > + return num_pages ? num_pages : SHRINK_EMPTY; > +} > + > #ifdef CONFIG_DEBUG_FS > /* Count the number of pages available in a pool_type */ > static unsigned int ttm_pool_type_count(struct ttm_pool_type *pt) > @@ -633,29 +656,21 @@ int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m) > } > EXPORT_SYMBOL(ttm_pool_debugfs); > > -#endif > - > -/* As long as pages are available make sure to release at least one */ > -static unsigned long ttm_pool_shrinker_scan(struct shrinker *shrink, > - struct shrink_control *sc) > +/* Test the shrinker functions and dump the result */ > +static int ttm_pool_debugfs_shrink_show(struct seq_file *m, void *data) > { > - unsigned long num_freed = 0; > + struct shrink_control sc = { .gfp_mask = GFP_NOFS }; > > - do > - num_freed += ttm_pool_shrink(); > - while (!num_freed && atomic_long_read(&allocated_pages)); > + fs_reclaim_acquire(GFP_KERNEL); > + seq_printf(m, "%lu/%lu\n", ttm_pool_shrinker_count(&mm_shrinker, &sc), > + ttm_pool_shrinker_scan(&mm_shrinker, &sc)); > + fs_reclaim_release(GFP_KERNEL); > > - return num_freed; > + return 0; > } > +DEFINE_SHOW_ATTRIBUTE(ttm_pool_debugfs_shrink); Shrinking everything is a bit a hammer, but probably the right size we need for testing :-) Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > > -/* Return the number of pages available or SHRINK_EMPTY if we have none */ > -static unsigned long ttm_pool_shrinker_count(struct shrinker *shrink, > - struct shrink_control *sc) > -{ > - unsigned long num_pages = atomic_long_read(&allocated_pages); > - > - return num_pages ? num_pages : SHRINK_EMPTY; > -} > +#endif > > /** > * ttm_pool_mgr_init - Initialize globals > @@ -688,6 +703,8 @@ int ttm_pool_mgr_init(unsigned long num_pages) > #ifdef CONFIG_DEBUG_FS > debugfs_create_file("page_pool", 0444, ttm_debugfs_root, NULL, > &ttm_pool_debugfs_globals_fops); > + debugfs_create_file("page_pool_shrink", 0400, ttm_debugfs_root, NULL, > + &ttm_pool_debugfs_shrink_fops); > #endif > > mm_shrinker.count_objects = ttm_pool_shrinker_count; > -- > 2.25.1 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel