Create some new stat counters appropriate to the reworked code. Signed-off-by: David Howells <dhowells@xxxxxxxxxx> --- fs/cachefiles/io.c | 2 ++ fs/fscache/Kconfig | 1 + fs/fscache/dispatcher.c | 6 ++++++ fs/fscache/internal.h | 8 ++++++-- fs/fscache/stats.c | 27 ++++++++++++++++++++++++--- include/linux/fscache-cache.h | 10 ++++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index c9866bd5e010..1060c1c57008 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -84,6 +84,7 @@ int cachefiles_read(struct fscache_op_resources *opr, __fscache_wait_for_operation(opr, FSCACHE_WANT_READ); fscache_count_io_operation(opr->object->cookie); + fscache_count_read(); /* If the caller asked us to seek for data before doing the read, then * we should do that now. If we find a gap, we fill it with zeros. @@ -233,6 +234,7 @@ int cachefiles_write(struct fscache_op_resources *opr, __fscache_wait_for_operation(opr, FSCACHE_WANT_WRITE); fscache_count_io_operation(opr->object->cookie); + fscache_count_write(); ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL); if (!ki) diff --git a/fs/fscache/Kconfig b/fs/fscache/Kconfig index b04f07160e5e..fe7f856a4037 100644 --- a/fs/fscache/Kconfig +++ b/fs/fscache/Kconfig @@ -14,6 +14,7 @@ config FSCACHE config FSCACHE_STATS bool "Gather statistical information on local caching" depends on FSCACHE && PROC_FS + select NETFS_STATS help This option causes statistical information to be gathered on local caching and exported through file: diff --git a/fs/fscache/dispatcher.c b/fs/fscache/dispatcher.c index 3d957e499da3..2663bd4b36e8 100644 --- a/fs/fscache/dispatcher.c +++ b/fs/fscache/dispatcher.c @@ -41,6 +41,8 @@ void fscache_dispatch(struct fscache_cookie *cookie, struct fscache_work *work; bool queued = false; + fscache_stat(&fscache_n_dispatch_count); + work = kzalloc(sizeof(struct fscache_work), GFP_KERNEL); if (work) { work->cookie = cookie; @@ -57,10 +59,13 @@ void fscache_dispatch(struct fscache_cookie *cookie, queued = true; } spin_unlock(&fscache_work_lock); + if (queued) + fscache_stat(&fscache_n_dispatch_deferred); } if (!queued) { kfree(work); + fscache_stat(&fscache_n_dispatch_inline); func(cookie, object, param); } } @@ -86,6 +91,7 @@ static int fscache_dispatcher(void *data) if (work) { work->func(work->cookie, work->object, work->param); + fscache_stat(&fscache_n_dispatch_in_pool); fscache_cookie_put(work->cookie, fscache_cookie_put_work); kfree(work); } diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h index 1721823b8cac..73568e84fe3d 100644 --- a/fs/fscache/internal.h +++ b/fs/fscache/internal.h @@ -221,6 +221,11 @@ extern atomic_t fscache_n_cache_stale_objects; extern atomic_t fscache_n_cache_retired_objects; extern atomic_t fscache_n_cache_culled_objects; +extern atomic_t fscache_n_dispatch_count; +extern atomic_t fscache_n_dispatch_deferred; +extern atomic_t fscache_n_dispatch_inline; +extern atomic_t fscache_n_dispatch_in_pool; + static inline void fscache_stat(atomic_t *stat) { atomic_inc(stat); @@ -233,10 +238,9 @@ static inline void fscache_stat_d(atomic_t *stat) #define __fscache_stat(stat) (stat) -int fscache_stats_show(struct seq_file *m, void *v); extern int __init fscache_proc_stats_init(void); -#else +#else #define __fscache_stat(stat) (NULL) #define fscache_stat(stat) do {} while (0) #define fscache_stat_d(stat) do {} while (0) diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c index bf2935571de5..952214305853 100644 --- a/fs/fscache/stats.c +++ b/fs/fscache/stats.c @@ -6,9 +6,9 @@ */ #define FSCACHE_DEBUG_LEVEL CACHE -#include <linux/module.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> +#include <linux/netfs.h> #include "internal.h" /* @@ -56,13 +56,22 @@ atomic_t fscache_n_cache_stale_objects; atomic_t fscache_n_cache_retired_objects; atomic_t fscache_n_cache_culled_objects; +atomic_t fscache_n_dispatch_count; +atomic_t fscache_n_dispatch_deferred; +atomic_t fscache_n_dispatch_inline; +atomic_t fscache_n_dispatch_in_pool; + +atomic_t fscache_n_read; +EXPORT_SYMBOL(fscache_n_read); +atomic_t fscache_n_write; +EXPORT_SYMBOL(fscache_n_write); + /* * display the general statistics */ -int fscache_stats_show(struct seq_file *m, void *v) +static int fscache_stats_show(struct seq_file *m, void *v) { seq_puts(m, "FS-Cache statistics\n"); - seq_printf(m, "Cookies: idx=%u dat=%u spc=%u\n", atomic_read(&fscache_n_cookie_index), atomic_read(&fscache_n_cookie_data), @@ -113,6 +122,18 @@ int fscache_stats_show(struct seq_file *m, void *v) atomic_read(&fscache_n_cache_stale_objects), atomic_read(&fscache_n_cache_retired_objects), atomic_read(&fscache_n_cache_culled_objects)); + + seq_printf(m, "Disp : n=%u il=%u df=%u pl=%u\n", + atomic_read(&fscache_n_dispatch_count), + atomic_read(&fscache_n_dispatch_inline), + atomic_read(&fscache_n_dispatch_deferred), + atomic_read(&fscache_n_dispatch_in_pool)); + + seq_printf(m, "IO : rd=%u wr=%u\n", + atomic_read(&fscache_n_read), + atomic_read(&fscache_n_write)); + + netfs_stats_show(m); return 0; } diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index 54625464a109..dacfda1d3c20 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h @@ -259,4 +259,14 @@ static inline void fscache_uncount_io_operation(struct fscache_cookie *cookie) extern void __fscache_wait_for_operation(struct fscache_op_resources *, enum fscache_want_stage); extern void __fscache_end_operation(struct fscache_op_resources *); +#ifdef CONFIG_FSCACHE_STATS +extern atomic_t fscache_n_read; +extern atomic_t fscache_n_write; +#define fscache_count_read() atomic_inc(&fscache_n_read) +#define fscache_count_write() atomic_inc(&fscache_n_write) +#else +#define fscache_count_read() do {} while(0) +#define fscache_count_write() do {} while(0) +#endif + #endif /* _LINUX_FSCACHE_CACHE_H */