diff options
author | Darrick J. Wong <djwong@kernel.org> | 2022-06-22 14:28:52 -0500 |
---|---|---|
committer | Eric Sandeen <sandeen@sandeen.net> | 2022-06-22 14:28:52 -0500 |
commit | 3b0ca6322b7efc468e96458492e2e21e0bfb2918 (patch) | |
tree | 341fea6d8b3990bed0f129a6cbcfdaab22fe32ed | |
parent | 209da5f62d10e63855ccded1b5b50d0ead8a052e (diff) | |
download | xfsprogs-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.c | 5 | ||||
-rw-r--r-- | libxfs/xfs_attr.c | 20 | ||||
-rw-r--r-- | libxfs/xfs_attr.h | 4 | ||||
-rw-r--r-- | libxfs/xfs_defer.c | 4 |
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(); |