aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2012-10-15 13:43:18 -0400
committerChris Mason <chris.mason@fusionio.com>2012-12-16 20:46:26 -0500
commit41be1f3b40b87de33cd2e7463dce88596dbdccc4 (patch)
tree6b2bd0ec252c70df303ec89b65fce172a9b5e921 /fs
parentad9145596986b672d8c8235c92ed5307f82d045d (diff)
Btrfs: optimize leaf_space_used
This gets called at least 4 times for every level while adding an object, and it involves 3 kmapping calls, which on my box take about 5us a piece. So instead use a token, which brings us down to 1 kmap call and makes this function take 1/3 of the time per call. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ctree.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index e8b32641ea90..e7bea1d5f75f 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -3298,14 +3298,21 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
3298 */ 3298 */
3299static int leaf_space_used(struct extent_buffer *l, int start, int nr) 3299static int leaf_space_used(struct extent_buffer *l, int start, int nr)
3300{ 3300{
3301 struct btrfs_item *start_item;
3302 struct btrfs_item *end_item;
3303 struct btrfs_map_token token;
3301 int data_len; 3304 int data_len;
3302 int nritems = btrfs_header_nritems(l); 3305 int nritems = btrfs_header_nritems(l);
3303 int end = min(nritems, start + nr) - 1; 3306 int end = min(nritems, start + nr) - 1;
3304 3307
3305 if (!nr) 3308 if (!nr)
3306 return 0; 3309 return 0;
3307 data_len = btrfs_item_end_nr(l, start); 3310 btrfs_init_map_token(&token);
3308 data_len = data_len - btrfs_item_offset_nr(l, end); 3311 start_item = btrfs_item_nr(l, start);
3312 end_item = btrfs_item_nr(l, end);
3313 data_len = btrfs_token_item_offset(l, start_item, &token) +
3314 btrfs_token_item_size(l, start_item, &token);
3315 data_len = data_len - btrfs_token_item_offset(l, end_item, &token);
3309 data_len += sizeof(struct btrfs_item) * nr; 3316 data_len += sizeof(struct btrfs_item) * nr;
3310 WARN_ON(data_len < 0); 3317 WARN_ON(data_len < 0);
3311 return data_len; 3318 return data_len;