Re: [PATCH] Fix the atomic compare and swap function on hppa

"Carlos O'Donell" <[email protected]>
Newsgroups gmane.linux.ports.hppa
Message-ID <[email protected]>
On 5/19/07, Aurelien Jarno <[email protected]> wrote:
> 2007-05-20  Aurelien Jarno  <[email protected]>
>
>         * 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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.