sparc64: Fix rwsem constant bug leading to hangs.
authorDavid S. Miller <davem@davemloft.net>
Wed, 18 Aug 2010 00:09:53 +0000 (17:09 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Aug 2010 00:09:53 +0000 (17:09 -0700)
As noticed by Linus, it is critical that some of the
rwsem constants be signed.  Yet, hex constants are
unsigned unless explicitly casted or negated.

The most critical one is RWSEM_WAITING_BIAS.

This bug was exacerbated by commit
424acaaeb3a3932d64a9b4bd59df6cf72c22d8f3 ("rwsem: wake queued readers
when writer blocks on active read lock")

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/rwsem-const.h

index a303c9d..e4c61a1 100644 (file)
@@ -5,7 +5,7 @@
 #define RWSEM_UNLOCKED_VALUE           0x00000000
 #define RWSEM_ACTIVE_BIAS              0x00000001
 #define RWSEM_ACTIVE_MASK              0x0000ffff
-#define RWSEM_WAITING_BIAS             0xffff0000
+#define RWSEM_WAITING_BIAS             (-0x00010000)
 #define RWSEM_ACTIVE_READ_BIAS         RWSEM_ACTIVE_BIAS
 #define RWSEM_ACTIVE_WRITE_BIAS                (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)