On Tue, Apr 3, 2018 at 12:49 PM, Mark Rutland <mark.rutland@xxxxxxx> wrote: > Hi, > > On Fri, Mar 30, 2018 at 11:58:13AM -0400, Sinan Kaya wrote: >> The default implementation of mapping readX() to __raw_readX() is wrong. >> readX() has stronger ordering semantics. Compiler is allowed to reorder >> __raw_readX(). > > Could you please specify what the compiler is potentially reordering > __raw_readX() against, and why this would be wrong? > > e.g. do we care about prior normal memory accesses, subsequent normal > memory accesses, and/or other IO accesses? > > I assume that the asm-generic __raw_{read,write}X() implementations are > all ordered w.r.t. each other (at least for a specific device). I think that is correct: the compiler won't reorder those because of the 'volatile' pointer dereference, but it can reorder access to a normal pointer against a __raw_readl()/__raw_writel(), which breaks the scenario of using writel to trigger a DMA, or using a readl to see if a DMA has completed. The question is whether we should use a stronger barrier such as rmb() amd wmb() here rather than a simple compiler barrier. I would assume that on complex architectures with write buffers and out-of-order prefetching, those are required, while on architectures without those features, the barriers are cheap. Arnd