On Wed, Apr 4, 2018 at 7:48 PM, Sinan Kaya <okaya@xxxxxxxxxxxxxx> wrote: > On 4/4/2018 11:55 AM, Arnd Bergmann wrote: >> Yes, exactly, plus the same for write and in/out of course. > > I was looking at this... > > inb() and outb() seem to be calling writeb(). It gets the wmb/barrier automatically > when we fix writeb(). > > Did I miss something? At least outb() needs stricter barriers than writeb() in theory, what we want here is that outb() has not just made it out to the device but that the write has been confirmed completed by the device. Some architectures can't do it, but those that can should have an easy way to hook into that using a separate set of barriers. Using the riscv barrier names, we could do this like #ifndef __io_bw() #define __io_bw() wmb() #endif #ifndef __io_aw #define __io_aw() barrier() #endif #ifndef __io_pbw #define __io_pbw() __io_bw() #endif #ifndef __io_paw #define __io_paw() __io_aw() #endif and the same thing for reads. This way, an architecture could override any of those, but still get reasonable defaults for the others. For __io_bw(), I picked barrier() instead of do {} while (0), no idea if that's any better, I just play safe here. Arnd