Btrfs: try to avoid acquiring free space ctl's lock

We don't need to take the lock if the block group has not been cached.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Liu Bo 2017-02-13 15:42:30 -08:00 committed by David Sterba
parent 6f6b643e44
commit 0c9b36e0d7
1 changed files with 13 additions and 11 deletions

View File

@ -7714,18 +7714,20 @@ unclustered_alloc:
last_ptr->fragmented = 1; last_ptr->fragmented = 1;
spin_unlock(&last_ptr->lock); spin_unlock(&last_ptr->lock);
} }
spin_lock(&block_group->free_space_ctl->tree_lock); if (cached) {
if (cached && struct btrfs_free_space_ctl *ctl =
block_group->free_space_ctl->free_space < block_group->free_space_ctl;
num_bytes + empty_cluster + empty_size) {
if (block_group->free_space_ctl->free_space > spin_lock(&ctl->tree_lock);
max_extent_size) if (ctl->free_space <
max_extent_size = num_bytes + empty_cluster + empty_size) {
block_group->free_space_ctl->free_space; if (ctl->free_space > max_extent_size)
spin_unlock(&block_group->free_space_ctl->tree_lock); max_extent_size = ctl->free_space;
goto loop; spin_unlock(&ctl->tree_lock);
goto loop;
}
spin_unlock(&ctl->tree_lock);
} }
spin_unlock(&block_group->free_space_ctl->tree_lock);
offset = btrfs_find_space_for_alloc(block_group, search_start, offset = btrfs_find_space_for_alloc(block_group, search_start,
num_bytes, empty_size, num_bytes, empty_size,