Commit 41be1f3b authored by Josef Bacik's avatar Josef Bacik Committed by Chris Mason

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: default avatarJosef Bacik <jbacik@fusionio.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent ad914559
...@@ -3298,14 +3298,21 @@ static noinline int split_node(struct btrfs_trans_handle *trans, ...@@ -3298,14 +3298,21 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
*/ */
static int leaf_space_used(struct extent_buffer *l, int start, int nr) static int leaf_space_used(struct extent_buffer *l, int start, int nr)
{ {
struct btrfs_item *start_item;
struct btrfs_item *end_item;
struct btrfs_map_token token;
int data_len; int data_len;
int nritems = btrfs_header_nritems(l); int nritems = btrfs_header_nritems(l);
int end = min(nritems, start + nr) - 1; int end = min(nritems, start + nr) - 1;
if (!nr) if (!nr)
return 0; return 0;
data_len = btrfs_item_end_nr(l, start); btrfs_init_map_token(&token);
data_len = data_len - btrfs_item_offset_nr(l, end); start_item = btrfs_item_nr(l, start);
end_item = btrfs_item_nr(l, end);
data_len = btrfs_token_item_offset(l, start_item, &token) +
btrfs_token_item_size(l, start_item, &token);
data_len = data_len - btrfs_token_item_offset(l, end_item, &token);
data_len += sizeof(struct btrfs_item) * nr; data_len += sizeof(struct btrfs_item) * nr;
WARN_ON(data_len < 0); WARN_ON(data_len < 0);
return data_len; return data_len;
......
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