rx: remove rx_atomic bitops 90/13390/7
authorMark Vitale <mvitale@sinenomine.net>
Fri, 5 Oct 2018 14:39:23 +0000 (10:39 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Tue, 15 Jan 2019 01:05:58 +0000 (20:05 -0500)
The rx_atomic bitops were introduced with commit
1839cdbe268f4b19ac8e81ae78548f5c78e0c641 ("rx: atomic bit ops").

The last (only) reference to them was recently removed with commit
5ced6025b9f11fadbdf2e092bf40cc87499ed277 ("rx: Convert rxinit_status to
rx_IsRunning()").

Remove the now unreferenced bitops.  This commit is comprised of partial
or complete reverts of the following commits:

ae4ad509d35 rx: fix rx_atomic warnings under Solaris (partial)
c16423ec4e6 rx: fix atomics on darwin (partial)
9dc6dd9858a rx: Fix AIX test_and_set_bit (complete)
1839cdbe268 rx: atomic bit ops (complete)

Note: The rx_atomic bitops for Linux systems are known to be broken due
to incorrect casting of rx_atomic_t into the unsigned long operand
expected by the native Linux bitops.  The failure modes include silent
overruns on little-endian and incorrect results on big-endian.  Do not
merely revert this commit in order to bring these bitops back into the
tree.

Change-Id: I6b63519f63d370ccc8df816b4388487909c17dcd
Reviewed-on: https://gerrit.openafs.org/13390
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/rx/rx_atomic.h

index df050e2..72ee054 100644 (file)
@@ -77,34 +77,6 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
     InterlockedExchangeAdd(&atomic->var, 0 - change);
 }
 
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-/* No InterlockedOr or InterlockedAnd on ix86, so just use the
- * BitTest functions */
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    (void) InterlockedBitTestAndSet(&atomic->var, bit);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    (void) InterlockedBitTestAndReset(&atomic->var, bit);
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    return InterlockedBitTestAndSet(&atomic->var, bit);
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    return InterlockedBitTestAndReset(&atomic->var, bit);
-}
-
 #elif defined(AFS_AIX61_ENV) || defined(AFS_USR_AIX61_ENV)
 #include <sys/atomic_op.h>
 
@@ -157,31 +129,6 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
     fetch_and_add(&atomic->var, -change);
 }
 
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    fetch_and_or(&atomic->var, 1<<bit);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    fetch_and_and(&atomic->var, ~(1<<bit));
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    return (fetch_and_or(&atomic->var, (1<<bit)) & 1<<bit) != 0;
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    return (fetch_and_and(&atomic->var, ~(1<<bit)) & 1<<bit) != 0;
-}
-
 #elif defined(AFS_DARWIN80_ENV) || defined(AFS_USR_DARWIN80_ENV)
 
 # if (defined(AFS_DARWIN160_ENV) || defined(AFS_USR_DARWIN160_ENV)) && !defined(KERNEL)
@@ -209,19 +156,6 @@ OSAtomicDecrement32(volatile int *value)
     return OSDecrementAtomic(value) - 1;
 }
 
-static_inline unsigned int
-OSAtomicOr32(unsigned int mask, volatile unsigned int *value)
-{
-    return OSBitOrAtomic(mask, value) | mask;
-}
-
-static_inline unsigned int
-OSAtomicAnd32(unsigned int mask, volatile unsigned int *value)
-{
-    return OSBitAndAtomic(mask, value) & mask;
-}
-#define OSAtomicOr32Orig  OSBitOrAtomic
-#define OSAtomicAnd32Orig OSBitAndAtomic
 # endif
 
 typedef struct {
@@ -272,35 +206,6 @@ static_inline void
 rx_atomic_sub(rx_atomic_t *atomic, int change) {
     OSAtomicAdd32(0 - change, &atomic->var);
 }
-
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    OSAtomicOr32(1<<bit, (volatile uint32_t *)&atomic->var);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    OSAtomicAnd32(~(1<<bit), (volatile uint32_t *)&atomic->var);
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    return ((OSAtomicOr32Orig(1<<bit, (volatile uint32_t *)&atomic->var) & 1<<bit)
-               != 0);
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    return ((OSAtomicAnd32Orig(~(1<<bit),
-                              (volatile uint32_t *)&atomic->var) & 1<<bit)
-           != 0);
-}
-
 #elif defined(AFS_LINUX26_ENV) && defined(KERNEL)
 #include <asm/atomic.h>
 
