nfs: more in-depth tracing of writepage events

Add tracepoints to nfs_writepage_setup() and nfs_do_writepage().

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
Jeff Layton 2025-08-08 07:40:33 -04:00 committed by Anna Schumaker
parent 4a2d81714d
commit b6ef079fd9
2 changed files with 68 additions and 0 deletions

View File

@ -45,6 +45,23 @@
{ BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
{ BIT(NFS_INO_ODIRECT), "ODIRECT" })
#define nfs_show_wb_flags(v) \
__print_flags(v, "|", \
{ BIT(PG_BUSY), "BUSY" }, \
{ BIT(PG_MAPPED), "MAPPED" }, \
{ BIT(PG_FOLIO), "FOLIO" }, \
{ BIT(PG_CLEAN), "CLEAN" }, \
{ BIT(PG_COMMIT_TO_DS), "COMMIT_TO_DS" }, \
{ BIT(PG_INODE_REF), "INODE_REF" }, \
{ BIT(PG_HEADLOCK), "HEADLOCK" }, \
{ BIT(PG_TEARDOWN), "TEARDOWN" }, \
{ BIT(PG_UNLOCKPAGE), "UNLOCKPAGE" }, \
{ BIT(PG_UPTODATE), "UPTODATE" }, \
{ BIT(PG_WB_END), "WB_END" }, \
{ BIT(PG_REMOVE), "REMOVE" }, \
{ BIT(PG_CONTENDED1), "CONTENDED1" }, \
{ BIT(PG_CONTENDED2), "CONTENDED2" })
DECLARE_EVENT_CLASS(nfs_inode_event,
TP_PROTO(
const struct inode *inode
@ -1463,6 +1480,55 @@ TRACE_EVENT(nfs_writeback_done,
)
);
DECLARE_EVENT_CLASS(nfs_page_class,
TP_PROTO(
const struct nfs_page *req
),
TP_ARGS(req),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(u32, fhandle)
__field(u64, fileid)
__field(const struct nfs_page *__private, req)
__field(loff_t, offset)
__field(unsigned int, count)
__field(unsigned long, flags)
),
TP_fast_assign(
const struct inode *inode = folio_inode(req->wb_folio);
const struct nfs_inode *nfsi = NFS_I(inode);
__entry->dev = inode->i_sb->s_dev;
__entry->fileid = nfsi->fileid;
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
__entry->req = req;
__entry->offset = req_offset(req);
__entry->count = req->wb_bytes;
__entry->flags = req->wb_flags;
),
TP_printk(
"fileid=%02x:%02x:%llu fhandle=0x%08x req=%p offset=%lld count=%u flags=%s",
MAJOR(__entry->dev), MINOR(__entry->dev),
(unsigned long long)__entry->fileid, __entry->fhandle,
__entry->req, __entry->offset, __entry->count,
nfs_show_wb_flags(__entry->flags)
)
);
#define DEFINE_NFS_PAGE_EVENT(name) \
DEFINE_EVENT(nfs_page_class, name, \
TP_PROTO( \
const struct nfs_page *req \
), \
TP_ARGS(req))
DEFINE_NFS_PAGE_EVENT(nfs_writepage_setup);
DEFINE_NFS_PAGE_EVENT(nfs_do_writepage);
DECLARE_EVENT_CLASS(nfs_page_error_class,
TP_PROTO(
const struct inode *inode,

View File

@ -593,6 +593,7 @@ static int nfs_do_writepage(struct folio *folio, struct writeback_control *wbc,
if (IS_ERR(req))
return PTR_ERR(req);
trace_nfs_do_writepage(req);
nfs_folio_set_writeback(folio);
WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags));
@ -1095,6 +1096,7 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx,
req = nfs_setup_write_request(ctx, folio, offset, count);
if (IS_ERR(req))
return PTR_ERR(req);
trace_nfs_writepage_setup(req);
/* Update file length */
nfs_grow_file(folio, offset, count);
nfs_mark_uptodate(req);