aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-06-22 14:28:52 -0500
committerEric Sandeen <sandeen@sandeen.net>2022-06-22 14:28:52 -0500
commit3b0ca6322b7efc468e96458492e2e21e0bfb2918 (patch)
tree341fea6d8b3990bed0f129a6cbcfdaab22fe32ed
parent209da5f62d10e63855ccded1b5b50d0ead8a052e (diff)
downloadxfsprogs-dev-3b0ca6322b7efc468e96458492e2e21e0bfb2918.tar.gz
xfs: use a separate slab cache for deferred xattr work state
Source kernel commit: e2c78949b641d34cb4051b32c2fa5e03a4bfef35 Create a separate slab cache for struct xfs_attr_item objects, since we can pack the (104-byte) intent items more tightly than we can with the general slab cache objects. On x86, this means 39 intents per memory page instead of 32. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--libxfs/defer_item.c5
-rw-r--r--libxfs/xfs_attr.c20
-rw-r--r--libxfs/xfs_attr.h4
-rw-r--r--libxfs/xfs_defer.c4
4 files changed, 31 insertions, 2 deletions
diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c
index e88df58fef..c5f7ca7e50 100644
--- a/libxfs/defer_item.c
+++ b/libxfs/defer_item.c
@@ -491,7 +491,10 @@ xfs_attr_free_item(
{
if (attr->xattri_da_state)
xfs_da_state_free(attr->xattri_da_state);
- kmem_free(attr);
+ if (attr->xattri_da_args->op_flags & XFS_DA_OP_RECOVERY)
+ kmem_free(attr);
+ else
+ kmem_cache_free(xfs_attr_intent_cache, attr);
}
/* Process an attr. */
diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c
index ed81123d4e..23608614a2 100644
--- a/libxfs/xfs_attr.c
+++ b/libxfs/xfs_attr.c
@@ -27,6 +27,7 @@
struct kmem_cache *xfs_attri_cache;
struct kmem_cache *xfs_attrd_cache;
+struct kmem_cache *xfs_attr_intent_cache;
/*
* xfs_attr.c
@@ -900,7 +901,7 @@ xfs_attr_item_init(
struct xfs_attr_item *new;
- new = kmem_zalloc(sizeof(struct xfs_attr_item), KM_NOFS);
+ new = kmem_cache_zalloc(xfs_attr_intent_cache, GFP_NOFS | __GFP_NOFAIL);
new->xattri_op_flags = op_flags;
new->xattri_da_args = args;
@@ -1648,3 +1649,20 @@ xfs_attr_namecheck(
/* There shouldn't be any nulls here */
return !memchr(name, 0, length);
}
+
+int __init
+xfs_attr_intent_init_cache(void)
+{
+ xfs_attr_intent_cache = kmem_cache_create("xfs_attr_item",
+ sizeof(struct xfs_attr_item),
+ 0, 0, NULL);
+
+ return xfs_attr_intent_cache != NULL ? 0 : -ENOMEM;
+}
+
+void
+xfs_attr_intent_destroy_cache(void)
+{
+ kmem_cache_destroy(xfs_attr_intent_cache);
+ xfs_attr_intent_cache = NULL;
+}
diff --git a/libxfs/xfs_attr.h b/libxfs/xfs_attr.h
index c739caa11a..cb3b3d2705 100644
--- a/libxfs/xfs_attr.h
+++ b/libxfs/xfs_attr.h
@@ -634,4 +634,8 @@ xfs_attr_init_replace_state(struct xfs_da_args *args)
return xfs_attr_init_add_state(args);
}
+extern struct kmem_cache *xfs_attr_intent_cache;
+int __init xfs_attr_intent_init_cache(void);
+void xfs_attr_intent_destroy_cache(void);
+
#endif /* __XFS_ATTR_H__ */
diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c
index c8e564e168..4d0ed4ad0a 100644
--- a/libxfs/xfs_defer.c
+++ b/libxfs/xfs_defer.c
@@ -874,6 +874,9 @@ xfs_defer_init_item_caches(void)
error = xfs_attrd_init_cache();
if (error)
goto err;
+ error = xfs_attr_intent_init_cache();
+ if (error)
+ goto err;
return 0;
err:
xfs_defer_destroy_item_caches();
@@ -884,6 +887,7 @@ err:
void
xfs_defer_destroy_item_caches(void)
{
+ xfs_attr_intent_destroy_cache();
xfs_attri_destroy_cache();
xfs_attrd_destroy_cache();
xfs_extfree_intent_destroy_cache();