[ 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. Even alpha is specified to be locally ordered wrt *one* memory location, including for reads (See table 5-1: "Processor issue order", and also 5.6.2.2: "Litmus test 2"). So if a previous read has seen a new value, a subsequent read is not allowed to see an older one - even without a memory barrier. Will, Paul? Maybe that's only for overlapping loads/stores, not for loads/loads. Because maybe alpha for once isn't the weakest possible ordering. I didn't find this actually in our documentation, so maybe other architectures allow it? Our docs talk about "overlapping loads and stores", and maybe that was meant to imply that "load overlaps with load" case, but it really reads like load-vs-store, not load-vs-load. 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. 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