[parisc-linux] Re: [PATCH] Fix the atomic compare and swap function on hppa
Carlos O'Donell
carlos at systemhalted.org
Sun May 20 09:22:18 MDT 2007
On 5/19/07, Aurelien Jarno <aurelien at aurel32.net> wrote:
> 2007-05-20 Aurelien Jarno <aurelien at aurel32.net>
>
> * sysdeps/unix/sysv/linux/hppa/bits/atomic.h: check for
> -EAGAIN instead of EAGAIN.
>
> --- ports/sysdeps/unix/sysv/linux/hppa/bits/atomic.h.orig 2007-05-20 03:28:39.000000000 +0200
> +++ ports/sysdeps/unix/sysv/linux/hppa/bits/atomic.h 2007-05-20 03:24:41.000000000 +0200
> @@ -56,7 +56,7 @@
> #define LWS_CAS "0"
> /* Note r31 is the link register */
> #define LWS_CLOBBER "r1", "r26", "r25", "r24", "r23", "r22", "r21", "r20", "r28", "r31", "memory"
> -#define ASM_EAGAIN "11"
> +#define ASM_EAGAIN "-11"
>
> #if __ASSUME_LWS_CAS
> /* The only basic operation needed is compare and exchange. */
Aurelian,
Good catch! I applaud your effort! I'll test the patch this week and
get it into cvs.
If the kernel is returning EAGAIN it means there are multiple threads
calling LWS CAS on addresses whose hash selects the same kernel
spinlock (there is an array of 16 for minimal scalability). The kernel
never spins and expects the caller to spin in userpace.
The verified the original test code I wrote does check for "-11", and
I did run the kernel tests on an SMP machine with multiple threads, so
I know that LWS CAS works on SMP.
Cheers,
Carlos.
More information about the parisc-linux
mailing list