Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NFSD: Add an nfsd_file_fsync tracepoint

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>

authored by

Chuck Lever and committed by
Chuck Lever
d7064eaf 3ed157d0

+35 -1
+4 -1
fs/nfsd/filecache.c
··· 336 336 nfsd_file_fsync(struct nfsd_file *nf) 337 337 { 338 338 struct file *file = nf->nf_file; 339 + int ret; 339 340 340 341 if (!file || !(file->f_mode & FMODE_WRITE)) 341 342 return; 342 - if (vfs_fsync(file, 1) != 0) 343 + ret = vfs_fsync(file, 1); 344 + trace_nfsd_file_fsync(nf, ret); 345 + if (ret) 343 346 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id)); 344 347 } 345 348
+31
fs/nfsd/trace.h
··· 1238 1238 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed); 1239 1239 DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed); 1240 1240 1241 + TRACE_EVENT(nfsd_file_fsync, 1242 + TP_PROTO( 1243 + const struct nfsd_file *nf, 1244 + int ret 1245 + ), 1246 + TP_ARGS(nf, ret), 1247 + TP_STRUCT__entry( 1248 + __field(void *, nf_inode) 1249 + __field(int, nf_ref) 1250 + __field(int, ret) 1251 + __field(unsigned long, nf_flags) 1252 + __field(unsigned char, nf_may) 1253 + __field(struct file *, nf_file) 1254 + ), 1255 + TP_fast_assign( 1256 + __entry->nf_inode = nf->nf_inode; 1257 + __entry->nf_ref = refcount_read(&nf->nf_ref); 1258 + __entry->ret = ret; 1259 + __entry->nf_flags = nf->nf_flags; 1260 + __entry->nf_may = nf->nf_may; 1261 + __entry->nf_file = nf->nf_file; 1262 + ), 1263 + TP_printk("inode=%p ref=%d flags=%s may=%s nf_file=%p ret=%d", 1264 + __entry->nf_inode, 1265 + __entry->nf_ref, 1266 + show_nf_flags(__entry->nf_flags), 1267 + show_nfsd_may_flags(__entry->nf_may), 1268 + __entry->nf_file, __entry->ret 1269 + ) 1270 + ); 1271 + 1241 1272 #include "cache.h" 1242 1273 1243 1274 TRACE_DEFINE_ENUM(RC_DROPIT);