Commit e2c78949 authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner

xfs: use a separate slab cache for deferred xattr work state

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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent b53d212b
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
struct kmem_cache *xfs_attri_cache; struct kmem_cache *xfs_attri_cache;
struct kmem_cache *xfs_attrd_cache; struct kmem_cache *xfs_attrd_cache;
struct kmem_cache *xfs_attr_intent_cache;
/* /*
* xfs_attr.c * xfs_attr.c
...@@ -902,7 +903,7 @@ xfs_attr_item_init( ...@@ -902,7 +903,7 @@ xfs_attr_item_init(
struct xfs_attr_item *new; 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_op_flags = op_flags;
new->xattri_da_args = args; new->xattri_da_args = args;
...@@ -1650,3 +1651,20 @@ xfs_attr_namecheck( ...@@ -1650,3 +1651,20 @@ xfs_attr_namecheck(
/* There shouldn't be any nulls here */ /* There shouldn't be any nulls here */
return !memchr(name, 0, length); 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;
}
...@@ -634,4 +634,8 @@ xfs_attr_init_replace_state(struct xfs_da_args *args) ...@@ -634,4 +634,8 @@ xfs_attr_init_replace_state(struct xfs_da_args *args)
return xfs_attr_init_add_state(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__ */ #endif /* __XFS_ATTR_H__ */
...@@ -877,6 +877,9 @@ xfs_defer_init_item_caches(void) ...@@ -877,6 +877,9 @@ xfs_defer_init_item_caches(void)
if (error) if (error)
goto err; goto err;
error = xfs_attrd_init_cache(); error = xfs_attrd_init_cache();
if (error)
goto err;
error = xfs_attr_intent_init_cache();
if (error) if (error)
goto err; goto err;
return 0; return 0;
...@@ -889,6 +892,7 @@ xfs_defer_init_item_caches(void) ...@@ -889,6 +892,7 @@ xfs_defer_init_item_caches(void)
void void
xfs_defer_destroy_item_caches(void) xfs_defer_destroy_item_caches(void)
{ {
xfs_attr_intent_destroy_cache();
xfs_attri_destroy_cache(); xfs_attri_destroy_cache();
xfs_attrd_destroy_cache(); xfs_attrd_destroy_cache();
xfs_extfree_intent_destroy_cache(); xfs_extfree_intent_destroy_cache();
......
...@@ -404,7 +404,10 @@ xfs_attr_free_item( ...@@ -404,7 +404,10 @@ xfs_attr_free_item(
{ {
if (attr->xattri_da_state) if (attr->xattri_da_state)
xfs_da_state_free(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. */ /* Process an attr. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment