Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f68c7efe authored by Rebecca Schultz Zavin's avatar Rebecca Schultz Zavin Committed by Ruchi Kandoi
Browse files

mm: vmscan: Add a debug file for shrinkers



This patch adds a debugfs file called "shrinker" when read this calls
all the shrinkers in the system with nr_to_scan set to zero and prints
the result.  These results are the number of objects the shrinkers have
available and can thus be used an indication of the total memory
that would be availble to the system if a shrink occurred.

Change-Id: Ied0ee7caff3d2fc1cb4bb839aaafee81b5b0b143
Signed-off-by: default avatarRebecca Schultz Zavin <rebecca@android.com>
parent 23246712
Loading
Loading
Loading
Loading
+43 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@
#include <linux/oom.h>
#include <linux/oom.h>
#include <linux/prefetch.h>
#include <linux/prefetch.h>
#include <linux/printk.h>
#include <linux/printk.h>
#include <linux/debugfs.h>


#include <asm/tlbflush.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
#include <asm/div64.h>
@@ -186,6 +187,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);
	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->count_objects(shrinker, &sc);
		seq_printf(s, "%pf %d\n", shrinker->scan_objects, 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.
 * Add a shrinker callback to be called from the vm.
 */
 */
@@ -215,6 +249,15 @@ int register_shrinker(struct shrinker *shrinker)
}
}
EXPORT_SYMBOL(register_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
 * Remove one
 */
 */