aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorDan Magenheimer <dan.magenheimer@oracle.com>2011-09-21 12:28:04 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-01-23 16:07:50 -0500
commit417fc2caef268ed23169316f6c5e3a33775bfae5 (patch)
tree5bf70792f749645518bf8d13ac4853afd300a808 /mm
parent91c6cc9b5c216bd067f9af2cc64fcbe190755865 (diff)
mm: cleancache: report statistics via debugfs instead of sysfs.
[v9: akpm@linux-foundation.org: sysfs->debugfs; no longer need Doc/ABI file] Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com> Signed-off-by: Konrad Wilk <konrad.wilk@oracle.com> Cc: Jan Beulich <JBeulich@novell.com> Acked-by: Seth Jennings <sjenning@linux.vnet.ibm.com> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Hugh Dickins <hughd@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Nitin Gupta <ngupta@vflare.org> Cc: Matthew Wilcox <matthew@wil.cx> Cc: Chris Mason <chris.mason@oracle.com> Cc: Rik Riel <riel@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/cleancache.c68
1 files changed, 22 insertions, 46 deletions
diff --git a/mm/cleancache.c b/mm/cleancache.c
index b9c198bc6980..deb9f2c06fb7 100644
--- a/mm/cleancache.c
+++ b/mm/cleancache.c
@@ -15,6 +15,7 @@
15#include <linux/fs.h> 15#include <linux/fs.h>
16#include <linux/exportfs.h> 16#include <linux/exportfs.h>
17#include <linux/mm.h> 17#include <linux/mm.h>
18#include <linux/debugfs.h>
18#include <linux/cleancache.h> 19#include <linux/cleancache.h>
19 20
20/* 21/*
@@ -33,11 +34,15 @@ EXPORT_SYMBOL(cleancache_enabled);
33 */ 34 */
34static struct cleancache_ops cleancache_ops; 35static struct cleancache_ops cleancache_ops;
35 36
36/* useful stats available in /sys/kernel/mm/cleancache */ 37/*
37static unsigned long cleancache_succ_gets; 38 * Counters available via /sys/kernel/debug/frontswap (if debugfs is
38static unsigned long cleancache_failed_gets; 39 * properly configured. These are for information only so are not protected
39static unsigned long cleancache_puts; 40 * against increment races.
40static unsigned long cleancache_flushes; 41 */
42static u64 cleancache_succ_gets;
43static u64 cleancache_failed_gets;
44static u64 cleancache_puts;
45static u64 cleancache_invalidates;
41 46
42/* 47/*
43 * register operations for cleancache, returning previous thus allowing 48 * register operations for cleancache, returning previous thus allowing
@@ -163,7 +168,7 @@ void __cleancache_invalidate_page(struct address_space *mapping,
163 if (cleancache_get_key(mapping->host, &key) >= 0) { 168 if (cleancache_get_key(mapping->host, &key) >= 0) {
164 (*cleancache_ops.invalidate_page)(pool_id, 169 (*cleancache_ops.invalidate_page)(pool_id,
165 key, page->index); 170 key, page->index);
166 cleancache_flushes++; 171 cleancache_invalidates++;
167 } 172 }
168 } 173 }
169} 174}
@@ -199,48 +204,19 @@ void __cleancache_invalidate_fs(struct super_block *sb)
199} 204}
200EXPORT_SYMBOL(__cleancache_invalidate_fs); 205EXPORT_SYMBOL(__cleancache_invalidate_fs);
201 206
202#ifdef CONFIG_SYSFS
203
204/* see Documentation/ABI/xxx/sysfs-kernel-mm-cleancache */
205
206#define CLEANCACHE_SYSFS_RO(_name) \
207 static ssize_t cleancache_##_name##_show(struct kobject *kobj, \
208 struct kobj_attribute *attr, char *buf) \
209 { \
210 return sprintf(buf, "%lu\n", cleancache_##_name); \
211 } \
212 static struct kobj_attribute cleancache_##_name##_attr = { \
213 .attr = { .name = __stringify(_name), .mode = 0444 }, \
214 .show = cleancache_##_name##_show, \
215 }
216
217CLEANCACHE_SYSFS_RO(succ_gets);
218CLEANCACHE_SYSFS_RO(failed_gets);
219CLEANCACHE_SYSFS_RO(puts);
220CLEANCACHE_SYSFS_RO(flushes);
221
222static struct attribute *cleancache_attrs[] = {
223 &cleancache_succ_gets_attr.attr,
224 &cleancache_failed_gets_attr.attr,
225 &cleancache_puts_attr.attr,
226 &cleancache_flushes_attr.attr,
227 NULL,
228};
229
230static struct attribute_group cleancache_attr_group = {
231 .attrs = cleancache_attrs,
232 .name = "cleancache",
233};
234
235#endif /* CONFIG_SYSFS */
236
237static int __init init_cleancache(void) 207static int __init init_cleancache(void)
238{ 208{
239#ifdef CONFIG_SYSFS 209#ifdef CONFIG_DEBUG_FS
240 int err; 210 struct dentry *root = debugfs_create_dir("cleancache", NULL);
241 211 if (root == NULL)
242 err = sysfs_create_group(mm_kobj, &cleancache_attr_group); 212 return -ENXIO;
243#endif /* CONFIG_SYSFS */ 213 debugfs_create_u64("succ_gets", S_IRUGO, root, &cleancache_succ_gets);
214 debugfs_create_u64("failed_gets", S_IRUGO,
215 root, &cleancache_failed_gets);
216 debugfs_create_u64("puts", S_IRUGO, root, &cleancache_puts);
217 debugfs_create_u64("invalidates", S_IRUGO,
218 root, &cleancache_invalidates);
219#endif
244 return 0; 220 return 0;
245} 221}
246module_init(init_cleancache) 222module_init(init_cleancache)