From: Darrick J. Wong <djwong@xxxxxxxxxx> Add a tracepoint so I can see where writeback is initiated. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- fs/xfs/xfs_aops.c | 19 ++++++++++++------- fs/xfs/xfs_trace.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 3001ddf48d6c6..1217ce197ad98 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -497,10 +497,11 @@ static const struct iomap_writeback_ops xfs_writeback_ops = { STATIC int xfs_vm_writepages( - struct address_space *mapping, - struct writeback_control *wbc) + struct address_space *mapping, + struct writeback_control *wbc) { - struct xfs_writepage_ctx wpc = { }; + struct xfs_writepage_ctx wpc = { }; + struct xfs_inode *ip = XFS_I(mapping->host); /* * Writing back data in a transaction context can result in recursive @@ -509,16 +510,20 @@ xfs_vm_writepages( if (WARN_ON_ONCE(current->journal_info)) return 0; - xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); + trace_xfs_vm_writepages(ip, wbc); + + xfs_iflags_clear(ip, XFS_ITRUNCATED); return iomap_writepages(mapping, wbc, &wpc.ctx, &xfs_writeback_ops); } STATIC int xfs_dax_writepages( - struct address_space *mapping, - struct writeback_control *wbc) + struct address_space *mapping, + struct writeback_control *wbc) { - struct xfs_inode *ip = XFS_I(mapping->host); + struct xfs_inode *ip = XFS_I(mapping->host); + + trace_xfs_dax_writepages(ip, wbc); xfs_iflags_clear(ip, XFS_ITRUNCATED); return dax_writeback_mapping_range(mapping, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 643cffaf3add2..39df20ae702c8 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1552,6 +1552,40 @@ DEFINE_IMAP_EVENT(xfs_map_blocks_alloc); DEFINE_IMAP_EVENT(xfs_iomap_alloc); DEFINE_IMAP_EVENT(xfs_iomap_found); +DECLARE_EVENT_CLASS(xfs_writeback_class, + TP_PROTO(struct xfs_inode *ip, const struct writeback_control *wbc), + TP_ARGS(ip, wbc), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(loff_t, range_start) + __field(loff_t, range_end) + __field(long, nr_to_write) + __field(enum writeback_sync_modes, sync_mode) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->range_start = wbc->range_start; + __entry->range_end = wbc->range_end; + __entry->nr_to_write = wbc->nr_to_write; + __entry->sync_mode = wbc->sync_mode; + ), + TP_printk("dev %d:%d ino 0x%llx range_start 0x%llx range_end 0x%llx nr_to_write %ld sync_mode %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->range_start, + __entry->range_end, + __entry->nr_to_write, + __entry->sync_mode) +); +#define DEFINE_WRITEBACK_EVENT(name) \ +DEFINE_EVENT(xfs_writeback_class, name, \ + TP_PROTO(struct xfs_inode *ip, const struct writeback_control *wbc), \ + TP_ARGS(ip, wbc)) +DEFINE_WRITEBACK_EVENT(xfs_vm_writepages); +DEFINE_WRITEBACK_EVENT(xfs_dax_writepages); + DECLARE_EVENT_CLASS(xfs_simple_io_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, u64 count), TP_ARGS(ip, offset, count),