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

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

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
Loading
Loading
Loading
Loading
+0 −11
Original line number Original line Diff line number Diff line
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
+2 −2
Original line number Original line Diff line number Diff line
@@ -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
+22 −46
Original line number Original line Diff line number Diff line
@@ -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)