Re: [f2fs-dev] [PATCH v7 11/12] f2fs: cache: introduce tracepoints

From: Zhiguo Niu

Date: Mon Sep 14 2026 - 05:49:08 EST


Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx>
于2026年9月12日周六 07:28写道:
>
> From: Chao Yu <chao@xxxxxxxxxx>
>
> This patch introduces ftrace tracepoints to observe and profile metadata
> cache operations:
> - trace_f2fs_cache_set_dirty to trace marking a cached block dirty
> - trace_f2fs_write_cache to trace single block writeback submission
> - trace_f2fs_write_caches to tracesbatch writeback and sync sessions
>
> Signed-off-by: Chao Yu <chao@xxxxxxxxxx>
> ---
> fs/f2fs/cache.c | 3 ++
> fs/f2fs/checkpoint.c | 6 ++++
> fs/f2fs/segment.c | 3 ++
> include/trace/events/f2fs.h | 71 +++++++++++++++++++++++++++++++++++++
> 4 files changed, 83 insertions(+)
>
> diff --git a/fs/f2fs/cache.c b/fs/f2fs/cache.c
> index dcab0f321730..33da3f243783 100644
> --- a/fs/f2fs/cache.c
> +++ b/fs/f2fs/cache.c
> @@ -15,6 +15,7 @@
> #include "f2fs.h"
> #include "cache.h"
> #include "node.h"
> +#include <trace/events/f2fs.h>
> #include "segment.h"
>
> void f2fs_cache_wait_writeback_cond(struct f2fs_cached_block *entry,
> @@ -73,6 +74,8 @@ bool f2fs_mark_cache_dirty(struct f2fs_cached_block *entry)
> enum count_type type = IS_META_CACHE(cache) ?
> F2FS_DIRTY_META : F2FS_DIRTY_NODES;
>
> + trace_f2fs_cache_set_dirty(entry,
> + IS_META_CACHE(cache) ? META : NODE);
> f2fs_cache_update_tag(entry, F2FS_CACHE_TAG_NONE,
> F2FS_CACHE_TAG_DIRTY);
> inc_page_count(cache->sbi, type);
> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> index 40a96eb9179c..2542b1a29989 100644
> --- a/fs/f2fs/checkpoint.c
> +++ b/fs/f2fs/checkpoint.c
> @@ -550,6 +550,8 @@ static bool __f2fs_write_meta_cache(struct f2fs_cached_block *entry,
> {
> struct f2fs_sb_info *sbi = entry->cache->sbi;
>
> + trace_f2fs_write_cache(entry, META);
> +
> if (unlikely(f2fs_cp_error(sbi))) {
> if (is_sbi_flag_set(sbi, SBI_IS_CLOSE)) {
> f2fs_cache_clear_uptodate(entry);
> @@ -611,6 +613,8 @@ long f2fs_sync_meta_caches(struct f2fs_sb_info *sbi, long nr_to_write,
> struct blk_plug plug;
> bool background = nr_to_write != LONG_MAX;
>
> + trace_f2fs_write_caches(sbi, nr_to_write, 0, META);
> +
> blk_start_plug(&plug);
>
> while ((nr = f2fs_cache_gang_lookup_tag(META_CACHE(sbi), entries,
> @@ -666,6 +670,8 @@ long f2fs_sync_meta_caches(struct f2fs_sb_info *sbi, long nr_to_write,
>
> blk_finish_plug(&plug);
>
> + trace_f2fs_write_caches(sbi, nr_to_write, nwritten, META);
> +
> return nwritten;
> }
>
> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> index 87e24d0306e8..15cffbb5b407 100644
> --- a/fs/f2fs/segment.c
> +++ b/fs/f2fs/segment.c
> @@ -4226,6 +4226,9 @@ void f2fs_do_write_node_cache(unsigned int nid, struct f2fs_io_info *fio)
Hi Chao,
Do we also need to add tracepoints in f2fs_writeback_node_caches??
thanks!
> {
> struct f2fs_summary sum;
>
> + if (fio->is_cache)
> + trace_f2fs_write_cache(fio->cache_entry, NODE);
> +
> set_summary(&sum, nid, 0, 0);
> do_write_block(&sum, fio);
>
> diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
> index d53be932df01..df4cd346ae72 100644
> --- a/include/trace/events/f2fs.h
> +++ b/include/trace/events/f2fs.h
> @@ -1430,6 +1430,50 @@ DEFINE_EVENT(f2fs__folio, f2fs_set_page_dirty,
> TP_ARGS(folio, type)
> );
>
> +DECLARE_EVENT_CLASS(f2fs__cached_block,
> +
> + TP_PROTO(struct f2fs_cached_block *block, int type),
> +
> + TP_ARGS(block, type),
> +
> + TP_STRUCT__entry(
> + __field(dev_t, dev)
> + __field(pgoff_t, index)
> + __field(int, type)
> + __field(int, dirty)
> + __field(int, uptodate)
> + ),
> +
> + TP_fast_assign(
> + __entry->dev = block->cache->sbi->sb->s_dev;
> + __entry->index = block->index;
> + __entry->type = type;
> + __entry->dirty = f2fs_cache_test_dirty(block);
> + __entry->uptodate = f2fs_cache_test_uptodate(block);
> + ),
> +
> + TP_printk("dev = (%d,%d), %s, index = %lu, dirty = %d, uptodate = %d",
> + show_dev(__entry->dev),
> + show_block_type(__entry->type),
> + (unsigned long)__entry->index,
> + __entry->dirty,
> + __entry->uptodate)
> +);
> +
> +DEFINE_EVENT(f2fs__cached_block, f2fs_write_cache,
> +
> + TP_PROTO(struct f2fs_cached_block *block, int type),
> +
> + TP_ARGS(block, type)
> +);
> +
> +DEFINE_EVENT(f2fs__cached_block, f2fs_cache_set_dirty,
> +
> + TP_PROTO(struct f2fs_cached_block *block, int type),
> +
> + TP_ARGS(block, type)
> +);
> +
> TRACE_EVENT(f2fs_replace_atomic_write_block,
>
> TP_PROTO(struct inode *inode, struct inode *cow_inode, pgoff_t index,
> @@ -1574,6 +1618,33 @@ TRACE_EVENT(f2fs_writepages,
> __entry->for_sync)
> );
>
> +TRACE_EVENT(f2fs_write_caches,
> +
> + TP_PROTO(struct f2fs_sb_info *sbi, long nr_to_write, long nwritten, int type),
> +
> + TP_ARGS(sbi, nr_to_write, nwritten, type),
> +
> + TP_STRUCT__entry(
> + __field(dev_t, dev)
> + __field(long, nr_to_write)
> + __field(long, nwritten)
> + __field(int, type)
> + ),
> +
> + TP_fast_assign(
> + __entry->dev = sbi->sb->s_dev;
> + __entry->nr_to_write = nr_to_write;
> + __entry->nwritten = nwritten;
> + __entry->type = type;
> + ),
> +
> + TP_printk("dev = (%d,%d), %s, nr_to_write = %ld, nwritten = %ld",
> + show_dev(__entry->dev),
> + show_block_type(__entry->type),
> + __entry->nr_to_write,
> + __entry->nwritten)
> +);
> +
> TRACE_EVENT(f2fs_readpages,
>
> TP_PROTO(struct inode *inode, pgoff_t start, unsigned int nrpage),
> --
> 2.49.0
>
>
>
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel