tree: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core head: ad6812db385540eb2457c945a8e95fc9095b706c commit: 87d655a48dfe74293f72dc001ed042142cf00d44 [5/7] locking/atomics: Simplify the op definitions in atomic.h some more config: powerpc-allmodconfig (attached as .config) compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 87d655a48dfe74293f72dc001ed042142cf00d44 # save the attached .config to linux build tree make.cross ARCH=powerpc All error/warnings (new ones prefixed by >>): In file included from include/linux/bug.h:5:0, from lib/atomic64_test.c:15: lib/atomic64_test.c: In function 'test_atomic': >> lib/atomic64_test.c:79:9: error: implicit declaration of function 'atomic_xchg_acquire'; did you mean 'atomic_cmpxchg_acquire'? [-Werror=implicit-function-declaration] BUG_ON(atomic##bit##_##op(&v, ##args) != ret); \ ^ arch/powerpc/include/asm/bug.h:76:27: note: in definition of macro 'BUG_ON' if (__builtin_constant_p(x)) { \ ^ >> lib/atomic64_test.c:43:2: note: in expansion of macro 'TEST_ARGS' test(bit, op##_acquire, ##args); \ ^~~~ >> lib/atomic64_test.c:85:2: note: in expansion of macro 'FAMILY_TEST' FAMILY_TEST(TEST_ARGS, bit, xchg, init, init, new, new); \ ^~~~~~~~~~~ >> lib/atomic64_test.c:145:2: note: in expansion of macro 'XCHG_FAMILY_TEST' XCHG_FAMILY_TEST(, v0, v1); ^~~~~~~~~~~~~~~~ >> lib/atomic64_test.c:79:9: error: implicit declaration of function 'atomic_xchg_release'; did you mean 'atomic_cmpxchg_release'? [-Werror=implicit-function-declaration] BUG_ON(atomic##bit##_##op(&v, ##args) != ret); \ ^ arch/powerpc/include/asm/bug.h:76:27: note: in definition of macro 'BUG_ON' if (__builtin_constant_p(x)) { \ ^ lib/atomic64_test.c:44:2: note: in expansion of macro 'TEST_ARGS' test(bit, op##_release, ##args); \ ^~~~ >> lib/atomic64_test.c:85:2: note: in expansion of macro 'FAMILY_TEST' FAMILY_TEST(TEST_ARGS, bit, xchg, init, init, new, new); \ ^~~~~~~~~~~ >> lib/atomic64_test.c:145:2: note: in expansion of macro 'XCHG_FAMILY_TEST' XCHG_FAMILY_TEST(, v0, v1); ^~~~~~~~~~~~~~~~ lib/atomic64_test.c: In function 'test_atomic64': >> lib/atomic64_test.c:79:9: error: implicit declaration of function 'atomic64_xchg_acquire'; did you mean 'atomic64_cmpxchg_acquire'? [-Werror=implicit-function-declaration] BUG_ON(atomic##bit##_##op(&v, ##args) != ret); \ ^ arch/powerpc/include/asm/bug.h:76:27: note: in definition of macro 'BUG_ON' if (__builtin_constant_p(x)) { \ ^ >> lib/atomic64_test.c:43:2: note: in expansion of macro 'TEST_ARGS' test(bit, op##_acquire, ##args); \ ^~~~ >> lib/atomic64_test.c:85:2: note: in expansion of macro 'FAMILY_TEST' FAMILY_TEST(TEST_ARGS, bit, xchg, init, init, new, new); \ ^~~~~~~~~~~ lib/atomic64_test.c:207:2: note: in expansion of macro 'XCHG_FAMILY_TEST' XCHG_FAMILY_TEST(64, v0, v1); ^~~~~~~~~~~~~~~~ >> lib/atomic64_test.c:79:9: error: implicit declaration of function 'atomic64_xchg_release'; did you mean 'atomic64_cmpxchg_release'? [-Werror=implicit-function-declaration] BUG_ON(atomic##bit##_##op(&v, ##args) != ret); \ ^ arch/powerpc/include/asm/bug.h:76:27: note: in definition of macro 'BUG_ON' if (__builtin_constant_p(x)) { \ ^ lib/atomic64_test.c:44:2: note: in expansion of macro 'TEST_ARGS' test(bit, op##_release, ##args); \ ^~~~ >> lib/atomic64_test.c:85:2: note: in expansion of macro 'FAMILY_TEST' FAMILY_TEST(TEST_ARGS, bit, xchg, init, init, new, new); \ ^~~~~~~~~~~ lib/atomic64_test.c:207:2: note: in expansion of macro 'XCHG_FAMILY_TEST' XCHG_FAMILY_TEST(64, v0, v1); ^~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +79 lib/atomic64_test.c b3b16d284 Fabian Frederick 2014-06-04 13 86a893807 Luca Barbieri 2010-02-24 14 #include 50af5ead3 Paul Gortmaker 2012-01-20 @15 #include 0dbdd1bfe Peter Huewe 2010-05-24 16 #include 60063497a Arun Sharma 2011-07-26 17 #include 55ded9551 Geert Uytterhoeven 2017-02-24 18 #include 86a893807 Luca Barbieri 2010-02-24 19 153a4334c Andi Kleen 2015-12-01 20 #ifdef CONFIG_X86 cd4d09ec6 Borislav Petkov 2016-01-26 21 #include /* for boot_cpu_has below */ 153a4334c Andi Kleen 2015-12-01 22 #endif 153a4334c Andi Kleen 2015-12-01 23 41b9e9fcc Peter Zijlstra 2015-07-13 24 #define TEST(bit, op, c_op, val) \ 41b9e9fcc Peter Zijlstra 2015-07-13 25 do { \ 41b9e9fcc Peter Zijlstra 2015-07-13 26 atomic##bit##_set(&v, v0); \ 41b9e9fcc Peter Zijlstra 2015-07-13 27 r = v0; \ 41b9e9fcc Peter Zijlstra 2015-07-13 28 atomic##bit##_##op(val, &v); \ 41b9e9fcc Peter Zijlstra 2015-07-13 29 r c_op val; \ 41b9e9fcc Peter Zijlstra 2015-07-13 30 WARN(atomic##bit##_read(&v) != r, "%Lx != %Lx\n", \ 41b9e9fcc Peter Zijlstra 2015-07-13 31 (unsigned long long)atomic##bit##_read(&v), \ 41b9e9fcc Peter Zijlstra 2015-07-13 32 (unsigned long long)r); \ 41b9e9fcc Peter Zijlstra 2015-07-13 33 } while (0) 41b9e9fcc Peter Zijlstra 2015-07-13 34 978e5a369 Boqun Feng 2015-11-04 35 /* 978e5a369 Boqun Feng 2015-11-04 36 * Test for a atomic operation family, 978e5a369 Boqun Feng 2015-11-04 37 * @test should be a macro accepting parameters (bit, op, ...) 978e5a369 Boqun Feng 2015-11-04 38 */ 978e5a369 Boqun Feng 2015-11-04 39 978e5a369 Boqun Feng 2015-11-04 40 #define FAMILY_TEST(test, bit, op, args...) \ 978e5a369 Boqun Feng 2015-11-04 41 do { \ 978e5a369 Boqun Feng 2015-11-04 42 test(bit, op, ##args); \ 978e5a369 Boqun Feng 2015-11-04 @43 test(bit, op##_acquire, ##args); \ 978e5a369 Boqun Feng 2015-11-04 44 test(bit, op##_release, ##args); \ 978e5a369 Boqun Feng 2015-11-04 45 test(bit, op##_relaxed, ##args); \ 978e5a369 Boqun Feng 2015-11-04 46 } while (0) 978e5a369 Boqun Feng 2015-11-04 47 978e5a369 Boqun Feng 2015-11-04 48 #define TEST_RETURN(bit, op, c_op, val) \ 978e5a369 Boqun Feng 2015-11-04 49 do { \ 978e5a369 Boqun Feng 2015-11-04 50 atomic##bit##_set(&v, v0); \ 978e5a369 Boqun Feng 2015-11-04 51 r = v0; \ 978e5a369 Boqun Feng 2015-11-04 52 r c_op val; \ 978e5a369 Boqun Feng 2015-11-04 53 BUG_ON(atomic##bit##_##op(val, &v) != r); \ 978e5a369 Boqun Feng 2015-11-04 54 BUG_ON(atomic##bit##_read(&v) != r); \ 978e5a369 Boqun Feng 2015-11-04 55 } while (0) 978e5a369 Boqun Feng 2015-11-04 56 28aa2bda2 Peter Zijlstra 2016-04-18 57 #define TEST_FETCH(bit, op, c_op, val) \ 28aa2bda2 Peter Zijlstra 2016-04-18 58 do { \ 28aa2bda2 Peter Zijlstra 2016-04-18 59 atomic##bit##_set(&v, v0); \ 28aa2bda2 Peter Zijlstra 2016-04-18 60 r = v0; \ 28aa2bda2 Peter Zijlstra 2016-04-18 61 r c_op val; \ 28aa2bda2 Peter Zijlstra 2016-04-18 62 BUG_ON(atomic##bit##_##op(val, &v) != v0); \ 28aa2bda2 Peter Zijlstra 2016-04-18 63 BUG_ON(atomic##bit##_read(&v) != r); \ 28aa2bda2 Peter Zijlstra 2016-04-18 64 } while (0) 28aa2bda2 Peter Zijlstra 2016-04-18 65 978e5a369 Boqun Feng 2015-11-04 66 #define RETURN_FAMILY_TEST(bit, op, c_op, val) \ 978e5a369 Boqun Feng 2015-11-04 67 do { \ 978e5a369 Boqun Feng 2015-11-04 68 FAMILY_TEST(TEST_RETURN, bit, op, c_op, val); \ 978e5a369 Boqun Feng 2015-11-04 69 } while (0) 978e5a369 Boqun Feng 2015-11-04 70 28aa2bda2 Peter Zijlstra 2016-04-18 71 #define FETCH_FAMILY_TEST(bit, op, c_op, val) \ 28aa2bda2 Peter Zijlstra 2016-04-18 72 do { \ 28aa2bda2 Peter Zijlstra 2016-04-18 73 FAMILY_TEST(TEST_FETCH, bit, op, c_op, val); \ 28aa2bda2 Peter Zijlstra 2016-04-18 74 } while (0) 28aa2bda2 Peter Zijlstra 2016-04-18 75 978e5a369 Boqun Feng 2015-11-04 76 #define TEST_ARGS(bit, op, init, ret, expect, args...) \ 978e5a369 Boqun Feng 2015-11-04 77 do { \ 978e5a369 Boqun Feng 2015-11-04 78 atomic##bit##_set(&v, init); \ 978e5a369 Boqun Feng 2015-11-04 @79 BUG_ON(atomic##bit##_##op(&v, ##args) != ret); \ 978e5a369 Boqun Feng 2015-11-04 80 BUG_ON(atomic##bit##_read(&v) != expect); \ 978e5a369 Boqun Feng 2015-11-04 81 } while (0) 978e5a369 Boqun Feng 2015-11-04 82 978e5a369 Boqun Feng 2015-11-04 83 #define XCHG_FAMILY_TEST(bit, init, new) \ 978e5a369 Boqun Feng 2015-11-04 84 do { \ 978e5a369 Boqun Feng 2015-11-04 @85 FAMILY_TEST(TEST_ARGS, bit, xchg, init, init, new, new); \ 978e5a369 Boqun Feng 2015-11-04 86 } while (0) 978e5a369 Boqun Feng 2015-11-04 87 978e5a369 Boqun Feng 2015-11-04 88 #define CMPXCHG_FAMILY_TEST(bit, init, new, wrong) \ 978e5a369 Boqun Feng 2015-11-04 89 do { \ 978e5a369 Boqun Feng 2015-11-04 90 FAMILY_TEST(TEST_ARGS, bit, cmpxchg, \ 978e5a369 Boqun Feng 2015-11-04 91 init, init, new, init, new); \ 978e5a369 Boqun Feng 2015-11-04 92 FAMILY_TEST(TEST_ARGS, bit, cmpxchg, \ 978e5a369 Boqun Feng 2015-11-04 93 init, init, init, wrong, new); \ 978e5a369 Boqun Feng 2015-11-04 94 } while (0) 978e5a369 Boqun Feng 2015-11-04 95 978e5a369 Boqun Feng 2015-11-04 96 #define INC_RETURN_FAMILY_TEST(bit, i) \ 978e5a369 Boqun Feng 2015-11-04 97 do { \ 978e5a369 Boqun Feng 2015-11-04 98 FAMILY_TEST(TEST_ARGS, bit, inc_return, \ 978e5a369 Boqun Feng 2015-11-04 99 i, (i) + one, (i) + one); \ 978e5a369 Boqun Feng 2015-11-04 100 } while (0) 978e5a369 Boqun Feng 2015-11-04 101 978e5a369 Boqun Feng 2015-11-04 102 #define DEC_RETURN_FAMILY_TEST(bit, i) \ 978e5a369 Boqun Feng 2015-11-04 103 do { \ 978e5a369 Boqun Feng 2015-11-04 104 FAMILY_TEST(TEST_ARGS, bit, dec_return, \ 978e5a369 Boqun Feng 2015-11-04 105 i, (i) - one, (i) - one); \ 978e5a369 Boqun Feng 2015-11-04 106 } while (0) 978e5a369 Boqun Feng 2015-11-04 107 41b9e9fcc Peter Zijlstra 2015-07-13 108 static __init void test_atomic(void) 41b9e9fcc Peter Zijlstra 2015-07-13 109 { 41b9e9fcc Peter Zijlstra 2015-07-13 110 int v0 = 0xaaa31337; 41b9e9fcc Peter Zijlstra 2015-07-13 111 int v1 = 0xdeadbeef; 41b9e9fcc Peter Zijlstra 2015-07-13 112 int onestwos = 0x11112222; 41b9e9fcc Peter Zijlstra 2015-07-13 113 int one = 1; 41b9e9fcc Peter Zijlstra 2015-07-13 114 41b9e9fcc Peter Zijlstra 2015-07-13 115 atomic_t v; 41b9e9fcc Peter Zijlstra 2015-07-13 116 int r; 41b9e9fcc Peter Zijlstra 2015-07-13 117 41b9e9fcc Peter Zijlstra 2015-07-13 118 TEST(, add, +=, onestwos); 41b9e9fcc Peter Zijlstra 2015-07-13 119 TEST(, add, +=, -one); 41b9e9fcc Peter Zijlstra 2015-07-13 120 TEST(, sub, -=, onestwos); 41b9e9fcc Peter Zijlstra 2015-07-13 121 TEST(, sub, -=, -one); 41b9e9fcc Peter Zijlstra 2015-07-13 122 TEST(, or, |=, v1); 41b9e9fcc Peter Zijlstra 2015-07-13 123 TEST(, and, &=, v1); 41b9e9fcc Peter Zijlstra 2015-07-13 124 TEST(, xor, ^=, v1); 41b9e9fcc Peter Zijlstra 2015-07-13 125 TEST(, andnot, &= ~, v1); 978e5a369 Boqun Feng 2015-11-04 126 978e5a369 Boqun Feng 2015-11-04 127 RETURN_FAMILY_TEST(, add_return, +=, onestwos); 978e5a369 Boqun Feng 2015-11-04 128 RETURN_FAMILY_TEST(, add_return, +=, -one); 978e5a369 Boqun Feng 2015-11-04 129 RETURN_FAMILY_TEST(, sub_return, -=, onestwos); 978e5a369 Boqun Feng 2015-11-04 130 RETURN_FAMILY_TEST(, sub_return, -=, -one); 978e5a369 Boqun Feng 2015-11-04 131 28aa2bda2 Peter Zijlstra 2016-04-18 132 FETCH_FAMILY_TEST(, fetch_add, +=, onestwos); 28aa2bda2 Peter Zijlstra 2016-04-18 133 FETCH_FAMILY_TEST(, fetch_add, +=, -one); 28aa2bda2 Peter Zijlstra 2016-04-18 134 FETCH_FAMILY_TEST(, fetch_sub, -=, onestwos); 28aa2bda2 Peter Zijlstra 2016-04-18 135 FETCH_FAMILY_TEST(, fetch_sub, -=, -one); 28aa2bda2 Peter Zijlstra 2016-04-18 136 28aa2bda2 Peter Zijlstra 2016-04-18 137 FETCH_FAMILY_TEST(, fetch_or, |=, v1); 28aa2bda2 Peter Zijlstra 2016-04-18 138 FETCH_FAMILY_TEST(, fetch_and, &=, v1); 28aa2bda2 Peter Zijlstra 2016-04-18 139 FETCH_FAMILY_TEST(, fetch_andnot, &= ~, v1); 28aa2bda2 Peter Zijlstra 2016-04-18 140 FETCH_FAMILY_TEST(, fetch_xor, ^=, v1); 28aa2bda2 Peter Zijlstra 2016-04-18 141 978e5a369 Boqun Feng 2015-11-04 142 INC_RETURN_FAMILY_TEST(, v0); 978e5a369 Boqun Feng 2015-11-04 143 DEC_RETURN_FAMILY_TEST(, v0); 978e5a369 Boqun Feng 2015-11-04 144 978e5a369 Boqun Feng 2015-11-04 @145 XCHG_FAMILY_TEST(, v0, v1); 978e5a369 Boqun Feng 2015-11-04 146 CMPXCHG_FAMILY_TEST(, v0, v1, onestwos); 978e5a369 Boqun Feng 2015-11-04 147 :::::: The code at line 79 was first introduced by commit :::::: 978e5a3692c3b674b4c7c412e96835fd996c2ff4 atomics: Add test for atomic operations with _relaxed variants :::::: TO: Boqun Feng :::::: CC: Ingo Molnar --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation