On Sun, 31 Jul 2022, Linus Torvalds wrote: > [ Will and Paul, question for you below ] > > On Sun, Jul 31, 2022 at 8:08 AM Mikulas Patocka <mpatocka@xxxxxxxxxx> wrote: > > > > Also, there is this pattern present several times: > > wait_on_buffer(bh); > > if (!buffer_uptodate(bh)) > > err = -EIO; > > It may be possible that buffer_uptodate is executed before wait_on_buffer > > and it may return spurious error. > > I'm not convinced that's actually valid. > > They are testing the same memory location, and I don't think our > memory ordering model allows for _that_ to be out-of-order. Memory > barriers are for accesses to different memory locations. You are right. And the bit tests are volatile, so the compiler can't reorder them. But the compiler can reorder non-volatile accesses around volatile accesses (gcc does this, clang afaik doesn't), so the bit tests need at least a compiler barrier after them. > But the patch looks fine, though I agree that the ordering in > __wait_on_buffer should probably be moved into > wait_on_bit/wait_on_bit_io. Yes, there are more bugs where the code does wait_on_bit and then reads some data without any barrier. Adding the barrier to wait_on_bit fixes that. I'll send two patches, one for wait_on_bit and the other for buffer_locked. Do you think that wait_event also needs a read memory barrier? It is defined as: #define wait_event(wq_head, condition) \ do { \ might_sleep(); \ if (condition) \ break; \ __wait_event(wq_head, condition); \ } while (0) Mikulas > And would we perhaps want the bitops to have the different ordering > versions? Like "set_bit_release()" and "test_bit_acquire()"? That > would seem to be (a) cleaner and (b) possibly generate better code for > architectures where that makes a difference? > > Linus >