Messages in this thread | | | Date | Thu, 7 Sep 2000 09:47:55 -0700 (PDT) | From | Linus Torvalds <> | Subject | Re: spin_lock forgets to clobber memory and other smp fixes [was Re: [patch] waitqueue optimization, 2.4.0-test7] |
| |
On Thu, 7 Sep 2000, Jamie Lokier wrote: > > ps. There is a _clobber_ for memory, but no way to say "this asm _reads_ > arbitrary memory". __volatile__ may be filling that role though.
Nope. "memory" fills that role too. Remember: "memory" doesn't actually say "this clobbers all memory". That would be silly: an asm that just wipes all memory would not be a very useful asm (or rather, it would have just _one_ use: "execve()"). So "memory" really says that the asm clobbers _some_ memory.
Which in turn means that the code scheduler has to synchronize all memory accesses around it - as if the asm was reading all memory. Because if the scheduler would move a store to after the asm, it would give the wrong results if the asm happened to clobber _that_ memory. And the scheduler obviously cannot just drop the store ("Oh, the asm will clobber this anyway"), because it doesn't know which memory regions get clobbered.
Now, the fact that the "memory" clobber also seems to clobber local variables is a bug, I think. Or at least a misfeature. It should not be considered to clobber reloads, as those are really in "registers" - at least as far as the asm is concerned (the compiler could have chosen to just allocate a hard register to that local variable or argument).
Linus
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
| |