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>
This commit is contained in:
Dan Magenheimer
2011-09-21 12:28:04 -04:00
committed by Konrad Rzeszutek Wilk
parent 91c6cc9b5c
commit 417fc2caef
3 changed files with 24 additions and 59 deletions

View File

@@ -1,11 +0,0 @@
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

View File

@@ -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

View File

@@ -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);
*/ */
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,
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)
} }
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)