@@ -315,11 +220,6 @@ typedef atomic_t rx_atomic_t;
 #define rx_atomic_dec(X)         atomic_dec(X)
 #define rx_atomic_dec_and_read(X) atomic_dec_return(X)
 #define rx_atomic_sub(X, V)      atomic_sub(V, X)
-#define rx_atomic_test_bit(X, B)  test_bit(B, (unsigned long *) &(X)->counter)
-#define rx_atomic_set_bit(X, B)   set_bit(B, (unsigned long *) &(X)->counter)
-#define rx_atomic_clear_bit(X, B) clear_bit(B, (unsigned long *) &(X)->counter)
-#define rx_atomic_test_and_set_bit(X, B)    test_and_set_bit(B, (unsigned long *) &(X)->counter)
-#define rx_atomic_test_and_clear_bit(X, B)  test_and_clear_bit(B, (unsigned long *) &(X)->counter)
 
 #elif defined(AFS_SUN510_ENV) || (defined(AFS_SUN5_ENV) && defined(KERNEL) && !defined(UKERNEL))
 
@@ -385,31 +285,6 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
     atomic_add_32(&atomic->var, 0 - change);
 }
 
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    atomic_or_32(&atomic->var, 1<<bit);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    atomic_and_32(&atomic->var, ~(1<<bit));
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    return (atomic_set_long_excl(&atomic->var, bit) == -1);
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    return (atomic_clear_long_excl(&atomic->var, bit) == 0);
-}
-
 #elif defined(__GNUC__) && defined(HAVE_SYNC_FETCH_AND_ADD)
 
 typedef struct {
@@ -461,31 +336,6 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
     (void)__sync_fetch_and_sub(&atomic->var, change);
 }
 
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    (void)__sync_fetch_and_or(&atomic->var, 1<<bit);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    (void)__sync_fetch_and_and(&atomic->var, ~(1<<bit));
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    return (__sync_fetch_and_or(&atomic->var, 1<<bit) & 1<<bit) != 0;
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    return (__sync_fetch_and_and(&atomic->var, ~(1<<bit)) & 1<<bit) != 0;
-}
-
 #else
 
 /* If we're on a platform where we have no idea how to do atomics,
@@ -580,48 +430,6 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
     MUTEX_EXIT(&rx_atomic_mutex);
 }
 
-static_inline int
-rx_atomic_test_bit(rx_atomic_t *atomic, int bit) {
-    return ((unsigned int) rx_atomic_read(atomic) & 1<<bit) != 0;
-}
-
-static_inline void
-rx_atomic_set_bit(rx_atomic_t *atomic, int bit) {
-    MUTEX_ENTER(&rx_atomic_mutex);
-    atomic->var |= (1<<bit);
-    MUTEX_EXIT(&rx_atomic_mutex);
-}
-
-static_inline void
-rx_atomic_clear_bit(rx_atomic_t *atomic, int bit) {
-    MUTEX_ENTER(&rx_atomic_mutex);
-    atomic->var &= ~(1<<bit);
-    MUTEX_EXIT(&rx_atomic_mutex);
-}
-
-static_inline int
-rx_atomic_test_and_set_bit(rx_atomic_t *atomic, int bit) {
-    int val;
-
-    MUTEX_ENTER(&rx_atomic_mutex);
-    val = atomic->var;
-    atomic->var |= 1<<bit;
-    MUTEX_EXIT(&rx_atomic_mutex);
-
-    return (val & 1<<bit) == 1<<bit;
-}
-
-static_inline int
-rx_atomic_test_and_clear_bit(rx_atomic_t *atomic, int bit) {
-    int val;
-
-    MUTEX_ENTER(&rx_atomic_mutex);
-    val = atomic->var;
-    atomic->var &= ~(1<<bit);
-    MUTEX_EXIT(&rx_atomic_mutex);
-
-    return (val & 1<<bit) == 1<<bit;
-}
 #endif
 
 #endif