[PATCH v2 16/18] fs/ceph/snap: add a kmem_cache for struct ceph_snap_realm

From: Max Kellermann

Date: Mon Jul 06 2026 - 03:32:06 EST


There will be lots of ceph_snap_realm instances, and having a separate
kmem_cache seems worthwile.

Signed-off-by: Max Kellermann <max.kellermann@xxxxxxxxx>
---
fs/ceph/snap.c | 4 ++--
fs/ceph/super.c | 9 +++++++++
include/linux/ceph/libceph.h | 1 +
3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index f064b5ad3bf4..12f80df4b651 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -118,7 +118,7 @@ static struct ceph_snap_realm *ceph_create_snap_realm(

lockdep_assert_held_write(&mdsc->snap_rwsem);

- realm = kzalloc_obj(*realm, GFP_NOFS);
+ realm = kmem_cache_zalloc(ceph_snap_realm_cachep, GFP_NOFS);
if (!realm)
return ERR_PTR(-ENOMEM);

@@ -205,7 +205,7 @@ static void __destroy_snap_realm(struct ceph_mds_client *mdsc,
kfree(realm->prior_parent_snaps);
kfree(realm->snaps);
ceph_put_snap_context(realm->cached_context);
- kfree(realm);
+ kmem_cache_free(ceph_snap_realm_cachep, realm);
}

/*
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index c05fbd4237f8..73c316c23315 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -910,6 +910,7 @@ struct kmem_cache *ceph_inode_cachep;
struct kmem_cache *ceph_cap_cachep;
struct kmem_cache *ceph_cap_snap_cachep;
struct kmem_cache *ceph_cap_flush_cachep;
+struct kmem_cache *ceph_snap_realm_cachep;
struct kmem_cache *ceph_dentry_cachep;
struct kmem_cache *ceph_file_cachep;
struct kmem_cache *ceph_dir_file_cachep;
@@ -945,6 +946,11 @@ static int __init init_caches(void)
if (!ceph_cap_flush_cachep)
goto bad_cap_flush;

+ ceph_snap_realm_cachep = KMEM_CACHE(ceph_snap_realm,
+ SLAB_RECLAIM_ACCOUNT);
+ if (!ceph_snap_realm_cachep)
+ goto bad_snap_realm;
+
ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info,
SLAB_RECLAIM_ACCOUNT);
if (!ceph_dentry_cachep)
@@ -984,6 +990,8 @@ static int __init init_caches(void)
bad_file:
kmem_cache_destroy(ceph_dentry_cachep);
bad_dentry:
+ kmem_cache_destroy(ceph_snap_realm_cachep);
+bad_snap_realm:
kmem_cache_destroy(ceph_cap_flush_cachep);
bad_cap_flush:
kmem_cache_destroy(ceph_cap_snap_cachep);
@@ -1006,6 +1014,7 @@ static void destroy_caches(void)
kmem_cache_destroy(ceph_cap_cachep);
kmem_cache_destroy(ceph_cap_snap_cachep);
kmem_cache_destroy(ceph_cap_flush_cachep);
+ kmem_cache_destroy(ceph_snap_realm_cachep);
kmem_cache_destroy(ceph_dentry_cachep);
kmem_cache_destroy(ceph_file_cachep);
kmem_cache_destroy(ceph_dir_file_cachep);
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h
index 63e0e2aa1ce9..379629cafbce 100644
--- a/include/linux/ceph/libceph.h
+++ b/include/linux/ceph/libceph.h
@@ -276,6 +276,7 @@ extern struct kmem_cache *ceph_inode_cachep;
extern struct kmem_cache *ceph_cap_cachep;
extern struct kmem_cache *ceph_cap_snap_cachep;
extern struct kmem_cache *ceph_cap_flush_cachep;
+extern struct kmem_cache *ceph_snap_realm_cachep;
extern struct kmem_cache *ceph_dentry_cachep;
extern struct kmem_cache *ceph_file_cachep;
extern struct kmem_cache *ceph_dir_file_cachep;
--
2.47.3