Skip to content

Commit

Permalink
btrfs: reduce extent tree lock contention when searching for inline b…
Browse files Browse the repository at this point in the history
…ackref

When inserting extent backref, in order to check whether refs other than
inline refs are used, we always use path keep locks for tree search, which
will increase the lock contention of extent tree.

We do not need the parent node every time to determine whether normal
refs are used.  It is only needed when the extent item is the last item
in a leaf.

Therefore, we change it to first use keep_locks=0 for search.  If the
extent item happens to be the last item in the leaf, we then change to
keep_locks=1 for the second search to reduce lock contention.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Robbie Ko <robbieko@synology.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Robbie Ko authored and kdave committed Nov 11, 2024
1 parent 6e6ecde commit 1d16c27
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -795,7 +795,6 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
if (insert) {
extra_size = btrfs_extent_inline_ref_size(want);
path->search_for_extension = 1;
path->keep_locks = 1;
} else
extra_size = -1;

Expand Down Expand Up @@ -946,6 +945,25 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
ret = -EAGAIN;
goto out;
}

if (path->slots[0] + 1 < btrfs_header_nritems(path->nodes[0])) {
struct btrfs_key tmp_key;

btrfs_item_key_to_cpu(path->nodes[0], &tmp_key, path->slots[0] + 1);
if (tmp_key.objectid == bytenr &&
tmp_key.type < BTRFS_BLOCK_GROUP_ITEM_KEY) {
ret = -EAGAIN;
goto out;
}
goto out_no_entry;
}

if (!path->keep_locks) {
btrfs_release_path(path);
path->keep_locks = 1;
goto again;
}

/*
* To add new inline back ref, we have to make sure
* there is no corresponding back ref item.
Expand All @@ -959,13 +977,15 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
goto out;
}
}
out_no_entry:
*ref_ret = (struct btrfs_extent_inline_ref *)ptr;
out:
if (insert) {
if (path->keep_locks) {
path->keep_locks = 0;
path->search_for_extension = 0;
btrfs_unlock_up_safe(path, 1);
}
if (insert)
path->search_for_extension = 0;
return ret;
}

Expand Down

0 comments on commit 1d16c27

Please sign in to comment.