1 From c0629d6013d038d0c6d484c0c5905274a4fe775f Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Thu, 3 Nov 2022 16:22:48 -0400
4 Subject: NFSD: Add an nfsd_file_fsync tracepoint
6 From: Chuck Lever <chuck.lever@oracle.com>
8 [ Upstream commit d7064eaf688cfe454c50db9f59298463d80d403c ]
10 Add a tracepoint to capture the number of filecache-triggered fsync
11 calls and which files needed it. Also, record when an fsync triggers
12 a write verifier reset.
16 <...>-97 [007] 262.505611: nfsd_file_free: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400
17 <...>-97 [007] 262.505612: nfsd_file_fsync: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400 ret=0
18 <...>-97 [007] 262.505623: nfsd_file_free: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00
19 <...>-97 [007] 262.505624: nfsd_file_fsync: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00 ret=0
21 Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
22 Reviewed-by: Jeff Layton <jlayton@kernel.org>
23 Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
25 fs/nfsd/filecache.c | 5 ++++-
26 fs/nfsd/trace.h | 31 +++++++++++++++++++++++++++++++
27 2 files changed, 35 insertions(+), 1 deletion(-)
29 diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
30 index 522e900a88605..6b8873b0c2c38 100644
31 --- a/fs/nfsd/filecache.c
32 +++ b/fs/nfsd/filecache.c
33 @@ -335,10 +335,13 @@ static void
34 nfsd_file_fsync(struct nfsd_file *nf)
36 struct file *file = nf->nf_file;
39 if (!file || !(file->f_mode & FMODE_WRITE))
41 - if (vfs_fsync(file, 1) != 0)
42 + ret = vfs_fsync(file, 1);
43 + trace_nfsd_file_fsync(nf, ret);
45 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id));
48 diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
49 index 2c72a666aa9c2..eb155e98a9dc2 100644
52 @@ -1237,6 +1237,37 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \
53 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed);
54 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed);
56 +TRACE_EVENT(nfsd_file_fsync,
58 + const struct nfsd_file *nf,
63 + __field(void *, nf_inode)
64 + __field(int, nf_ref)
66 + __field(unsigned long, nf_flags)
67 + __field(unsigned char, nf_may)
68 + __field(struct file *, nf_file)
71 + __entry->nf_inode = nf->nf_inode;
72 + __entry->nf_ref = refcount_read(&nf->nf_ref);
74 + __entry->nf_flags = nf->nf_flags;
75 + __entry->nf_may = nf->nf_may;
76 + __entry->nf_file = nf->nf_file;
78 + TP_printk("inode=%p ref=%d flags=%s may=%s nf_file=%p ret=%d",
81 + show_nf_flags(__entry->nf_flags),
82 + show_nfsd_may_flags(__entry->nf_may),
83 + __entry->nf_file, __entry->ret
89 TRACE_DEFINE_ENUM(RC_DROPIT);