From: Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: jaegeuk@kernel.org
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: [f2fs-dev] [PATCH v6 08/12] f2fs: cache: initialize compress cache
Date: Wed, 9 Sep 2026 09:36:07 +0800 [thread overview]
Message-ID: <20260909013611.3418568-9-chao@kernel.org> (raw)
In-Reply-To: <20260909013611.3418568-1-chao@kernel.org>
From: Chao Yu <chao@kernel.org>
This patch introduces compress_blocks in f2fs_sb_info structure, initializes
and destroys the compress cache during filesystem mount and unmount.
It adds an ino union field in struct f2fs_cached_block (sharing space
with writeback linkage for zero memory overhead) to track per-inode
cached blocks, and registers compress cache into the memory shrinker.
Signed-off-by: Chao Yu <chao@kernel.org>
---
fs/f2fs/cache.c | 9 ++++++++-
fs/f2fs/cache.h | 14 ++++++++++----
fs/f2fs/f2fs.h | 6 ++++++
fs/f2fs/super.c | 9 ++++++++-
4 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/fs/f2fs/cache.c b/fs/f2fs/cache.c
index d7349d481dbd..e52e73d76700 100644
--- a/fs/f2fs/cache.c
+++ b/fs/f2fs/cache.c
@@ -176,7 +176,10 @@ static struct f2fs_cached_block *f2fs_create_cache(
entry->index = index;
atomic_set(&entry->refcount, 0);
- entry->next_entry = NULL;
+ if (!IS_COMPRESS_CACHE(cache))
+ entry->next_entry = NULL;
+ else
+ entry->ino = 0;
INIT_LIST_HEAD(&entry->list);
entry->cache = cache;
@@ -627,6 +630,10 @@ unsigned long f2fs_shrink_cache(struct f2fs_sb_info *sbi,
return freed;
freed += f2fs_do_shrink_cache(NODE_CACHE(sbi), nr_to_scan - freed);
+ if (freed >= nr_to_scan)
+ return freed;
+
+ freed += f2fs_do_shrink_cache(COMPRESS_CACHE(sbi), nr_to_scan - freed);
return freed;
}
diff --git a/fs/f2fs/cache.h b/fs/f2fs/cache.h
index dfe898df6aa8..a81524755dad 100644
--- a/fs/f2fs/cache.h
+++ b/fs/f2fs/cache.h
@@ -18,12 +18,15 @@ struct f2fs_rwsem;
struct f2fs_io_info;
enum page_type;
-/* Represents a single cached block (meta, node) */
+/* Represents a single cached block (meta, node or compress) */
struct f2fs_cached_block {
struct list_head list; /* LRU list head */
struct f2fs_cached_block_list *cache; /* parent cache list */
- struct f2fs_cached_block *next_entry; /* chain for merged BIO */
- unsigned long index; /* key in radix tree, (meta: pba, node: nid) */
+ union {
+ struct f2fs_cached_block *next_entry;/* chain for merged BIO */
+ nid_t ino; /* inode number for compress cache */
+ };
+ unsigned long index; /* key in radix tree, (meta/compress: pba, node: nid) */
unsigned long state; /* cache entry state (e.g., Dirty, UpToDate) */
void *data; /* blocksize-aligned memory (4KB or 16KB) */
atomic_t refcount; /* reference count */
@@ -34,6 +37,7 @@ struct f2fs_sb_info;
enum f2fs_cache_type {
F2FS_META_CACHE,
F2FS_NODE_CACHE,
+ F2FS_COMPRESS_CACHE,
};
/* Main cache control structure (per sb_info) */
@@ -43,12 +47,13 @@ struct f2fs_cached_block_list {
spinlock_t tree_lock; /* Lock for radix tree */
struct list_head lru_list; /* Single global LRU list */
spinlock_t list_lock; /* Lock for LRU list */
- enum f2fs_cache_type type; /* Cache type (Node or Meta) */
+ enum f2fs_cache_type type; /* Cache type (Node, Meta, Compress) */
unsigned long num_entries; /* Current number of entries */
};
#define IS_META_CACHE(cache) (cache->type == F2FS_META_CACHE)
#define IS_NODE_CACHE(cache) (cache->type == F2FS_NODE_CACHE)
+#define IS_COMPRESS_CACHE(cache) (cache->type == F2FS_COMPRESS_CACHE)
/* Flags for f2fs_cached_block state */
enum f2fs_cached_state {
@@ -199,6 +204,7 @@ void f2fs_stop_cache_wb_thread(struct f2fs_sb_info *sbi);
#define META_CACHE(sbi) (&(sbi)->meta_blocks)
#define NODE_CACHE(sbi) (&(sbi)->node_blocks)
+#define COMPRESS_CACHE(sbi) (&(sbi)->compress_blocks)
#define f2fs_find_meta_cache(sbi, blkaddr) \
f2fs_find_cache(META_CACHE(sbi), blkaddr, 0)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index e5489564194f..1376a6f2e9e2 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2106,6 +2106,7 @@ struct f2fs_sb_info {
/* f2fs internal cache */
struct f2fs_cached_block_list meta_blocks;
struct f2fs_cached_block_list node_blocks;
+ struct f2fs_cached_block_list compress_blocks;
/* internal cache flush thread */
struct f2fs_cache_kthread cache_thread;
@@ -2384,6 +2385,11 @@ static inline bool f2fs_is_node_cache(struct f2fs_cached_block *entry)
return entry->cache && entry->cache == NODE_CACHE(entry->cache->sbi);
}
+static inline bool f2fs_is_compress_cache(struct f2fs_cached_block *entry)
+{
+ return entry->cache && entry->cache == COMPRESS_CACHE(entry->cache->sbi);
+}
+
static inline struct f2fs_bio *F2FS_BIO(struct bio *bio)
{
return container_of(bio, struct f2fs_bio, bio);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 9446e82d3de7..e1a455573d34 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2071,6 +2071,7 @@ static void f2fs_put_super(struct super_block *sb)
f2fs_destroy_compress_inode(sbi);
+ f2fs_destroy_cache(COMPRESS_CACHE(sbi));
f2fs_destroy_cache(NODE_CACHE(sbi));
f2fs_destroy_cache(META_CACHE(sbi));
@@ -5267,10 +5268,14 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
if (err)
goto free_meta_cache;
+ err = f2fs_init_cache(sbi, COMPRESS_CACHE(sbi), F2FS_COMPRESS_CACHE);
+ if (err)
+ goto free_node_cache;
+
err = f2fs_get_valid_checkpoint(sbi);
if (err) {
f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
- goto free_node_cache;
+ goto free_compress_cache;
}
if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
@@ -5585,6 +5590,8 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
free_devices:
destroy_device_list(sbi);
kvfree(sbi->ckpt);
+free_compress_cache:
+ f2fs_destroy_cache(COMPRESS_CACHE(sbi));
free_node_cache:
f2fs_destroy_cache(NODE_CACHE(sbi));
free_meta_cache:
--
2.49.0
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2026-09-09 1:37 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 1:35 [f2fs-dev] [PATCH v6 00/12] f2fs: introduce metadata cache Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 01/12] f2fs: cache: implement " Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 02/12] f2fs: cache: initialize meta cache Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 03/12] f2fs: cache: introduce shrinker Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 04/12] f2fs: cache: introduce writeback thread Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 05/12] f2fs: cache: use meta cache Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 06/12] f2fs: cache: initialize node cache Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 07/12] f2fs: cache: use " Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` Chao Yu via Linux-f2fs-devel [this message]
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 09/12] f2fs: cache: use compress cache Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 10/12] f2fs: cache: support fault injection Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 11/12] f2fs: cache: introduce tracepoints Chao Yu via Linux-f2fs-devel
2026-09-09 1:36 ` [f2fs-dev] [PATCH v6 12/12] f2fs: cache: show per-cache usage in debugfs Chao Yu via Linux-f2fs-devel
2026-09-10 21:23 ` [f2fs-dev] [PATCH v6 00/12] f2fs: introduce metadata cache Jaegeuk Kim via Linux-f2fs-devel
2026-09-11 0:16 ` Chao Yu via Linux-f2fs-devel
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=20260909013611.3418568-9-chao@kernel.org \
--to=linux-f2fs-devel@lists.sourceforge.net \
--cc=chao@kernel.org \
--cc=jaegeuk@kernel.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.