NFSD: Add an nfsd_file_fsync tracepoint
[ Upstream commit d7064eaf688cfe454c50db9f59298463d80d403c ] Add a tracepoint to capture the number of filecache-triggered fsync calls and which files needed it. Also, record when an fsync triggers a write verifier reset. Examples: <...>-97 [007] 262.505611: nfsd_file_free: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400 <...>-97 [007] 262.505612: nfsd_file_fsync: inode=0xffff888171e08140 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d2400 ret=0 <...>-97 [007] 262.505623: nfsd_file_free: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00 <...>-97 [007] 262.505624: nfsd_file_fsync: inode=0xffff888171e08dc0 ref=0 flags=GC may=WRITE nf_file=0xffff8881373d1e00 ret=0 Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0bb0fff135
commit
60297b262f
2 changed files with 35 additions and 1 deletions
|
@ -335,10 +335,13 @@ static void
|
|||
nfsd_file_fsync(struct nfsd_file *nf)
|
||||
{
|
||||
struct file *file = nf->nf_file;
|
||||
int ret;
|
||||
|
||||
if (!file || !(file->f_mode & FMODE_WRITE))
|
||||
return;
|
||||
if (vfs_fsync(file, 1) != 0)
|
||||
ret = vfs_fsync(file, 1);
|
||||
trace_nfsd_file_fsync(nf, ret);
|
||||
if (ret)
|
||||
nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id));
|
||||
}
|
||||
|
||||
|
|
|
@ -1151,6 +1151,37 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \
|
|||
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed);
|
||||
DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed);
|
||||
|
||||
TRACE_EVENT(nfsd_file_fsync,
|
||||
TP_PROTO(
|
||||
const struct nfsd_file *nf,
|
||||
int ret
|
||||
),
|
||||
TP_ARGS(nf, ret),
|
||||
TP_STRUCT__entry(
|
||||
__field(void *, nf_inode)
|
||||
__field(int, nf_ref)
|
||||
__field(int, ret)
|
||||
__field(unsigned long, nf_flags)
|
||||
__field(unsigned char, nf_may)
|
||||
__field(struct file *, nf_file)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->nf_inode = nf->nf_inode;
|
||||
__entry->nf_ref = refcount_read(&nf->nf_ref);
|
||||
__entry->ret = ret;
|
||||
__entry->nf_flags = nf->nf_flags;
|
||||
__entry->nf_may = nf->nf_may;
|
||||
__entry->nf_file = nf->nf_file;
|
||||
),
|
||||
TP_printk("inode=%p ref=%d flags=%s may=%s nf_file=%p ret=%d",
|
||||
__entry->nf_inode,
|
||||
__entry->nf_ref,
|
||||
show_nf_flags(__entry->nf_flags),
|
||||
show_nfsd_may_flags(__entry->nf_may),
|
||||
__entry->nf_file, __entry->ret
|
||||
)
|
||||
);
|
||||
|
||||
#include "cache.h"
|
||||
|
||||
TRACE_DEFINE_ENUM(RC_DROPIT);
|
||||
|
|
Loading…
Reference in a new issue