From: Chao Yu <chao@kernel.org>
To: jaegeuk@kernel.org
Cc: linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org, Chao Yu <chao@kernel.org>
Subject: [PATCH v1 08/12] f2fs: cache: initialize compress cache
Date: Thu, 20 Aug 2026 11:17:17 +0800 [thread overview]
Message-ID: <20260820031721.12218-9-chao@kernel.org> (raw)
In-Reply-To: <20260820031721.12218-1-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 | 5 ++++-
fs/f2fs/f2fs.h | 6 ++++++
fs/f2fs/super.c | 9 ++++++++-
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/fs/f2fs/cache.c b/fs/f2fs/cache.c
index 3176d62ce25b..2cecf6287207 100644
--- a/fs/f2fs/cache.c
+++ b/fs/f2fs/cache.c
@@ -194,7 +194,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;
@@ -616,6 +619,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 397019cfb861..23583a52b8f8 100644
--- a/fs/f2fs/cache.h
+++ b/fs/f2fs/cache.h
@@ -38,6 +38,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) */
@@ -47,12 +48,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 {
@@ -182,6 +184,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)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 4dd165ac05c9..36a6afbf3ba1 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2104,6 +2104,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;
@@ -2325,6 +2326,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 bc1cff6cad0d..ac3a94736a91 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2030,6 +2030,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));
@@ -5203,10 +5204,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))
@@ -5519,6 +5524,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
WARNING: multiple messages have this Message-ID (diff)
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 v1 08/12] f2fs: cache: initialize compress cache
Date: Thu, 20 Aug 2026 11:17:17 +0800 [thread overview]
Message-ID: <20260820031721.12218-9-chao@kernel.org> (raw)
In-Reply-To: <20260820031721.12218-1-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 | 5 ++++-
fs/f2fs/f2fs.h | 6 ++++++
fs/f2fs/super.c | 9 ++++++++-
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/fs/f2fs/cache.c b/fs/f2fs/cache.c
index 3176d62ce25b..2cecf6287207 100644
--- a/fs/f2fs/cache.c
+++ b/fs/f2fs/cache.c
@@ -194,7 +194,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;
@@ -616,6 +619,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 397019cfb861..23583a52b8f8 100644
--- a/fs/f2fs/cache.h
+++ b/fs/f2fs/cache.h
@@ -38,6 +38,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) */
@@ -47,12 +48,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 {
@@ -182,6 +184,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)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 4dd165ac05c9..36a6afbf3ba1 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2104,6 +2104,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;
@@ -2325,6 +2326,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 bc1cff6cad0d..ac3a94736a91 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2030,6 +2030,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));
@@ -5203,10 +5204,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))
@@ -5519,6 +5524,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-08-20 3:17 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-20 3:17 [PATCH v1 00/12] f2fs: introduce metadata cache Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 01/12] f2fs: cache: implement " Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 5:08 ` Jaegeuk Kim via Linux-f2fs-devel
2026-08-20 5:08 ` Jaegeuk Kim
2026-08-20 5:13 ` Chao Yu via Linux-f2fs-devel
2026-08-20 5:13 ` Chao Yu
2026-08-20 3:17 ` [PATCH v1 02/12] f2fs: cache: initialize meta cache Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 03/12] f2fs: cache: introduce shrinker Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 04/12] f2fs: cache: introduce writeback thread Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 5:09 ` Jaegeuk Kim via Linux-f2fs-devel
2026-08-20 5:09 ` Jaegeuk Kim
2026-08-20 3:17 ` [f2fs-dev] [PATCH v1 05/12] f2fs: cache: use meta cache Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` Chao Yu
2026-08-20 5:11 ` [f2fs-dev] " Jaegeuk Kim via Linux-f2fs-devel
2026-08-20 5:11 ` Jaegeuk Kim
2026-08-20 3:17 ` [PATCH v1 06/12] f2fs: cache: initialize node cache Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [f2fs-dev] [PATCH v1 07/12] f2fs: cache: use " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` Chao Yu
2026-08-20 3:17 ` Chao Yu [this message]
2026-08-20 3:17 ` [f2fs-dev] [PATCH v1 08/12] f2fs: cache: initialize compress cache Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 09/12] f2fs: cache: use " Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 10/12] f2fs: cache: support fault injection Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 11/12] f2fs: cache: introduce tracepoints Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " Chao Yu via Linux-f2fs-devel
2026-08-20 3:17 ` [PATCH v1 12/12] f2fs: cache: show per-cache usage in debugfs Chao Yu
2026-08-20 3:17 ` [f2fs-dev] " 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=20260820031721.12218-9-chao@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 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.