Re: [PATCH v2 2/2] io: prevent compiler reordering on the default readX() implementation
From: Arnd Bergmann
Date: Wed Apr 04 2018 - 15:50:37 EST
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