Commit 417fc2ca authored by Dan Magenheimer's avatar Dan Magenheimer Committed by Konrad Rzeszutek Wilk

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: default avatarDan Magenheimer <dan.magenheimer@oracle.com>
Signed-off-by: default avatarKonrad Wilk <konrad.wilk@oracle.com>
Cc: Jan Beulich <JBeulich@novell.com>
Acked-by: default avatarSeth 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>
parent 91c6cc9b
What: /sys/kernel/mm/cleancache/
Date: April 2011
Contact: Dan Magenheimer <dan.magenheimer@oracle.com>
Description:
/sys/kernel/mm/cleancache/ contains a number of files which
record a count of various cleancache operations
(sum across all filesystems):
succ_gets
failed_gets
puts
flushes
...@@ -84,8 +84,8 @@ lock the page to ensure serial behavior. ...@@ -84,8 +84,8 @@ lock the page to ensure serial behavior.
CLEANCACHE PERFORMANCE METRICS CLEANCACHE PERFORMANCE METRICS
Cleancache monitoring is done by sysfs files in the If properly configured, monitoring of cleancache is done via debugfs in
/sys/kernel/mm/cleancache directory. The effectiveness of cleancache the /sys/kernel/debug/mm/cleancache directory. The effectiveness of cleancache
can be measured (across all filesystems) with: can be measured (across all filesystems) with:
succ_gets - number of gets that were successful succ_gets - number of gets that were successful
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/exportfs.h> #include <linux/exportfs.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/debugfs.h>
#include <linux/cleancache.h> #include <linux/cleancache.h>
/* /*
...@@ -33,11 +34,15 @@ EXPORT_SYMBOL(cleancache_enabled); ...@@ -33,11 +34,15 @@ EXPORT_SYMBOL(cleancache_enabled);
*/ */
static struct cleancache_ops cleancache_ops; static struct cleancache_ops cleancache_ops;
/* useful stats available in /sys/kernel/mm/cleancache */ /*
static unsigned long cleancache_succ_gets; * Counters available via /sys/kernel/debug/frontswap (if debugfs is
static unsigned long cleancache_failed_gets; * properly configured. These are for information only so are not protected
static unsigned long cleancache_puts; * against increment races.
static unsigned long cleancache_flushes; */
static u64 cleancache_succ_gets;
static u64 cleancache_failed_gets;
static u64 cleancache_puts;
static u64 cleancache_invalidates;
/* /*
* register operations for cleancache, returning previous thus allowing * register operations for cleancache, returning previous thus allowing
...@@ -163,7 +168,7 @@ void __cleancache_invalidate_page(struct address_space *mapping, ...@@ -163,7 +168,7 @@ void __cleancache_invalidate_page(struct address_space *mapping,
if (cleancache_get_key(mapping->host, &key) >= 0) { if (cleancache_get_key(mapping->host, &key) >= 0) {
(*cleancache_ops.invalidate_page)(pool_id, (*cleancache_ops.invalidate_page)(pool_id,
key, page->index); key, page->index);
cleancache_flushes++; cleancache_invalidates++;
} }
} }
} }
...@@ -199,48 +204,19 @@ void __cleancache_invalidate_fs(struct super_block *sb) ...@@ -199,48 +204,19 @@ void __cleancache_invalidate_fs(struct super_block *sb)
} }
EXPORT_SYMBOL(__cleancache_invalidate_fs); EXPORT_SYMBOL(__cleancache_invalidate_fs);
#ifdef CONFIG_SYSFS
/* see Documentation/ABI/xxx/sysfs-kernel-mm-cleancache */
#define CLEANCACHE_SYSFS_RO(_name) \
static ssize_t cleancache_##_name##_show(struct kobject *kobj, \
struct kobj_attribute *attr, char *buf) \
{ \
return sprintf(buf, "%lu\n", cleancache_##_name); \
} \
static struct kobj_attribute cleancache_##_name##_attr = { \
.attr = { .name = __stringify(_name), .mode = 0444 }, \
.show = cleancache_##_name##_show, \
}
CLEANCACHE_SYSFS_RO(succ_gets);
CLEANCACHE_SYSFS_RO(failed_gets);
CLEANCACHE_SYSFS_RO(puts);
CLEANCACHE_SYSFS_RO(flushes);
static struct attribute *cleancache_attrs[] = {
&cleancache_succ_gets_attr.attr,
&cleancache_failed_gets_attr.attr,
&cleancache_puts_attr.attr,
&cleancache_flushes_attr.attr,
NULL,
};
static struct attribute_group cleancache_attr_group = {
.attrs = cleancache_attrs,
.name = "cleancache",
};
#endif /* CONFIG_SYSFS */
static int __init init_cleancache(void) static int __init init_cleancache(void)
{ {
#ifdef CONFIG_SYSFS #ifdef CONFIG_DEBUG_FS
int err; struct dentry *root = debugfs_create_dir("cleancache", NULL);
if (root == NULL)
err = sysfs_create_group(mm_kobj, &cleancache_attr_group); return -ENXIO;
#endif /* CONFIG_SYSFS */ debugfs_create_u64("succ_gets", S_IRUGO, root, &cleancache_succ_gets);
debugfs_create_u64("failed_gets", S_IRUGO,
root, &cleancache_failed_gets);
debugfs_create_u64("puts", S_IRUGO, root, &cleancache_puts);
debugfs_create_u64("invalidates", S_IRUGO,
root, &cleancache_invalidates);
#endif
return 0; return 0;
} }
module_init(init_cleancache) module_init(init_cleancache)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment