Commit 28967c76 authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba

btrfs: remove redundant memory barrier from extent_io_tree_release()

The memory barrier at extent_io_tree_release() is redundant. Holding
spin_lock here is not enough to drop the barrier completely.  We only
change the waitqueue of an extent state record while holding the tree
lock - see wait_on_state().

The update to waitqueue state will not become stale because there will
be an spin_unlock/spin_lock sequence between the change and waiting,
this implies a full memory barrier.

So remove the explicit smp_mb() barrier.
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
[ reword reasoning ]
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent a1c20d15
...@@ -115,12 +115,6 @@ void extent_io_tree_init(struct btrfs_fs_info *fs_info, ...@@ -115,12 +115,6 @@ void extent_io_tree_init(struct btrfs_fs_info *fs_info,
void extent_io_tree_release(struct extent_io_tree *tree) void extent_io_tree_release(struct extent_io_tree *tree)
{ {
spin_lock(&tree->lock); spin_lock(&tree->lock);
/*
* Do a single barrier for the waitqueue_active check here, the state
* of the waitqueue should not change once extent_io_tree_release is
* called.
*/
smp_mb();
while (!RB_EMPTY_ROOT(&tree->state)) { while (!RB_EMPTY_ROOT(&tree->state)) {
struct rb_node *node; struct rb_node *node;
struct extent_state *state; struct extent_state *state;
...@@ -130,6 +124,11 @@ void extent_io_tree_release(struct extent_io_tree *tree) ...@@ -130,6 +124,11 @@ void extent_io_tree_release(struct extent_io_tree *tree)
rb_erase(&state->rb_node, &tree->state); rb_erase(&state->rb_node, &tree->state);
RB_CLEAR_NODE(&state->rb_node); RB_CLEAR_NODE(&state->rb_node);
ASSERT(!(state->state & EXTENT_LOCKED)); ASSERT(!(state->state & EXTENT_LOCKED));
/*
* No need for a memory barrier here, as we are holding the tree
* lock and we only change the waitqueue while holding that lock
* (see wait_on_state()).
*/
ASSERT(!waitqueue_active(&state->wq)); ASSERT(!waitqueue_active(&state->wq));
free_extent_state(state); free_extent_state(state);
......
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