Re: spin_lock forgets to clobber memory and other smp fixes [was Re: [patch] waitqueue optimization, 2.4.0-test7]

From: Andrea Arcangeli (andrea@suse.de)
Date: Thu Sep 07 2000 - 10:56:53 EST


On Thu, 7 Sep 2000, Franz Sirl wrote:

>In short terms:
>
>- __volatile__ assures that the code isn't reordered against other
>__volatile__ and isn't hoisted out of loops, nothing else
>- the "memory" clobber makes sure the asm isn't reordered against other
>memory accesses

Ok. That's all I wanted to hear.

So _definitely_ all spinlocks needs "memory" in the clobber list.

I'll do a new patch reinserting "memory" in __sti and inserting
"memory" also in the spin_unlock() case.

The reason of my doubt was that I only got one agreement by Pavel and none
other comment. Furthmore in practice there was no miscompilation thus I
was wondering if I misunderstood the semantics of __volatile__ (but then
of course I was asking myself what "memory" was good for :))

>Essentially, you _always_ have to tell the compiler if you touch memory
>behind it's back, this includes inline assembly to flush the cache or the

I understand this completly. And as said we can't do that with the
spinlocks (at least with the current API to spin_lock and friends) thus we
need "memory" in the clobber list.

>General rule of thumb for inline assembly:
>
> Give the compiler as much information as possible!!
>
>If you know inline assembly read/writes memory, tell it to the compiler, as
>detailed as possible!

Indeed :). If we could teach all the memory changes to the inline assembly
then "memory" wouldn't be necessary anymore into the clobber list.

Andrea

-
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/



This archive was generated by hypermail 2b29 : Thu Sep 07 2000 - 21:00:30 EST