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: 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>
This commit is contained in:
parent
b53d212b4b
commit
e2c78949b6
|
@ -29,6 +29,7 @@
|
|||
|
||||
struct kmem_cache *xfs_attri_cache;
|
||||
struct kmem_cache *xfs_attrd_cache;
|
||||
struct kmem_cache *xfs_attr_intent_cache;
|
||||
|
||||
/*
|
||||
* xfs_attr.c
|
||||
|
@ -902,7 +903,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;
|
||||
|
||||
|
@ -1650,3 +1651,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;
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -877,6 +877,9 @@ xfs_defer_init_item_caches(void)
|
|||
if (error)
|
||||
goto err;
|
||||
error = xfs_attrd_init_cache();
|
||||
if (error)
|
||||
goto err;
|
||||
error = xfs_attr_intent_init_cache();
|
||||
if (error)
|
||||
goto err;
|
||||
return 0;
|
||||
|
@ -889,6 +892,7 @@ xfs_defer_init_item_caches(void)
|
|||
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();
|
||||
|
|
|
@ -404,7 +404,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. */
|
||||
|
|
Loading…
Reference in New Issue