]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfs: more in-depth tracing of writepage events
authorJeff Layton <jlayton@kernel.org>
Fri, 8 Aug 2025 11:40:33 +0000 (07:40 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Tue, 23 Sep 2025 17:28:19 +0000 (13:28 -0400)
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>
fs/nfs/nfstrace.h
fs/nfs/write.c

index 8965187d428563ec91388aea357c730b6c680ad9..2e21b2ad9458041705189c86c1982fa857941c90 100644 (file)
                        { 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,
index 18f8d7c9dbdd84a2cce79f73bb3ec81d0e203f55..669b5358205d6b41f299b781bee921d5970e94bd 100644 (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);