diff options
author | Josef Bacik <jbacik@fusionio.com> | 2012-10-15 13:43:18 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-12-16 20:46:26 -0500 |
commit | 41be1f3b40b87de33cd2e7463dce88596dbdccc4 (patch) | |
tree | 6b2bd0ec252c70df303ec89b65fce172a9b5e921 /fs | |
parent | ad9145596986b672d8c8235c92ed5307f82d045d (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.c | 11 |
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 | */ |
3299 | static int leaf_space_used(struct extent_buffer *l, int start, int nr) | 3299 | static 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; |