Skip to content

Commit 7a69fa6

Browse files
author
Kent Overstreet
committed
bcachefs: Add missing barriers before wake_up_bit()
wake_up() doesn't require a barrier - but wake_up_bit() does. This only affected non x86, and primarily lead to lost wakeups after btree node reads. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 50a7b89 commit 7a69fa6

File tree

3 files changed

+10
-1
lines changed

3 files changed

+10
-1
lines changed

fs/bcachefs/btree_io.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ void bch2_btree_node_io_unlock(struct btree *b)
4141

4242
clear_btree_node_write_in_flight_inner(b);
4343
clear_btree_node_write_in_flight(b);
44+
smp_mb__after_atomic();
4445
wake_up_bit(&b->flags, BTREE_NODE_write_in_flight);
4546
}
4647

@@ -1400,6 +1401,7 @@ static void btree_node_read_work(struct work_struct *work)
14001401

14011402
printbuf_exit(&buf);
14021403
clear_btree_node_read_in_flight(b);
1404+
smp_mb__after_atomic();
14031405
wake_up_bit(&b->flags, BTREE_NODE_read_in_flight);
14041406
}
14051407

@@ -1595,6 +1597,7 @@ static CLOSURE_CALLBACK(btree_node_read_all_replicas_done)
15951597
printbuf_exit(&buf);
15961598

15971599
clear_btree_node_read_in_flight(b);
1600+
smp_mb__after_atomic();
15981601
wake_up_bit(&b->flags, BTREE_NODE_read_in_flight);
15991602
}
16001603

@@ -1721,6 +1724,7 @@ void bch2_btree_node_read(struct btree_trans *trans, struct btree *b,
17211724
set_btree_node_read_error(b);
17221725
bch2_btree_lost_data(c, b->c.btree_id);
17231726
clear_btree_node_read_in_flight(b);
1727+
smp_mb__after_atomic();
17241728
wake_up_bit(&b->flags, BTREE_NODE_read_in_flight);
17251729
printbuf_exit(&buf);
17261730
return;
@@ -2061,8 +2065,10 @@ static void __btree_node_write_done(struct bch_fs *c, struct btree *b, u64 start
20612065

20622066
if (new & (1U << BTREE_NODE_write_in_flight))
20632067
__bch2_btree_node_write(c, b, BTREE_WRITE_ALREADY_STARTED|type);
2064-
else
2068+
else {
2069+
smp_mb__after_atomic();
20652070
wake_up_bit(&b->flags, BTREE_NODE_write_in_flight);
2071+
}
20662072
}
20672073

20682074
static void btree_node_write_done(struct bch_fs *c, struct btree *b, u64 start_time)
@@ -2175,6 +2181,7 @@ static void btree_node_write_endio(struct bio *bio)
21752181
}
21762182

21772183
clear_btree_node_write_in_flight_inner(b);
2184+
smp_mb__after_atomic();
21782185
wake_up_bit(&b->flags, BTREE_NODE_write_in_flight_inner);
21792186
INIT_WORK(&wb->work, btree_node_write_work);
21802187
queue_work(c->btree_io_complete_wq, &wb->work);

fs/bcachefs/buckets.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static inline void bucket_unlock(struct bucket *b)
4444
BUILD_BUG_ON(!((union ulong_byte_assert) { .ulong = 1UL << BUCKET_LOCK_BITNR }).byte);
4545

4646
clear_bit_unlock(BUCKET_LOCK_BITNR, (void *) &b->lock);
47+
smp_mb__after_atomic();
4748
wake_up_bit((void *) &b->lock, BUCKET_LOCK_BITNR);
4849
}
4950

fs/bcachefs/ec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ static inline void gc_stripe_unlock(struct gc_stripe *s)
160160
BUILD_BUG_ON(!((union ulong_byte_assert) { .ulong = 1UL << BUCKET_LOCK_BITNR }).byte);
161161

162162
clear_bit_unlock(BUCKET_LOCK_BITNR, (void *) &s->lock);
163+
smp_mb__after_atomic();
163164
wake_up_bit((void *) &s->lock, BUCKET_LOCK_BITNR);
164165
}
165166

0 commit comments

Comments
 (0)