This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On 5/19/07, Aurelien Jarno <aurelien@aurel32.net> wrote:
2007-05-20 Aurelien Jarno <aurelien@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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]