diff options
Diffstat (limited to 'lib/atomic64_test.c')
| -rw-r--r-- | lib/atomic64_test.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/lib/atomic64_test.c b/lib/atomic64_test.c index 123481814320..46042901130f 100644 --- a/lib/atomic64_test.c +++ b/lib/atomic64_test.c | |||
| @@ -53,11 +53,25 @@ do { \ | |||
| 53 | BUG_ON(atomic##bit##_read(&v) != r); \ | 53 | BUG_ON(atomic##bit##_read(&v) != r); \ |
| 54 | } while (0) | 54 | } while (0) |
| 55 | 55 | ||
| 56 | #define TEST_FETCH(bit, op, c_op, val) \ | ||
| 57 | do { \ | ||
| 58 | atomic##bit##_set(&v, v0); \ | ||
| 59 | r = v0; \ | ||
| 60 | r c_op val; \ | ||
| 61 | BUG_ON(atomic##bit##_##op(val, &v) != v0); \ | ||
| 62 | BUG_ON(atomic##bit##_read(&v) != r); \ | ||
| 63 | } while (0) | ||
| 64 | |||
| 56 | #define RETURN_FAMILY_TEST(bit, op, c_op, val) \ | 65 | #define RETURN_FAMILY_TEST(bit, op, c_op, val) \ |
| 57 | do { \ | 66 | do { \ |
| 58 | FAMILY_TEST(TEST_RETURN, bit, op, c_op, val); \ | 67 | FAMILY_TEST(TEST_RETURN, bit, op, c_op, val); \ |
| 59 | } while (0) | 68 | } while (0) |
| 60 | 69 | ||
| 70 | #define FETCH_FAMILY_TEST(bit, op, c_op, val) \ | ||
| 71 | do { \ | ||
| 72 | FAMILY_TEST(TEST_FETCH, bit, op, c_op, val); \ | ||
| 73 | } while (0) | ||
| 74 | |||
| 61 | #define TEST_ARGS(bit, op, init, ret, expect, args...) \ | 75 | #define TEST_ARGS(bit, op, init, ret, expect, args...) \ |
| 62 | do { \ | 76 | do { \ |
| 63 | atomic##bit##_set(&v, init); \ | 77 | atomic##bit##_set(&v, init); \ |
| @@ -114,6 +128,16 @@ static __init void test_atomic(void) | |||
| 114 | RETURN_FAMILY_TEST(, sub_return, -=, onestwos); | 128 | RETURN_FAMILY_TEST(, sub_return, -=, onestwos); |
| 115 | RETURN_FAMILY_TEST(, sub_return, -=, -one); | 129 | RETURN_FAMILY_TEST(, sub_return, -=, -one); |
| 116 | 130 | ||
| 131 | FETCH_FAMILY_TEST(, fetch_add, +=, onestwos); | ||
| 132 | FETCH_FAMILY_TEST(, fetch_add, +=, -one); | ||
| 133 | FETCH_FAMILY_TEST(, fetch_sub, -=, onestwos); | ||
| 134 | FETCH_FAMILY_TEST(, fetch_sub, -=, -one); | ||
| 135 | |||
| 136 | FETCH_FAMILY_TEST(, fetch_or, |=, v1); | ||
| 137 | FETCH_FAMILY_TEST(, fetch_and, &=, v1); | ||
| 138 | FETCH_FAMILY_TEST(, fetch_andnot, &= ~, v1); | ||
| 139 | FETCH_FAMILY_TEST(, fetch_xor, ^=, v1); | ||
| 140 | |||
| 117 | INC_RETURN_FAMILY_TEST(, v0); | 141 | INC_RETURN_FAMILY_TEST(, v0); |
| 118 | DEC_RETURN_FAMILY_TEST(, v0); | 142 | DEC_RETURN_FAMILY_TEST(, v0); |
| 119 | 143 | ||
| @@ -154,6 +178,16 @@ static __init void test_atomic64(void) | |||
| 154 | RETURN_FAMILY_TEST(64, sub_return, -=, onestwos); | 178 | RETURN_FAMILY_TEST(64, sub_return, -=, onestwos); |
| 155 | RETURN_FAMILY_TEST(64, sub_return, -=, -one); | 179 | RETURN_FAMILY_TEST(64, sub_return, -=, -one); |
| 156 | 180 | ||
| 181 | FETCH_FAMILY_TEST(64, fetch_add, +=, onestwos); | ||
| 182 | FETCH_FAMILY_TEST(64, fetch_add, +=, -one); | ||
| 183 | FETCH_FAMILY_TEST(64, fetch_sub, -=, onestwos); | ||
| 184 | FETCH_FAMILY_TEST(64, fetch_sub, -=, -one); | ||
| 185 | |||
| 186 | FETCH_FAMILY_TEST(64, fetch_or, |=, v1); | ||
| 187 | FETCH_FAMILY_TEST(64, fetch_and, &=, v1); | ||
| 188 | FETCH_FAMILY_TEST(64, fetch_andnot, &= ~, v1); | ||
| 189 | FETCH_FAMILY_TEST(64, fetch_xor, ^=, v1); | ||
| 190 | |||
| 157 | INIT(v0); | 191 | INIT(v0); |
| 158 | atomic64_inc(&v); | 192 | atomic64_inc(&v); |
| 159 | r += one; | 193 | r += one; |
| @@ -179,7 +213,6 @@ static __init void test_atomic64(void) | |||
| 179 | r += one; | 213 | r += one; |
| 180 | BUG_ON(v.counter != r); | 214 | BUG_ON(v.counter != r); |
| 181 | 215 | ||
| 182 | #ifdef CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | ||
| 183 | INIT(onestwos); | 216 | INIT(onestwos); |
| 184 | BUG_ON(atomic64_dec_if_positive(&v) != (onestwos - 1)); | 217 | BUG_ON(atomic64_dec_if_positive(&v) != (onestwos - 1)); |
| 185 | r -= one; | 218 | r -= one; |
| @@ -192,9 +225,6 @@ static __init void test_atomic64(void) | |||
| 192 | INIT(-one); | 225 | INIT(-one); |
| 193 | BUG_ON(atomic64_dec_if_positive(&v) != (-one - one)); | 226 | BUG_ON(atomic64_dec_if_positive(&v) != (-one - one)); |
| 194 | BUG_ON(v.counter != r); | 227 | BUG_ON(v.counter != r); |
| 195 | #else | ||
| 196 | #warning Please implement atomic64_dec_if_positive for your architecture and select the above Kconfig symbol | ||
| 197 | #endif | ||
| 198 | 228 | ||
| 199 | INIT(onestwos); | 229 | INIT(onestwos); |
| 200 | BUG_ON(!atomic64_inc_not_zero(&v)); | 230 | BUG_ON(!atomic64_inc_not_zero(&v)); |
