diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2015-07-13 12:55:58 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2015-07-27 14:06:24 +0200 | 
| commit | 41b9e9fcc1c44b84a785115058ce9c703e3fca6e (patch) | |
| tree | 11ed300cc313d1d4bb19bcc7bc2b5b21090916f0 /lib | |
| parent | 805de8f43c20ba8b479bb598b543fa86b20067f6 (diff) | |
atomic: Add simple atomic_t tests
Add a few atomic_t tests, gets some compile coverage for the new
operations.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/atomic64_test.c | 68 | 
1 files changed, 47 insertions, 21 deletions
diff --git a/lib/atomic64_test.c b/lib/atomic64_test.c index 0211d30d8c39..83c33a5bcffb 100644 --- a/lib/atomic64_test.c +++ b/lib/atomic64_test.c @@ -16,8 +16,39 @@  #include <linux/kernel.h>  #include <linux/atomic.h> +#define TEST(bit, op, c_op, val)				\ +do {								\ +	atomic##bit##_set(&v, v0);				\ +	r = v0;							\ +	atomic##bit##_##op(val, &v);				\ +	r c_op val;						\ +	WARN(atomic##bit##_read(&v) != r, "%Lx != %Lx\n",	\ +		(unsigned long long)atomic##bit##_read(&v),	\ +		(unsigned long long)r);				\ +} while (0) + +static __init void test_atomic(void) +{ +	int v0 = 0xaaa31337; +	int v1 = 0xdeadbeef; +	int onestwos = 0x11112222; +	int one = 1; + +	atomic_t v; +	int r; + +	TEST(, add, +=, onestwos); +	TEST(, add, +=, -one); +	TEST(, sub, -=, onestwos); +	TEST(, sub, -=, -one); +	TEST(, or, |=, v1); +	TEST(, and, &=, v1); +	TEST(, xor, ^=, v1); +	TEST(, andnot, &= ~, v1); +} +  #define INIT(c) do { atomic64_set(&v, c); r = c; } while (0) -static __init int test_atomic64(void) +static __init void test_atomic64(void)  {  	long long v0 = 0xaaa31337c001d00dLL;  	long long v1 = 0xdeadbeefdeafcafeLL; @@ -34,15 +65,14 @@ static __init int test_atomic64(void)  	BUG_ON(v.counter != r);  	BUG_ON(atomic64_read(&v) != r); -	INIT(v0); -	atomic64_add(onestwos, &v); -	r += onestwos; -	BUG_ON(v.counter != r); - -	INIT(v0); -	atomic64_add(-one, &v); -	r += -one; -	BUG_ON(v.counter != r); +	TEST(64, add, +=, onestwos); +	TEST(64, add, +=, -one); +	TEST(64, sub, -=, onestwos); +	TEST(64, sub, -=, -one); +	TEST(64, or, |=, v1); +	TEST(64, and, &=, v1); +	TEST(64, xor, ^=, v1); +	TEST(64, andnot, &= ~, v1);  	INIT(v0);  	r += onestwos; @@ -55,16 +85,6 @@ static __init int test_atomic64(void)  	BUG_ON(v.counter != r);  	INIT(v0); -	atomic64_sub(onestwos, &v); -	r -= onestwos; -	BUG_ON(v.counter != r); - -	INIT(v0); -	atomic64_sub(-one, &v); -	r -= -one; -	BUG_ON(v.counter != r); - -	INIT(v0);  	r -= onestwos;  	BUG_ON(atomic64_sub_return(onestwos, &v) != r);  	BUG_ON(v.counter != r); @@ -147,6 +167,12 @@ static __init int test_atomic64(void)  	BUG_ON(!atomic64_inc_not_zero(&v));  	r += one;  	BUG_ON(v.counter != r); +} + +static __init int test_atomics(void) +{ +	test_atomic(); +	test_atomic64();  #ifdef CONFIG_X86  	pr_info("passed for %s platform %s CX8 and %s SSE\n", @@ -166,4 +192,4 @@ static __init int test_atomic64(void)  	return 0;  } -core_initcall(test_atomic64); +core_initcall(test_atomics);  | 
