diff options
Diffstat (limited to 'mm/vmscan.c')
| -rw-r--r-- | mm/vmscan.c | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index fa6a85378ee..5d41059e1e9 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -43,6 +43,7 @@  #include <linux/sysctl.h>  #include <linux/oom.h>  #include <linux/prefetch.h> +#include <linux/debugfs.h>  #include <asm/tlbflush.h>  #include <asm/div64.h> @@ -154,6 +155,39 @@ static unsigned long get_lru_size(struct lruvec *lruvec, enum lru_list lru)  	return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru);  } +struct dentry *debug_file; + +static int debug_shrinker_show(struct seq_file *s, void *unused) +{ +	struct shrinker *shrinker; +	struct shrink_control sc; + +	sc.gfp_mask = -1; +	sc.nr_to_scan = 0; + +	down_read(&shrinker_rwsem); +	list_for_each_entry(shrinker, &shrinker_list, list) { +		int num_objs; + +		num_objs = shrinker->shrink(shrinker, &sc); +		seq_printf(s, "%pf %d\n", shrinker->shrink, num_objs); +	} +	up_read(&shrinker_rwsem); +	return 0; +} + +static int debug_shrinker_open(struct inode *inode, struct file *file) +{ +        return single_open(file, debug_shrinker_show, inode->i_private); +} + +static const struct file_operations debug_shrinker_fops = { +        .open = debug_shrinker_open, +        .read = seq_read, +        .llseek = seq_lseek, +        .release = single_release, +}; +  /*   * Add a shrinker callback to be called from the vm   */ @@ -166,6 +200,15 @@ void register_shrinker(struct shrinker *shrinker)  }  EXPORT_SYMBOL(register_shrinker); +static int __init add_shrinker_debug(void) +{ +	debugfs_create_file("shrinker", 0644, NULL, NULL, +			    &debug_shrinker_fops); +	return 0; +} + +late_initcall(add_shrinker_debug); +  /*   * Remove one   */  |