diff options
author | David Howells <dhowells@redhat.com> | 2009-04-03 11:42:43 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2009-04-03 11:42:43 -0400 |
commit | 6a51091d0775cdc4a923f2172c61925ad416aa32 (patch) | |
tree | 288fafe724eee5a0c67ff4c9bd437d35d3bbb9ab | |
parent | d599064a1bca7bcbaabe54b94fa73ea86952cae3 (diff) |
NFS: Add some new I/O counters for FS-Cache doing things for NFS
Add some new NFS I/O counters for FS-Cache doing things for NFS. A new line is
emitted into /proc/pid/mountstats if caching is enabled that looks like:
fsc: <rok> <rfl> <wok> <wfl> <unc>
Where <rok> is the number of pages read successfully from the cache, <rfl> is
the number of failed page reads against the cache, <wok> is the number of
successful page writes to the cache, <wfl> is the number of failed page writes
to the cache, and <unc> is the number of NFS pages that have been disconnected
from the cache.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Steve Dickson <steved@redhat.com>
Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
-rw-r--r-- | fs/nfs/iostat.h | 18 | ||||
-rw-r--r-- | fs/nfs/super.c | 11 | ||||
-rw-r--r-- | include/linux/nfs_iostat.h | 12 |
3 files changed, 41 insertions, 0 deletions
diff --git a/fs/nfs/iostat.h b/fs/nfs/iostat.h index a36952810032..a2ab2529b5ca 100644 --- a/fs/nfs/iostat.h +++ b/fs/nfs/iostat.h | |||
@@ -16,6 +16,9 @@ | |||
16 | 16 | ||
17 | struct nfs_iostats { | 17 | struct nfs_iostats { |
18 | unsigned long long bytes[__NFSIOS_BYTESMAX]; | 18 | unsigned long long bytes[__NFSIOS_BYTESMAX]; |
19 | #ifdef CONFIG_NFS_FSCACHE | ||
20 | unsigned long long fscache[__NFSIOS_FSCACHEMAX]; | ||
21 | #endif | ||
19 | unsigned long events[__NFSIOS_COUNTSMAX]; | 22 | unsigned long events[__NFSIOS_COUNTSMAX]; |
20 | } ____cacheline_aligned; | 23 | } ____cacheline_aligned; |
21 | 24 | ||
@@ -57,6 +60,21 @@ static inline void nfs_add_stats(const struct inode *inode, | |||
57 | nfs_add_server_stats(NFS_SERVER(inode), stat, addend); | 60 | nfs_add_server_stats(NFS_SERVER(inode), stat, addend); |
58 | } | 61 | } |
59 | 62 | ||
63 | #ifdef CONFIG_NFS_FSCACHE | ||
64 | static inline void nfs_add_fscache_stats(struct inode *inode, | ||
65 | enum nfs_stat_fscachecounters stat, | ||
66 | unsigned long addend) | ||
67 | { | ||
68 | struct nfs_iostats *iostats; | ||
69 | int cpu; | ||
70 | |||
71 | cpu = get_cpu(); | ||
72 | iostats = per_cpu_ptr(NFS_SERVER(inode)->io_stats, cpu); | ||
73 | iostats->fscache[stat] += addend; | ||
74 | put_cpu_no_resched(); | ||
75 | } | ||
76 | #endif | ||
77 | |||
60 | static inline struct nfs_iostats *nfs_alloc_iostats(void) | 78 | static inline struct nfs_iostats *nfs_alloc_iostats(void) |
61 | { | 79 | { |
62 | return alloc_percpu(struct nfs_iostats); | 80 | return alloc_percpu(struct nfs_iostats); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 87f65ae07f32..b5fea776a0dc 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -642,6 +642,10 @@ static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) | |||
642 | totals.events[i] += stats->events[i]; | 642 | totals.events[i] += stats->events[i]; |
643 | for (i = 0; i < __NFSIOS_BYTESMAX; i++) | 643 | for (i = 0; i < __NFSIOS_BYTESMAX; i++) |
644 | totals.bytes[i] += stats->bytes[i]; | 644 | totals.bytes[i] += stats->bytes[i]; |
645 | #ifdef CONFIG_NFS_FSCACHE | ||
646 | for (i = 0; i < __NFSIOS_FSCACHEMAX; i++) | ||
647 | totals.fscache[i] += stats->fscache[i]; | ||
648 | #endif | ||
645 | 649 | ||
646 | preempt_enable(); | 650 | preempt_enable(); |
647 | } | 651 | } |
@@ -652,6 +656,13 @@ static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) | |||
652 | seq_printf(m, "\n\tbytes:\t"); | 656 | seq_printf(m, "\n\tbytes:\t"); |
653 | for (i = 0; i < __NFSIOS_BYTESMAX; i++) | 657 | for (i = 0; i < __NFSIOS_BYTESMAX; i++) |
654 | seq_printf(m, "%Lu ", totals.bytes[i]); | 658 | seq_printf(m, "%Lu ", totals.bytes[i]); |
659 | #ifdef CONFIG_NFS_FSCACHE | ||
660 | if (nfss->options & NFS_OPTION_FSCACHE) { | ||
661 | seq_printf(m, "\n\tfsc:\t"); | ||
662 | for (i = 0; i < __NFSIOS_FSCACHEMAX; i++) | ||
663 | seq_printf(m, "%Lu ", totals.bytes[i]); | ||
664 | } | ||
665 | #endif | ||
655 | seq_printf(m, "\n"); | 666 | seq_printf(m, "\n"); |
656 | 667 | ||
657 | rpc_print_iostats(m, nfss->client); | 668 | rpc_print_iostats(m, nfss->client); |
diff --git a/include/linux/nfs_iostat.h b/include/linux/nfs_iostat.h index 1cb9a3fed2b3..68b10f5f8907 100644 --- a/include/linux/nfs_iostat.h +++ b/include/linux/nfs_iostat.h | |||
@@ -116,4 +116,16 @@ enum nfs_stat_eventcounters { | |||
116 | __NFSIOS_COUNTSMAX, | 116 | __NFSIOS_COUNTSMAX, |
117 | }; | 117 | }; |
118 | 118 | ||
119 | /* | ||
120 | * NFS local caching servicing counters | ||
121 | */ | ||
122 | enum nfs_stat_fscachecounters { | ||
123 | NFSIOS_FSCACHE_PAGES_READ_OK, | ||
124 | NFSIOS_FSCACHE_PAGES_READ_FAIL, | ||
125 | NFSIOS_FSCACHE_PAGES_WRITTEN_OK, | ||
126 | NFSIOS_FSCACHE_PAGES_WRITTEN_FAIL, | ||
127 | NFSIOS_FSCACHE_PAGES_UNCACHED, | ||
128 | __NFSIOS_FSCACHEMAX, | ||
129 | }; | ||
130 | |||
119 | #endif /* _LINUX_NFS_IOSTAT */ | 131 | #endif /* _LINUX_NFS_IOSTAT */ |