From: Chao Yu <chao@kernel.org>
To: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: chao@kernel.org, linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 00/12] f2fs: introduce metadata cache
Date: Fri, 11 Sep 2026 08:16:04 +0800 [thread overview]
Message-ID: <3c1f769e-48b5-4c42-b876-48d1762667a9@kernel.org> (raw)
In-Reply-To: <aqMfy0vzj5lzOyde@google.com>
On 9/11/26 05:23, Jaegeuk Kim wrote:
> Chao, can you take a look at these patches?
>
> https://github.com/Sys-AI-Foundation/f2fs/commit/e22a482931fb57d8e093e6cc5617f1f0a35539f5
> https://github.com/Sys-AI-Foundation/f2fs/commit/902febb3650c6b5d63bc2d1f1e4a0b28b0796757
> https://github.com/Sys-AI-Foundation/f2fs/commit/4a7dd5420623701c12c814f74a1211a5f86bd89b
> https://github.com/Sys-AI-Foundation/f2fs/commit/f609f4b93bd68e3caabdfaf7442bd196bfca4d21
Jaegeuk, thanks for the cleanup.
Let me take a look, and refactor based on all patches.
Thanks,
>
> On 09/09, Chao Yu wrote:
>> This patchset introduces a self-managed metadata block cache in f2fs,
>> decoupling meta blocks, node blocks, and compressed data blocks from
>> the Linux VFS page cache and fake internal inodes.
>>
>> === 1. Background & Motivation ===
>>
>> Currently, F2FS uses fake VFS inodes (meta_inode, node_inode, and
>> compress_inode) to manage internal block caching through the VFS page
>> cache. Because of this implementation, the f2fs block size was
>> historically coupled to the kernel page size.
>>
>> We now want to unbind block size from page size to support configurations
>> where block size <= PAGE_SIZE (e.g., mounting a 4KB-block F2FS image on a
>> 16KB or 64KB page system).
>>
>> One possible approach is to continue using the VFS page cache to store
>> metadata blocks. However, doing so introduces three major architectural
>> issues (illustrated by a 4KB block on a 16KB page system):
>>
>> 1. Memory Overhead:
>> Metadata access patterns are typically random and sparse. Caching a
>> single 4KB metadata block inside a page cache folio forces the
>> allocation of an entire 16KB folio, resulting in 4x memory waste.
>>
>> 2. Folio and Sub-block Conversion Complexity:
>> Using larger folios requires tracking individual sub-block dirty/uptodate
>> states within each folio and performing index-to-offset conversions across
>> function boundaries. Because core metadata structures (e.g., f2fs_checkpoint,
>> f2fs_sit_block, f2fs_nat_block, f2fs_summary_block, f2fs_node) are accessed
>> extensively throughout the filesystem, this sub-block management and offset
>> calculation complexity would spread across the entire F2FS codebase.
>>
>> 3. Lock Contention:
>> Multiple independent node blocks (e.g., dnode blocks belonging to
>> different files) can reside within the same folio. Concurrent fsync()
>> calls on unrelated files would contend on the same folio_lock(),
>> serializing metadata updates and degrading multi-threaded performance.
>>
>> Decoupling metadata caching from PAGE_SIZE by allocating exact
>> block-sized cache entries is the critical first step toward supporting
>> 4KB-block F2FS images on 16KB/64KB page systems.
>>
>> === 2. Metadata Cache Architecture & Design ===
>>
>> This patchset introduces a dedicated, block-size-aligned caching
>> infrastructure with the following key components:
>>
>> - Block-Size Aligned Allocation:
>> Allocates memory buffers matching exactly the filesystem block size
>> (4KB or 16KB) via kzalloc(), fully independent of the host
>> architecture's PAGE_SIZE.
>>
>> - Radix Tree Indexing with Fast Tag Scanning:
>> Each cache instance (META_CACHE, NODE_CACHE, COMPRESS_CACHE) indexes
>> cached blocks via a radix tree (keyed by Physical Block Address for meta/
>> compress cache, and Node ID for node cache). Radix tree tags
>> (F2FS_CACHE_TAG_DIRTY, F2FS_CACHE_TAG_WRITEBACK) provide O(1) batch gang
>> lookups for flushing and writeback without dual-list shuffling.
>>
>> - Lightweight Bit-Locking:
>> Individual entries use atomic bit locks (F2FS_BLOCK_LOCKED via
>> wait_on_bit_lock() / clear_and_wake_up_bit()) rather than heavyweight
>> embedded mutexes/semaphores, minimizing memory footprint per entry.
>>
>> - Direct BIO Read/Write & BIO Merging:
>> Decouples metadata/node I/O from VFS address spaces by submitting direct
>> BIOs (f2fs_submit_cache_read / f2fs_submit_cache_write) with chained
>> adjacent vector merging (entry->next_entry) and dedicated completion
>> handlers.
>>
>> - Memory Reclamation Shrinker:
>> Integrates with the kernel shrinker subsystem via a 3-phase isolation
>> algorithm (isolate unreferenced clean entries -> truncate from radix tree
>> under lock -> splice un-reclaimed entries back to LRU) to safely reclaim
>> clean cached blocks under system memory pressure.
>>
>> - Background Writeback Kthread & Checkpoint Integration:
>> Provides a dedicated background kthread (f2fs_writeback-X:Y) for periodic
>> dirty cache flushing, combined with synchronous flushing during checkpoint
>> commit.
>>
>> - Fault Injection, Tracepoints & Debugfs Observability:
>> Integrates FAULT_KALLOC fault injection, tracepoints for cache state
>> transitions and batch writeback, and per-cache memory breakdowns in debugfs.
>>
>> === 3. Patchset Organization ===
>>
>> - Patch 01: Implement the core metadata cache infrastructure & direct BIO I/O.
>> - Patch 02: Initialize and teardown META_CACHE in sb_info.
>> - Patch 03: Integrate metadata cache into the memory shrinker subsystem.
>> - Patch 04: Introduce the background writeback kernel thread.
>> - Patch 05: Migrate metadata block caching (SIT, NAT, SSA, CP, recovery, GC)
>> from meta_inode to META_CACHE.
>> - Patch 06: Initialize and teardown NODE_CACHE in sb_info.
>> - Patch 07: Migrate node and inode block caching from node_inode to NODE_CACHE.
>> - Patch 08: Initialize and teardown COMPRESS_CACHE in sb_info.
>> - Patch 09: Migrate compressed cluster caching from compress_inode to COMPRESS_CACHE.
>> - Patch 10: Add fault injection support for cache allocation paths.
>> - Patch 11: Introduce ftrace tracepoints for cache dirty and writeback events.
>> - Patch 12: Expose per-cache memory usage in debugfs.
>>
>> Changelog:
>>
>> v5->v6:
>> - rebase on last dev-test
>> - rely on ("f2fs: parameterize node helpers and macros")
>> - remove unneeded f2fs_cache_test_dirty() check in f2fs_mark_cache_dirty()
>> - drop f2fs_force_clear_cache_dirty()
>> - avoid unnecessary type cast before cache_address() in checkpoint.c
>> - fix to init cache_wb_interval in prior create f2fs_writeback kthread
>> - fix to goto restore_wb label if f2fs_sync_fs() failed in f2fs_remount()
>> - fix to avoid race condition when access entry->ino in between
>> f2fs_cache_compressed_page() and f2fs_invalidate_compress_pages()
>> - rebase on decoupling patchset from Kelvin
>> - fix to access IS_INODE() and ino_of_inode() under cache lock
>>
>> Chao Yu (12):
>> f2fs: cache: implement metadata cache
>> f2fs: cache: initialize meta cache
>> f2fs: cache: introduce shrinker
>> f2fs: cache: introduce writeback thread
>> f2fs: cache: use meta cache
>> f2fs: cache: initialize node cache
>> f2fs: cache: use node cache
>> f2fs: cache: initialize compress cache
>> f2fs: cache: use compress cache
>> f2fs: cache: support fault injection
>> f2fs: cache: introduce tracepoints
>> f2fs: cache: show per-cache usage in debugfs
>>
>> Documentation/ABI/testing/sysfs-fs-f2fs | 6 +
>> fs/f2fs/Makefile | 2 +-
>> fs/f2fs/acl.c | 26 +-
>> fs/f2fs/acl.h | 8 +-
>> fs/f2fs/cache.c | 704 ++++++++++++++++
>> fs/f2fs/cache.h | 242 ++++++
>> fs/f2fs/checkpoint.c | 397 ++++-----
>> fs/f2fs/compress.c | 163 ++--
>> fs/f2fs/data.c | 520 ++++++++----
>> fs/f2fs/debug.c | 70 +-
>> fs/f2fs/dir.c | 170 ++--
>> fs/f2fs/extent_cache.c | 14 +-
>> fs/f2fs/f2fs.h | 361 ++++----
>> fs/f2fs/file.c | 78 +-
>> fs/f2fs/gc.c | 185 ++--
>> fs/f2fs/inline.c | 284 +++----
>> fs/f2fs/inode.c | 205 ++---
>> fs/f2fs/iostat.h | 11 +
>> fs/f2fs/namei.c | 114 +--
>> fs/f2fs/node.c | 1023 +++++++++++------------
>> fs/f2fs/node.h | 104 +--
>> fs/f2fs/recovery.c | 251 +++---
>> fs/f2fs/segment.c | 261 +++---
>> fs/f2fs/segment.h | 37 +-
>> fs/f2fs/shrinker.c | 14 +
>> fs/f2fs/super.c | 145 ++--
>> fs/f2fs/sysfs.c | 13 +-
>> fs/f2fs/xattr.c | 123 ++-
>> fs/f2fs/xattr.h | 12 +-
>> include/linux/f2fs_fs.h | 3 -
>> include/trace/events/f2fs.h | 71 ++
>> 31 files changed, 3401 insertions(+), 2216 deletions(-)
>> create mode 100644 fs/f2fs/cache.c
>> create mode 100644 fs/f2fs/cache.h
>>
>> --
>> 2.49.0
>>
prev parent reply other threads:[~2026-09-11 0:16 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 1:35 Chao Yu
2026-09-09 1:36 ` [PATCH v6 01/12] f2fs: cache: implement " Chao Yu
2026-09-09 1:36 ` [PATCH v6 02/12] f2fs: cache: initialize meta cache Chao Yu
2026-09-09 1:36 ` [PATCH v6 03/12] f2fs: cache: introduce shrinker Chao Yu
2026-09-09 1:36 ` [PATCH v6 04/12] f2fs: cache: introduce writeback thread Chao Yu
2026-09-09 1:36 ` [PATCH v6 05/12] f2fs: cache: use meta cache Chao Yu
2026-09-09 1:36 ` [PATCH v6 06/12] f2fs: cache: initialize node cache Chao Yu
2026-09-09 1:36 ` [PATCH v6 07/12] f2fs: cache: use " Chao Yu
2026-09-09 1:36 ` [PATCH v6 08/12] f2fs: cache: initialize compress cache Chao Yu
2026-09-09 1:36 ` [PATCH v6 09/12] f2fs: cache: use " Chao Yu
2026-09-09 1:36 ` [PATCH v6 10/12] f2fs: cache: support fault injection Chao Yu
2026-09-09 1:36 ` [PATCH v6 11/12] f2fs: cache: introduce tracepoints Chao Yu
2026-09-09 1:36 ` [PATCH v6 12/12] f2fs: cache: show per-cache usage in debugfs Chao Yu
2026-09-10 21:23 ` [PATCH v6 00/12] f2fs: introduce metadata cache Jaegeuk Kim
2026-09-11 0:16 ` Chao Yu [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3c1f769e-48b5-4c42-b876-48d1762667a9@kernel.org \
--to=chao@kernel.org \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®