Commit fba4b697 authored by Nikolay Borisov's avatar Nikolay Borisov Committed by David Sterba

btrfs: Fix slab accounting flags

BTRFS is using a variety of slab caches to satisfy internal needs.
Those slab caches are always allocated with the SLAB_RECLAIM_ACCOUNT,
meaning allocations from the caches are going to be accounted as
SReclaimable. At the same time btrfs is not registering any shrinkers
whatsoever, thus preventing memory from the slabs to be shrunk. This
means those caches are not in fact reclaimable.

To fix this remove the SLAB_RECLAIM_ACCOUNT on all caches apart from the
inode cache, since this one is being freed by the generic VFS super_block
shrinker. Also set the transaction related caches as SLAB_TEMPORARY,
to better document the lifetime of the objects (it just translates
to SLAB_RECLAIM_ACCOUNT).
Signed-off-by: default avatarNikolay Borisov <n.borisov.lkml@gmail.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 7af7c616
...@@ -139,7 +139,7 @@ int __init btrfs_prelim_ref_init(void) ...@@ -139,7 +139,7 @@ int __init btrfs_prelim_ref_init(void)
btrfs_prelim_ref_cache = kmem_cache_create("btrfs_prelim_ref", btrfs_prelim_ref_cache = kmem_cache_create("btrfs_prelim_ref",
sizeof(struct __prelim_ref), sizeof(struct __prelim_ref),
0, 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, SLAB_MEM_SPREAD,
NULL); NULL);
if (!btrfs_prelim_ref_cache) if (!btrfs_prelim_ref_cache)
return -ENOMEM; return -ENOMEM;
......
...@@ -34,7 +34,7 @@ int __init btrfs_delayed_inode_init(void) ...@@ -34,7 +34,7 @@ int __init btrfs_delayed_inode_init(void)
delayed_node_cache = kmem_cache_create("btrfs_delayed_node", delayed_node_cache = kmem_cache_create("btrfs_delayed_node",
sizeof(struct btrfs_delayed_node), sizeof(struct btrfs_delayed_node),
0, 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, SLAB_MEM_SPREAD,
NULL); NULL);
if (!delayed_node_cache) if (!delayed_node_cache)
return -ENOMEM; return -ENOMEM;
......
...@@ -940,28 +940,28 @@ int btrfs_delayed_ref_init(void) ...@@ -940,28 +940,28 @@ int btrfs_delayed_ref_init(void)
btrfs_delayed_ref_head_cachep = kmem_cache_create( btrfs_delayed_ref_head_cachep = kmem_cache_create(
"btrfs_delayed_ref_head", "btrfs_delayed_ref_head",
sizeof(struct btrfs_delayed_ref_head), 0, sizeof(struct btrfs_delayed_ref_head), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_delayed_ref_head_cachep) if (!btrfs_delayed_ref_head_cachep)
goto fail; goto fail;
btrfs_delayed_tree_ref_cachep = kmem_cache_create( btrfs_delayed_tree_ref_cachep = kmem_cache_create(
"btrfs_delayed_tree_ref", "btrfs_delayed_tree_ref",
sizeof(struct btrfs_delayed_tree_ref), 0, sizeof(struct btrfs_delayed_tree_ref), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_delayed_tree_ref_cachep) if (!btrfs_delayed_tree_ref_cachep)
goto fail; goto fail;
btrfs_delayed_data_ref_cachep = kmem_cache_create( btrfs_delayed_data_ref_cachep = kmem_cache_create(
"btrfs_delayed_data_ref", "btrfs_delayed_data_ref",
sizeof(struct btrfs_delayed_data_ref), 0, sizeof(struct btrfs_delayed_data_ref), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_delayed_data_ref_cachep) if (!btrfs_delayed_data_ref_cachep)
goto fail; goto fail;
btrfs_delayed_extent_op_cachep = kmem_cache_create( btrfs_delayed_extent_op_cachep = kmem_cache_create(
"btrfs_delayed_extent_op", "btrfs_delayed_extent_op",
sizeof(struct btrfs_delayed_extent_op), 0, sizeof(struct btrfs_delayed_extent_op), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_delayed_extent_op_cachep) if (!btrfs_delayed_extent_op_cachep)
goto fail; goto fail;
......
...@@ -101,7 +101,7 @@ int __init btrfs_end_io_wq_init(void) ...@@ -101,7 +101,7 @@ int __init btrfs_end_io_wq_init(void)
btrfs_end_io_wq_cache = kmem_cache_create("btrfs_end_io_wq", btrfs_end_io_wq_cache = kmem_cache_create("btrfs_end_io_wq",
sizeof(struct btrfs_end_io_wq), sizeof(struct btrfs_end_io_wq),
0, 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, SLAB_MEM_SPREAD,
NULL); NULL);
if (!btrfs_end_io_wq_cache) if (!btrfs_end_io_wq_cache)
return -ENOMEM; return -ENOMEM;
......
...@@ -163,13 +163,13 @@ int __init extent_io_init(void) ...@@ -163,13 +163,13 @@ int __init extent_io_init(void)
{ {
extent_state_cache = kmem_cache_create("btrfs_extent_state", extent_state_cache = kmem_cache_create("btrfs_extent_state",
sizeof(struct extent_state), 0, sizeof(struct extent_state), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!extent_state_cache) if (!extent_state_cache)
return -ENOMEM; return -ENOMEM;
extent_buffer_cache = kmem_cache_create("btrfs_extent_buffer", extent_buffer_cache = kmem_cache_create("btrfs_extent_buffer",
sizeof(struct extent_buffer), 0, sizeof(struct extent_buffer), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!extent_buffer_cache) if (!extent_buffer_cache)
goto free_state_cache; goto free_state_cache;
......
...@@ -13,7 +13,7 @@ int __init extent_map_init(void) ...@@ -13,7 +13,7 @@ int __init extent_map_init(void)
{ {
extent_map_cache = kmem_cache_create("btrfs_extent_map", extent_map_cache = kmem_cache_create("btrfs_extent_map",
sizeof(struct extent_map), 0, sizeof(struct extent_map), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!extent_map_cache) if (!extent_map_cache)
return -ENOMEM; return -ENOMEM;
return 0; return 0;
......
...@@ -2975,7 +2975,7 @@ int btrfs_auto_defrag_init(void) ...@@ -2975,7 +2975,7 @@ int btrfs_auto_defrag_init(void)
{ {
btrfs_inode_defrag_cachep = kmem_cache_create("btrfs_inode_defrag", btrfs_inode_defrag_cachep = kmem_cache_create("btrfs_inode_defrag",
sizeof(struct inode_defrag), 0, sizeof(struct inode_defrag), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, SLAB_MEM_SPREAD,
NULL); NULL);
if (!btrfs_inode_defrag_cachep) if (!btrfs_inode_defrag_cachep)
return -ENOMEM; return -ENOMEM;
......
...@@ -9392,25 +9392,25 @@ int btrfs_init_cachep(void) ...@@ -9392,25 +9392,25 @@ int btrfs_init_cachep(void)
btrfs_trans_handle_cachep = kmem_cache_create("btrfs_trans_handle", btrfs_trans_handle_cachep = kmem_cache_create("btrfs_trans_handle",
sizeof(struct btrfs_trans_handle), 0, sizeof(struct btrfs_trans_handle), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
if (!btrfs_trans_handle_cachep) if (!btrfs_trans_handle_cachep)
goto fail; goto fail;
btrfs_transaction_cachep = kmem_cache_create("btrfs_transaction", btrfs_transaction_cachep = kmem_cache_create("btrfs_transaction",
sizeof(struct btrfs_transaction), 0, sizeof(struct btrfs_transaction), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
if (!btrfs_transaction_cachep) if (!btrfs_transaction_cachep)
goto fail; goto fail;
btrfs_path_cachep = kmem_cache_create("btrfs_path", btrfs_path_cachep = kmem_cache_create("btrfs_path",
sizeof(struct btrfs_path), 0, sizeof(struct btrfs_path), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_path_cachep) if (!btrfs_path_cachep)
goto fail; goto fail;
btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space", btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space",
sizeof(struct btrfs_free_space), 0, sizeof(struct btrfs_free_space), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); SLAB_MEM_SPREAD, NULL);
if (!btrfs_free_space_cachep) if (!btrfs_free_space_cachep)
goto fail; goto fail;
......
...@@ -1122,7 +1122,7 @@ int __init ordered_data_init(void) ...@@ -1122,7 +1122,7 @@ int __init ordered_data_init(void)
{ {
btrfs_ordered_extent_cache = kmem_cache_create("btrfs_ordered_extent", btrfs_ordered_extent_cache = kmem_cache_create("btrfs_ordered_extent",
sizeof(struct btrfs_ordered_extent), 0, sizeof(struct btrfs_ordered_extent), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, SLAB_MEM_SPREAD,
NULL); NULL);
if (!btrfs_ordered_extent_cache) if (!btrfs_ordered_extent_cache)
return -ENOMEM; return -ENOMEM;
......
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