2010/12/1 David Laight <David.Laight@xxxxxxxxxx>: > >> A mb() is usually used if you do a write to device and read from it. >> With out it, the CPU could perform the read before the write, which >> would give you an incorrect result. There's no other way around that. > > Possibly the synchronisation functions are doing significantly > more work than is required. > > I was looking at the in_le32() and out_le32() functions for the > ppc e300 (and maybe others). > > The out_le32() contains a 'sync' instruction - this may only > be needed after a series of writes (eg just before a command). > > The iosync() function just adds a 'sync' and can be used as needed. > > The in_le32() not only contains the unwanted 'sync', but also > a 'twi' (trap immediate - NFI exactly what this does) and 'isync'. > The 'isync' is particularly horrid and unnecessary (aborts > the instruction queue and refeches the opcode bytes). > > The very slow in_le32() might be there to give semi-synchronous > traps on address fault - but unless the hardware is being probed > that really isn't necessary. > > I did find st_le32() and ld_le32() in arch/powerpc/include/asm/swab.h > but had difficulty #including that version of swab.h! > Â Â#include <../arch/powerpc/include/asm/swab.h> > worked - but isn't that nice. > > Â Â Â ÂDavid Yes, I was also looking at in_be16 and out_be16, and my thoughts were exactly the same. I think the HW I am using is not a good one, but this is not sufficient to explain the behaviour. These instructions are called, for instance, from bcom_enable_task(). -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html