aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRebecca Schultz Zavin2012-10-05 15:54:59 -0500
committerArve Hjønnevåg2013-02-19 19:55:33 -0600
commitca9e39d857d72d21a30dffdf9c36d33176916b62 (patch)
tree3302135d8423df15382a5da42d13c367a7314341
parentd7a5dc28b6234249077b4199e25f761706ffcd3e (diff)
downloadkernel-common-ca9e39d857d72d21a30dffdf9c36d33176916b62.tar.gz
kernel-common-ca9e39d857d72d21a30dffdf9c36d33176916b62.tar.xz
kernel-common-ca9e39d857d72d21a30dffdf9c36d33176916b62.zip
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: Rebecca Schultz Zavin <rebecca@android.com>
-rw-r--r--mm/vmscan.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 196709f5ee5..e31d09df9eb 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -42,6 +42,7 @@
42#include <linux/sysctl.h> 42#include <linux/sysctl.h>
43#include <linux/oom.h> 43#include <linux/oom.h>
44#include <linux/prefetch.h> 44#include <linux/prefetch.h>
45#include <linux/debugfs.h>
45 46
46#include <asm/tlbflush.h> 47#include <asm/tlbflush.h>
47#include <asm/div64.h> 48#include <asm/div64.h>
@@ -153,6 +154,40 @@ static unsigned long get_lru_size(struct lruvec *lruvec, enum lru_list lru)
153 return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru); 154 return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru);
154} 155}
155 156
157struct dentry *debug_file;
158
159static int debug_shrinker_show(struct seq_file *s, void *unused)
160{
161 struct shrinker *shrinker;
162 struct shrink_control sc;
163
164 sc.gfp_mask = -1;
165 sc.nr_to_scan = 0;
166
167 down_read(&shrinker_rwsem);
168 list_for_each_entry(shrinker, &shrinker_list, list) {
169 char name[64];
170 int num_objs;
171
172 num_objs = shrinker->shrink(shrinker, &sc);
173 seq_printf(s, "%pf %d\n", shrinker->shrink, num_objs);
174 }
175 up_read(&shrinker_rwsem);
176 return 0;
177}
178
179static int debug_shrinker_open(struct inode *inode, struct file *file)
180{
181 return single_open(file, debug_shrinker_show, inode->i_private);
182}
183
184static const struct file_operations debug_shrinker_fops = {
185 .open = debug_shrinker_open,
186 .read = seq_read,
187 .llseek = seq_lseek,
188 .release = single_release,
189};
190
156/* 191/*
157 * Add a shrinker callback to be called from the vm 192 * Add a shrinker callback to be called from the vm
158 */ 193 */
@@ -165,6 +200,15 @@ void register_shrinker(struct shrinker *shrinker)
165} 200}
166EXPORT_SYMBOL(register_shrinker); 201EXPORT_SYMBOL(register_shrinker);
167 202
203static int __init add_shrinker_debug(void)
204{
205 debugfs_create_file("shrinker", 0644, NULL, NULL,
206 &debug_shrinker_fops);
207 return 0;
208}
209
210late_initcall(add_shrinker_debug);
211
168/* 212/*
169 * Remove one 213 * Remove one
170 */ 214 */