summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-io-tree.c
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2023-09-22 11:39:05 +0100
committerDavid Sterba <dsterba@suse.com>2023-10-12 16:44:15 +0200
commit28967c762220d22ca26f4a5acacb69b9fbb9748b (patch)
treea61711971feee1a9b604fddf846fc9637ddd5f83 /fs/btrfs/extent-io-tree.c
parenta1c20d15ee1e2cdcb54134174f0dab3b2fbcf4e4 (diff)
downloadlinux-28967c762220d22ca26f4a5acacb69b9fbb9748b.tar.gz
linux-28967c762220d22ca26f4a5acacb69b9fbb9748b.tar.bz2
linux-28967c762220d22ca26f4a5acacb69b9fbb9748b.zip
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: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> [ reword reasoning ] Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/extent-io-tree.c')
-rw-r--r--fs/btrfs/extent-io-tree.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/btrfs/extent-io-tree.c b/fs/btrfs/extent-io-tree.c
index 58b3ea36a727..19a7a0b3e863 100644
--- a/fs/btrfs/extent-io-tree.c
+++ b/fs/btrfs/extent-io-tree.c
@@ -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)
{
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)) {
struct rb_node *node;
struct extent_state *state;
@@ -130,6 +124,11 @@ void extent_io_tree_release(struct extent_io_tree *tree)
rb_erase(&state->rb_node, &tree->state);
RB_CLEAR_NODE(&state->rb_node);
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));
free_extent_state(state);