Size reduction of btrfs_path
David Sterba
maintainercover Size reduction of btrfs_path
We can reduce size of btrfs_path by 32 bytes, which will lead to more objects packed into one slab page. Performance should not be worse and could even improve in some cases due to less cachelines used.
Targetting 4.5. Thanks.
Can be pulled from
git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git dev/path-diet
David Sterba (4):
btrfs: cleanup, use enum values for btrfs_path reada
btrfs: use smaller type for btrfs_path reada
btrfs: use smaller type for btrfs_path lowest_level
btrfs: use smaller type for btrfs_path locks
fs/btrfs/ctree.c | 9 ++++----- fs/btrfs/ctree.h | 7 ++++--- fs/btrfs/extent-tree.c | 12 ++++++------ fs/btrfs/file-item.c | 4 ++-- fs/btrfs/inode-map.c | 2 +- fs/btrfs/inode.c | 8 ++++---- fs/btrfs/ioctl.c | 2 +- fs/btrfs/relocation.c | 12 ++++++------ fs/btrfs/scrub.c | 2 +- fs/btrfs/volumes.c | 6 +++--- fs/btrfs/xattr.c | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-)
Signature · 6 lines
2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-
David Sterba
maintainerPATCH 1/4 btrfs: cleanup, use enum values for btrfs_path reada
Replace the integers by enums for better readability. The value 2 does not have any meaning since a717531942f488209dded30f6bc648167bcefa72 "Btrfs: do less aggressive btree readahead" (2009-01-22).
--- fs/btrfs/ctree.c | 9 ++++----- fs/btrfs/ctree.h | 1 + fs/btrfs/extent-tree.c | 12 ++++++------ fs/btrfs/file-item.c | 4 ++-- fs/btrfs/inode-map.c | 2 +- fs/btrfs/inode.c | 8 ++++---- fs/btrfs/ioctl.c | 2 +- fs/btrfs/relocation.c | 12 ++++++------ fs/btrfs/scrub.c | 2 +- fs/btrfs/volumes.c | 6 +++--- fs/btrfs/xattr.c | 2 +- 11 files changed, 30 insertions(+), 30 deletions(-)
fs/btrfs/ctree.c +4 -5
@@ -2248,7 +2248,6 @@ static void reada_for_search(struct btrfs_root *root,u64 target;u64 nread =0 ;u64 gen; -int direction = path->reada;struct extent_buffer *eb;u32 nr;u32 blocksize;
@@ -2276,16 +2275,16 @@ static void reada_for_search(struct btrfs_root *root, nr = slot;while (1 ) { -if (direction <0 ) { +if (path->reada ==READA_BACK ) {if (nr ==0 )break ; nr--; - }else if (direction >0 ) { + }else if (path->reada ==READA_FORWARD ) { nr++;if (nr >= nritems)break ; } -if (path->reada <0 && objectid) { +if (path->reada ==READA_BACK && objectid) {btrfs_node_key (node, &disk_key, nr);if (btrfs_disk_key_objectid (&disk_key) != objectid)break ;
@@ -2493,7 +2492,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,btrfs_set_path_blocking (p);free_extent_buffer (tmp); -if (p->reada) +if (p->reada !=READA_NONE )reada_for_search (root, p, level, slot, key->objectid);btrfs_release_path (p);
fs/btrfs/ctree.h +1 -0
@@ -590,6 +590,7 @@ struct btrfs_node {* The slots array records the index of the item or block pointer * used while walking the tree. */ +enum {READA_NONE =0 ,READA_BACK ,READA_FORWARD };struct btrfs_path {struct extent_buffer *nodes[BTRFS_MAX_LEVEL ];int slots[BTRFS_MAX_LEVEL ];
fs/btrfs/extent-tree.c +6 -6
@@ -438,7 +438,7 @@ static noinline void caching_thread(struct btrfs_work *work)*/ path->skip_locking =1 ; path->search_commit_root =1 ; - path->reada =1 ; + path->reada =READA_FORWARD ; key.objectid = last; key.offset =0 ;
@@ -2115,7 +2115,7 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; path->leave_spinning =1 ;/* this will setup the path even if it fails to insert the back ref */ ret = insert_inline_extent_backref(trans, fs_info->extent_root, path,
@@ -2141,7 +2141,7 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,btrfs_mark_buffer_dirty (leaf);btrfs_release_path (path); - path->reada =1 ; + path->reada =READA_FORWARD ; path->leave_spinning =1 ;/* now insert the actual backref */ ret = insert_extent_backref(trans, root->fs_info->extent_root,
@@ -2254,7 +2254,7 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans, } again: - path->reada =1 ; + path->reada =READA_FORWARD ; path->leave_spinning =1 ; ret =btrfs_search_slot (trans, root->fs_info->extent_root, &key, path,0 ,1 );
@@ -6435,7 +6435,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; path->leave_spinning =1 ; is_data = owner_objectid >=BTRFS_FIRST_FREE_OBJECTID ;
@@ -9655,7 +9655,7 @@ int btrfs_read_block_groups(struct btrfs_root *root) path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; cache_gen =btrfs_super_cache_generation (root->fs_info->super_copy); if (btrfs_test_opt(root, SPACE_CACHE) &&
fs/btrfs/file-item.c +2 -2
@@ -202,7 +202,7 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root, }if (bio->bi_iter.bi_size >PAGE_CACHE_SIZE *8 ) - path->reada =2 ; + path->reada =READA_FORWARD ;WARN_ON (bio->bi_vcnt <=0 );
@@ -328,7 +328,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,if (search_commit) { path->skip_locking =1 ; - path->reada =2 ; + path->reada =READA_FORWARD ; path->search_commit_root =1 ; }
fs/btrfs/inode-map.c +1 -1
@@ -48,7 +48,7 @@ static int caching_kthread(void *data)/* Since the commit root is read-only, we can safely skip locking. */ path->skip_locking =1 ; path->search_commit_root =1 ; - path->reada =2 ; + path->reada =READA_FORWARD ; key.objectid =BTRFS_FIRST_FREE_OBJECTID ; key.offset =0 ;
fs/btrfs/inode.c +4 -4
@@ -3351,7 +3351,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) ret = -ENOMEM ; goto out; } - path->reada =-1 ; + path->reada =READA_BACK ; key.objectid =BTRFS_ORPHAN_OBJECTID ; key.type =BTRFS_ORPHAN_ITEM_KEY ;
@@ -4339,7 +4339,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =-1 ; + path->reada =READA_BACK ;/* * We want to drop from the next block forward in case this new size is
@@ -5775,7 +5775,7 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx)if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ;if (key_type ==BTRFS_DIR_INDEX_KEY ) {INIT_LIST_HEAD (&ins_list);
@@ -6806,7 +6806,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,* Chances are we'll be called again, so go ahead and do * readahead */ - path->reada =1 ; + path->reada =READA_FORWARD ; } ret = btrfs_lookup_file_extent(trans, root, path,
fs/btrfs/ioctl.c +1 -1
@@ -3478,7 +3478,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,return ret; } - path->reada =2 ; + path->reada =READA_FORWARD ;/* clone data */ key.objectid =btrfs_ino (src); key.type =BTRFS_EXTENT_DATA_KEY ;
fs/btrfs/relocation.c +6 -6
@@ -708,8 +708,8 @@ struct backref_node *build_backref_tree(struct reloc_control *rc, err = -ENOMEM ; goto out; } - path1->reada =1 ; - path2->reada =2 ; + path1->reada =READA_FORWARD ; + path2->reada =READA_FORWARD ; node =alloc_backref_node (cache);if (!node) {
@@ -2130,7 +2130,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc, path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; reloc_root = root->reloc_root; root_item = &reloc_root->root_item;
@@ -3527,7 +3527,7 @@ static int find_data_references(struct reloc_control *rc, path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; root =read_fs_root (rc->extent_root->fs_info, ref_root);if (IS_ERR (root)) {
@@ -3917,7 +3917,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc) path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =1 ; + path->reada =READA_FORWARD ; ret =prepare_to_relocate (rc);if (ret) {
@@ -4343,7 +4343,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =-1 ; + path->reada =READA_BACK ; key.objectid =BTRFS_TREE_RELOC_OBJECTID ; key.type =BTRFS_ROOT_ITEM_KEY ;
fs/btrfs/scrub.c +1 -1
@@ -3494,7 +3494,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,if (!path)return -ENOMEM ; - path->reada =2 ; + path->reada =READA_FORWARD ; path->search_commit_root =1 ; path->skip_locking =1 ;
fs/btrfs/volumes.c +3 -3
@@ -1102,7 +1102,7 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start, path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =2 ; + path->reada =READA_FORWARD ; key.objectid = device->devid; key.offset = start;
@@ -1271,7 +1271,7 @@ int find_free_dev_extent_start(struct btrfs_transaction *transaction, goto out; } - path->reada =2 ; + path->reada =READA_FORWARD ; path->search_commit_root =1 ; path->skip_locking =1 ;
@@ -4270,7 +4270,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)if (!path)return -ENOMEM ; - path->reada =2 ; + path->reada =READA_FORWARD ;lock_chunks (root);
fs/btrfs/xattr.c +1 -1
@@ -283,7 +283,7 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) path =btrfs_alloc_path ();if (!path)return -ENOMEM ; - path->reada =2 ; + path->reada =READA_FORWARD ;/* search for our xattrs */ ret =btrfs_search_slot (NULL , root, &key, path,0 ,0 );
Signature · 6 lines
2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo
David Sterba
maintainerPATCH 2/4 btrfs: use smaller type for btrfs_path reada
In reply to David SterbaThe possible values for reada are all positive and bounded, we can later save some bytes by storing it in u8.
--- fs/btrfs/ctree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/ctree.h +1 -1
@@ -596,7 +596,7 @@ struct btrfs_path {int slots[BTRFS_MAX_LEVEL ];/* if there is real range locking, this locks field will change */ int locks[BTRFS_MAX_LEVEL ]; -int reada; +u8 reada;/* keep some upper locks as we walk down */ int lowest_level;
Signature · 6 lines
2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-
David Sterba
maintainerPATCH 3/4 btrfs: use smaller type for btrfs_path lowest_level
In reply to David SterbaThe level is 0..7, we can use smaller type. The size of btrfs_path is now 136 bytes from 144, which is +2 objects that fit into a 4k slab.
--- fs/btrfs/ctree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/ctree.h +1 -1
@@ -598,7 +598,7 @@ struct btrfs_path {int locks[BTRFS_MAX_LEVEL ];u8 reada;/* keep some upper locks as we walk down */ -int lowest_level; +u8 lowest_level;/* * set by btrfs_split_item, tells search_slot to keep all locks
Signature · 6 lines
2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-
David Sterba
maintainerPATCH 4/4 btrfs: use smaller type for btrfs_path locks
In reply to David SterbaThe values of btrfs_path::locks are 0 to 4, fit into a u8. Let's see:
* overall size of btrfs_path drops down from 136 to 112 (-24 bytes),
* better packing in a slab page +6 objects
* the whole structure now fits to 2 cachelines
* slight decrease in code size:
text data bss dec hex filename
938731 43670 23144 1005545 f57e9 fs/btrfs/btrfs.ko.before 938203 43670 23144 1005017 f55d9 fs/btrfs/btrfs.ko.after
(and the generated assembly does not change much)
The main purpose is to decrease the size of the structure without affecting performance. The byte access is usually well behaving accross arches, the locks are not accessed frequently and sometimes just compared to zero.
Note for further size reduction attempts: the slots could be made u16 but this might generate worse code on some arches (non-byte and non-int access). Also the range of operations on slots is wider compared to locks and the potential performance drop should be evaluated first.
--- fs/btrfs/ctree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/ctree.h +1 -1
@@ -595,7 +595,7 @@ struct btrfs_path {struct extent_buffer *nodes[BTRFS_MAX_LEVEL ];int slots[BTRFS_MAX_LEVEL ];/* if there is real range locking, this locks field will change */ -int locks[BTRFS_MAX_LEVEL ]; +u8 locks[BTRFS_MAX_LEVEL ];u8 reada;/* keep some upper locks as we walk down */ u8 lowest_level;
Signature · 6 lines
2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-