Messages in this thread | | | Date | Fri, 20 Jan 2006 18:38:57 -0800 | From | Andrew Morton <> | Subject | Re: set_bit() is broken on i386? |
| |
Andreas Schwab <schwab@suse.de> wrote: > > Trond Myklebust <trond.myklebust@fys.uio.no> writes: > > > On Fri, 2006-01-20 at 19:53 -0500, Chuck Ebbert wrote: > > > >> #define ADDR (*(volatile long *) addr) > >> static inline void set_bit(int nr, volatile unsigned long * addr) > >> { > >> __asm__ __volatile__( "lock ; " > >> "btsl %1,%0" > >> :"=m" (ADDR) > >> :"Ir" (nr)); > >> } > > > > The asm needs a memory clobber in order to avoid reordering with the > > assignment to b[1]: > > Check out 2.6.16-rc1, this has already been fixed. >
No, that doesn't fix this testcase.
We need to somehow tell the compiler "this assembly statement altered memory and you can't cache memory contents across it". That's what "memory" (ie: barrier()) does. I don't think there's a way of telling gcc _what_ memory was clobbered - just "all of memory". - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |