From nobody Mon Jun 15 05:16:40 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E225D23EA8A for ; Wed, 8 Apr 2026 06:08:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775628541; cv=none; b=Czyvtnx4wTqJVz62B2hEklwJpgC+qz+bKq/frBy3P2MRzSFRxOsrEO1jIagLnoE3L+nleS7znf5DefJ7U++JNVZKanKMA80p/qVtlbcQj9oUYzHXOH/gdWx29lVn/Zmg1vaB2JKg/L30NmGWzs84RdSL94YBj0aTOKTdEdMyLIA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775628541; c=relaxed/simple; bh=8pR01LvlDdlU/lhABMzui/nBGyc4KE9R0WpaY3ENq8I=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=kUH65avk1shzOLATDiy7564V2UTR+QS+orsGx+NWJQfxGz+visp5Fl5t3tf4xez+qIbCvc5hBUe8CB76c+d6xYguK2+30LUwl08aawIONB4YUM8jOuLmHkAz95BDgeDo2iKOcbk/S2cGxinJbPV9o/ygribL/4gEDef1bIgHNCM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--chullee.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CHiGVHvn; arc=none smtp.client-ip=74.125.82.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--chullee.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CHiGVHvn" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1270dcd11c1so9905074c88.0 for ; Tue, 07 Apr 2026 23:08:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775628539; x=1776233339; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=/4VHAXQtt4UQjJS8apUAAIRIJDoen9TVa0cA30mWt+8=; b=CHiGVHvnUS/uAFJdZ7QHVdERJ2qIkLg+RpDOLXd9GXO8wrqgxlp4sNiXc052UwljLc vNi1lCoWqjhCmO3v5ibQerBrQ3fVqXZoCE/zM3hL9HiYG4rRN5FHEcILkoZkJffBy9XO xOZZbe81mZooZXY1hJJINza5FiPnwJzsqmzMxj5gpF5FxDrE0raDpNN7LVtEoc7xVC7j klviP2Lh9mDyo9U1tPyMybVsNn7CDajpRRSqT0wZczM35uDihqQSotjEnhxRp8t7u60V a/iifKYzOsuY+vHZFEbj9dMQawt24q2JOvSvN0Amppl1vl3L7etzu4oZ7gk3GsJwVUzf lxbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775628539; x=1776233339; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=/4VHAXQtt4UQjJS8apUAAIRIJDoen9TVa0cA30mWt+8=; b=LJcmn10yESv5mvbEAM9/WwJB8MRRbhJI5TSshKUZ4ZOCBAnMvNS5lnUxZ6ZJ7PfLjO FWrOwvTLl0TiOsEWdl8pCADI0vgMVBn1mm86SfpzQckhu6NvuGIrOqjBn8yB8Gk3o7zU f+FDEdlE8Ey4BsJ4gkecfXGnxgQU7uLQCz3KP5RPJGBTcvxiDTbnwesElecWkw0H8Tdb umJLhfFguOI5Eu8wOOV4o9StpDBlnImNu1VpJQ9bmqGDHy5mr11uVBzZA2ZF0GKDel2F ZxNmEc2Adh2E2JVqwYM63MxBaJlwgorkdGBmL4jWzlL7271DkFOIFfgXcJDpnfeG43qF A1qQ== X-Forwarded-Encrypted: i=1; AJvYcCXyVr5gQgdFXcFkYm4M+Uc0yogMO10FeyJ+aEtJdxjTyvBCcJqUnZ8/LJMqCrjJFLGuiJy8/0wn3gvLvfE=@vger.kernel.org X-Gm-Message-State: AOJu0Ywh7FyyIvl0BsjtMk5dFUPY7pFIWngk1zz6hdOcmrRDPx/H/Yov +wYQJ2pMpqJlQ7uYVuApJjg1NlEiUZq8YGReYGHIKSY6qTDIH8TL940X32rGSnEs+2jfi8xDHnf 74mnBAbe6vw== X-Received: from dlii40.prod.google.com ([2002:a05:7022:41a8:b0:12a:7a40:ea24]) (user=chullee job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6997:b0:128:cf75:42a3 with SMTP id a92af1059eb24-12bfb745b32mr9292926c88.21.1775628538712; Tue, 07 Apr 2026 23:08:58 -0700 (PDT) Date: Tue, 7 Apr 2026 23:08:40 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.53.0.1213.gd9a14994de-goog Message-ID: <20260408060840.316332-1-chullee@google.com> Subject: [PATCH] f2fs: add page-order information for large folio reads in iostat From: Daniel Lee To: Jaegeuk Kim , Chao Yu Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, Daniel Lee Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Track read folio counts by order in F2FS iostat sysfs and tracepoints. Signed-off-by: Daniel Lee --- fs/f2fs/data.c | 4 ++++ fs/f2fs/f2fs.h | 3 +++ fs/f2fs/iostat.c | 38 ++++++++++++++++++++++++++++++++++++- fs/f2fs/iostat.h | 4 ++++ include/trace/events/f2fs.h | 21 ++++++++++++++++---- 5 files changed, 65 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index a210a7a627c6..965d4e6443c6 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -2508,6 +2508,8 @@ static int f2fs_read_data_large_folio(struct inode *i= node, if (!folio) goto out; =20 + f2fs_update_read_folio_count(F2FS_I_SB(inode), folio); + folio_in_bio =3D false; index =3D folio->index; offset =3D 0; @@ -2682,6 +2684,8 @@ static int f2fs_mpage_readpages(struct inode *inode, = struct fsverity_info *vi, prefetchw(&folio->flags); } =20 + f2fs_update_read_folio_count(F2FS_I_SB(inode), folio); + #ifdef CONFIG_F2FS_FS_COMPRESSION index =3D folio->index; =20 diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 56c4af4b1737..e40b6b2784ee 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -10,6 +10,7 @@ =20 #include #include +#include #include #include #include @@ -2034,6 +2035,8 @@ struct f2fs_sb_info { unsigned long long iostat_count[NR_IO_TYPE]; unsigned long long iostat_bytes[NR_IO_TYPE]; unsigned long long prev_iostat_bytes[NR_IO_TYPE]; + unsigned long long iostat_read_folio_count[NR_PAGE_ORDERS]; + unsigned long long prev_iostat_read_folio_count[NR_PAGE_ORDERS]; bool iostat_enable; unsigned long iostat_next_period; unsigned int iostat_period_ms; diff --git a/fs/f2fs/iostat.c b/fs/f2fs/iostat.c index f8703038e1d8..ae265e3e9b2c 100644 --- a/fs/f2fs/iostat.c +++ b/fs/f2fs/iostat.c @@ -34,6 +34,7 @@ int __maybe_unused iostat_info_seq_show(struct seq_file *= seq, void *offset) { struct super_block *sb =3D seq->private; struct f2fs_sb_info *sbi =3D F2FS_SB(sb); + int i; =20 if (!sbi->iostat_enable) return 0; @@ -76,6 +77,12 @@ int __maybe_unused iostat_info_seq_show(struct seq_file = *seq, void *offset) IOSTAT_INFO_SHOW("fs node", FS_NODE_READ_IO); IOSTAT_INFO_SHOW("fs meta", FS_META_READ_IO); =20 + /* print read folio order stats */ + seq_printf(seq, "%-23s", "fs read folio order:"); + for (i =3D 0; i < NR_PAGE_ORDERS; i++) + seq_printf(seq, " %llu", sbi->iostat_read_folio_count[i]); + seq_putc(seq, '\n'); + /* print other IOs */ seq_puts(seq, "[OTHER]\n"); IOSTAT_INFO_SHOW("fs discard", FS_DISCARD_IO); @@ -113,6 +120,7 @@ static inline void __record_iostat_latency(struct f2fs_= sb_info *sbi) static inline void f2fs_record_iostat(struct f2fs_sb_info *sbi) { unsigned long long iostat_diff[NR_IO_TYPE]; + unsigned long long read_folio_count_diff[NR_PAGE_ORDERS]; int i; unsigned long flags; =20 @@ -133,9 +141,15 @@ static inline void f2fs_record_iostat(struct f2fs_sb_i= nfo *sbi) sbi->prev_iostat_bytes[i]; sbi->prev_iostat_bytes[i] =3D sbi->iostat_bytes[i]; } + + for (i =3D 0; i < NR_PAGE_ORDERS; i++) { + read_folio_count_diff[i] =3D sbi->iostat_read_folio_count[i] - + sbi->prev_iostat_read_folio_count[i]; + sbi->prev_iostat_read_folio_count[i] =3D sbi->iostat_read_folio_count[i]; + } spin_unlock_irqrestore(&sbi->iostat_lock, flags); =20 - trace_f2fs_iostat(sbi, iostat_diff); + trace_f2fs_iostat(sbi, iostat_diff, read_folio_count_diff); =20 __record_iostat_latency(sbi); } @@ -151,6 +165,10 @@ void f2fs_reset_iostat(struct f2fs_sb_info *sbi) sbi->iostat_bytes[i] =3D 0; sbi->prev_iostat_bytes[i] =3D 0; } + for (i =3D 0; i < NR_PAGE_ORDERS; i++) { + sbi->iostat_read_folio_count[i] =3D 0; + sbi->prev_iostat_read_folio_count[i] =3D 0; + } spin_unlock_irq(&sbi->iostat_lock); =20 spin_lock_irq(&sbi->iostat_lat_lock); @@ -165,6 +183,24 @@ static inline void __f2fs_update_iostat(struct f2fs_sb= _info *sbi, sbi->iostat_count[type]++; } =20 +void f2fs_update_read_folio_count(struct f2fs_sb_info *sbi, struct folio *= folio) +{ + unsigned int order =3D folio_order(folio); + unsigned long flags; + + if (!sbi->iostat_enable) + return; + + if (order >=3D NR_PAGE_ORDERS) + order =3D NR_PAGE_ORDERS - 1; + + spin_lock_irqsave(&sbi->iostat_lock, flags); + sbi->iostat_read_folio_count[order]++; + spin_unlock_irqrestore(&sbi->iostat_lock, flags); + + f2fs_record_iostat(sbi); +} + void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct inode *inode, enum iostat_type type, unsigned long long io_bytes) { diff --git a/fs/f2fs/iostat.h b/fs/f2fs/iostat.h index eb99d05cf272..2025225b5bed 100644 --- a/fs/f2fs/iostat.h +++ b/fs/f2fs/iostat.h @@ -34,6 +34,8 @@ extern int __maybe_unused iostat_info_seq_show(struct seq= _file *seq, extern void f2fs_reset_iostat(struct f2fs_sb_info *sbi); extern void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct inode *ino= de, enum iostat_type type, unsigned long long io_bytes); +extern void f2fs_update_read_folio_count(struct f2fs_sb_info *sbi, + struct folio *folio); =20 struct bio_iostat_ctx { struct f2fs_sb_info *sbi; @@ -68,6 +70,8 @@ extern void f2fs_destroy_iostat(struct f2fs_sb_info *sbi); #else static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct ino= de *inode, enum iostat_type type, unsigned long long io_bytes) {} +static inline void f2fs_update_read_folio_count(struct f2fs_sb_info *sbi, + struct folio *folio) {} static inline void iostat_update_and_unbind_ctx(struct bio *bio) {} static inline void iostat_alloc_and_bind_ctx(struct f2fs_sb_info *sbi, struct bio *bio, struct bio_post_read_ctx *ctx) {} diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 9364e6775562..49c6cbb6f989 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -2116,9 +2116,10 @@ DEFINE_EVENT(f2fs_zip_end, f2fs_decompress_pages_end, #ifdef CONFIG_F2FS_IOSTAT TRACE_EVENT(f2fs_iostat, =20 - TP_PROTO(struct f2fs_sb_info *sbi, unsigned long long *iostat), + TP_PROTO(struct f2fs_sb_info *sbi, unsigned long long *iostat, + unsigned long long *read_folio_count), =20 - TP_ARGS(sbi, iostat), + TP_ARGS(sbi, iostat, read_folio_count), =20 TP_STRUCT__entry( __field(dev_t, dev) @@ -2150,6 +2151,7 @@ TRACE_EVENT(f2fs_iostat, __field(unsigned long long, fs_mrio) __field(unsigned long long, fs_discard) __field(unsigned long long, fs_reset_zone) + __array(unsigned long long, read_folio_count, 16) ), =20 TP_fast_assign( @@ -2182,6 +2184,9 @@ TRACE_EVENT(f2fs_iostat, __entry->fs_mrio =3D iostat[FS_META_READ_IO]; __entry->fs_discard =3D iostat[FS_DISCARD_IO]; __entry->fs_reset_zone =3D iostat[FS_ZONE_RESET_IO]; + memset(__entry->read_folio_count, 0, sizeof(__entry->read_folio_count)); + memcpy(__entry->read_folio_count, read_folio_count, + sizeof(unsigned long long) * min_t(int, NR_PAGE_ORDERS, 16)); ), =20 TP_printk("dev =3D (%d,%d), " @@ -2194,7 +2199,9 @@ TRACE_EVENT(f2fs_iostat, "app [read=3D%llu (direct=3D%llu, buffered=3D%llu), mapped=3D%llu], " "compr(buffered=3D%llu, mapped=3D%llu)], " "fs [data=3D%llu, (gc_data=3D%llu, cdata=3D%llu), " - "node=3D%llu, meta=3D%llu]", + "node=3D%llu, meta=3D%llu], " + "read_folio_count [0=3D%llu, 1=3D%llu, 2=3D%llu, 3=3D%llu, 4=3D%llu, " + "5=3D%llu, 6=3D%llu, 7=3D%llu, 8=3D%llu, 9=3D%llu, 10=3D%llu]", show_dev(__entry->dev), __entry->app_wio, __entry->app_dio, __entry->app_bio, __entry->app_mio, __entry->app_bcdio, __entry->app_mcdio, __entry->fs_dio, __entry->fs_cdio, @@ -2205,7 +2212,13 @@ TRACE_EVENT(f2fs_iostat, __entry->app_rio, __entry->app_drio, __entry->app_brio, __entry->app_mrio, __entry->app_bcrio, __entry->app_mcrio, __entry->fs_drio, __entry->fs_gdrio, - __entry->fs_cdrio, __entry->fs_nrio, __entry->fs_mrio) + __entry->fs_cdrio, __entry->fs_nrio, __entry->fs_mrio, + __entry->read_folio_count[0], __entry->read_folio_count[1], + __entry->read_folio_count[2], __entry->read_folio_count[3], + __entry->read_folio_count[4], __entry->read_folio_count[5], + __entry->read_folio_count[6], __entry->read_folio_count[7], + __entry->read_folio_count[8], __entry->read_folio_count[9], + __entry->read_folio_count[10]) ); =20 #ifndef __F2FS_IOSTAT_LATENCY_TYPE --=20 2.53.0.1213.gd9a14994de-goog