Michael Buesch <m...@bu3sch.de> wrote on 31/10/2009 21:35:31: > > On Saturday 31 October 2009 21:14:07 Joakim Tjernlund wrote: > > Michael Buesch <m...@bu3sch.de> wrote on 31/10/2009 17:42:54: > > > > > > On Saturday 31 October 2009 14:26:48 Joakim Tjernlund wrote: > > > > > > > > > > > On Friday 30 October 2009 16:08:55 Alessandro Rubini wrote: > > > > > > > > asm("eieio; sync"); > > > > > > > > > > > > > > Hmm... > > > > > > > : : : "memory" > > > > > > > > > > > > > > And, doesn't ";" start a comment in assembly? (no, not on powerpc > > > > > > it seems) > > > > > > > > > > > > Yes, I think the barrier is wrong. > > > > > > Please try with > > > > > > > > > > > > #define mb() __asm__ __volatile__("eieio\n sync\n" : : : > > > > > > "memory") > > > > > > > > > > That definition worked great. I must have missed the : : : "memory" > > > > > bit when > > > > > I was digging through code. > > > > > > > > > > Thanks, that gives me about a 2x speedup over the msync() calls. > > > > > > > > Exactly when should you use the barrier? At every access, > > > > every read or when changing from write to read? > > > > > > Well, it depends on the device you are accessing. I'll give you a small > pseudo example. > > > > > > mmio[0] = address; > > > mmio[1] = data; > > > mb(); > > > mmio[3] |= 0x01; /* This triggers an operation -> address=data */ > > > /* probably also need an mb() here, if the following code > > > * depends on the operation to be triggered. */ > > > > So anything that depends on the previous accesses needs a mb() > > No, not really. I would always put an mb() where the comment is. > Imagine you have two instances of the above (probably in a loop): > > mmio[0] = address; > mmio[1] = data; > mb(); > mmio[3] |= 0x01; /* This triggers an operation -> address=data */ > mb(); > > mmio[0] = address; > mmio[1] = data; > mb(); > mmio[3] |= 0x01; /* This triggers an operation -> address=data */ > mb(); > > > hmm, the mmio[0] and mmio[1] are written in order I hope? > > We do not care in this example, as the write to [3] does trigger > the device operation. We do only care that [0] and [1] are set > when [3] is written. We do not care in what order [0] and [1] are written.
In this example yes, I was wondering in general. > > This is just an artificial example, but I think you get my point. > My point just being is that an mb() does only belong where it matters. > And what matters is defined by your device specifications. So what does guarded memory mapping on ppc mean really? If I need that much mb(), guarded does not seem to do much. Jocke _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev