]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: enhance tracepoints during the folios writeback
authorZhang Yi <yi.zhang@huawei.com>
Mon, 7 Jul 2025 14:08:09 +0000 (22:08 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 14 Jul 2025 03:41:51 +0000 (23:41 -0400)
After mpage_map_and_submit_extent() supports restarting handle if
credits are insufficient during allocating blocks, it is more likely to
exit the current mapping iteration and continue to process the current
processing partially mapped folio again. The existing tracepoints are
not sufficient to track this situation, so enhance the tracepoints to
track the writeback position and the return value before and after
submitting the folios.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20250707140814.542883-7-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c
include/trace/events/ext4.h

index 74b7ba2afb67994bf0d660d3162ce15b88eddae1..2b1d158b3f18f40a4ea18c381827fa502694beb6 100644 (file)
@@ -2933,7 +2933,8 @@ retry:
                }
                mpd->do_map = 1;
 
-               trace_ext4_da_write_pages(inode, mpd->start_pos, wbc);
+               trace_ext4_da_write_folios_start(inode, mpd->start_pos,
+                               mpd->next_pos, wbc);
                ret = mpage_prepare_extent_to_map(mpd);
                if (!ret && mpd->map.m_len)
                        ret = mpage_map_and_submit_extent(handle, mpd,
@@ -2971,6 +2972,8 @@ retry:
                } else
                        ext4_put_io_end(mpd->io_submit.io_end);
                mpd->io_submit.io_end = NULL;
+               trace_ext4_da_write_folios_end(inode, mpd->start_pos,
+                               mpd->next_pos, wbc, ret);
 
                if (ret == -ENOSPC && sbi->s_journal) {
                        /*
index 62d52997b5c64c9de365de88de64699893270afc..845451077c41863dbccfb1fc1f9c1d9288b16f73 100644 (file)
@@ -482,16 +482,17 @@ TRACE_EVENT(ext4_writepages,
                  (unsigned long) __entry->writeback_index)
 );
 
-TRACE_EVENT(ext4_da_write_pages,
-       TP_PROTO(struct inode *inode, loff_t start_pos,
+TRACE_EVENT(ext4_da_write_folios_start,
+       TP_PROTO(struct inode *inode, loff_t start_pos, loff_t next_pos,
                 struct writeback_control *wbc),
 
-       TP_ARGS(inode, start_pos, wbc),
+       TP_ARGS(inode, start_pos, next_pos, wbc),
 
        TP_STRUCT__entry(
                __field(        dev_t,  dev                     )
                __field(        ino_t,  ino                     )
                __field(       loff_t,  start_pos               )
+               __field(       loff_t,  next_pos                )
                __field(         long,  nr_to_write             )
                __field(          int,  sync_mode               )
        ),
@@ -500,16 +501,47 @@ TRACE_EVENT(ext4_da_write_pages,
                __entry->dev            = inode->i_sb->s_dev;
                __entry->ino            = inode->i_ino;
                __entry->start_pos      = start_pos;
+               __entry->next_pos       = next_pos;
                __entry->nr_to_write    = wbc->nr_to_write;
                __entry->sync_mode      = wbc->sync_mode;
        ),
 
-       TP_printk("dev %d,%d ino %lu start_pos 0x%llx nr_to_write %ld sync_mode %d",
+       TP_printk("dev %d,%d ino %lu start_pos 0x%llx next_pos 0x%llx nr_to_write %ld sync_mode %d",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
-                 (unsigned long) __entry->ino, __entry->start_pos,
+                 (unsigned long) __entry->ino, __entry->start_pos, __entry->next_pos,
                  __entry->nr_to_write, __entry->sync_mode)
 );
 
+TRACE_EVENT(ext4_da_write_folios_end,
+       TP_PROTO(struct inode *inode, loff_t start_pos, loff_t next_pos,
+                struct writeback_control *wbc, int ret),
+
+       TP_ARGS(inode, start_pos, next_pos, wbc, ret),
+
+       TP_STRUCT__entry(
+               __field(        dev_t,  dev                     )
+               __field(        ino_t,  ino                     )
+               __field(       loff_t,  start_pos               )
+               __field(       loff_t,  next_pos                )
+               __field(         long,  nr_to_write             )
+               __field(          int,  ret                     )
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = inode->i_sb->s_dev;
+               __entry->ino            = inode->i_ino;
+               __entry->start_pos      = start_pos;
+               __entry->next_pos       = next_pos;
+               __entry->nr_to_write    = wbc->nr_to_write;
+               __entry->ret            = ret;
+       ),
+
+       TP_printk("dev %d,%d ino %lu start_pos 0x%llx next_pos 0x%llx nr_to_write %ld ret %d",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 (unsigned long) __entry->ino, __entry->start_pos, __entry->next_pos,
+                 __entry->nr_to_write, __entry->ret)
+);
+
 TRACE_EVENT(ext4_da_write_pages_extent,
        TP_PROTO(struct inode *inode, struct ext4_map_blocks *map),