Source
146
146
CMPXCHG_FAMILY_TEST(, v0, v1, onestwos);
147
147
148
148
}
149
149
150
150
#define INIT(c) do { atomic64_set(&v, c); r = c; } while (0)
151
151
static __init void test_atomic64(void)
152
152
{
153
153
long long v0 = 0xaaa31337c001d00dLL;
154
154
long long v1 = 0xdeadbeefdeafcafeLL;
155
155
long long v2 = 0xfaceabadf00df001LL;
156
+
long long v3 = 0x8000000000000000LL;
156
157
long long onestwos = 0x1111111122222222LL;
157
158
long long one = 1LL;
159
+
int r_int;
158
160
159
161
atomic64_t v = ATOMIC64_INIT(v0);
160
162
long long r = v0;
161
163
BUG_ON(v.counter != r);
162
164
163
165
atomic64_set(&v, v1);
164
166
r = v1;
165
167
BUG_ON(v.counter != r);
166
168
BUG_ON(atomic64_read(&v) != r);
167
169
233
235
BUG_ON(v.counter != r);
234
236
235
237
INIT(0);
236
238
BUG_ON(atomic64_inc_not_zero(&v));
237
239
BUG_ON(v.counter != r);
238
240
239
241
INIT(-one);
240
242
BUG_ON(!atomic64_inc_not_zero(&v));
241
243
r += one;
242
244
BUG_ON(v.counter != r);
245
+
246
+
/* Confirm the return value fits in an int, even if the value doesn't */
247
+
INIT(v3);
248
+
r_int = atomic64_inc_not_zero(&v);
249
+
BUG_ON(!r_int);
243
250
}
244
251
245
252
static __init int test_atomics_init(void)
246
253
{
247
254
test_atomic();
248
255
test_atomic64();
249
256
250
257
#ifdef CONFIG_X86
251
258
pr_info("passed for %s platform %s CX8 and %s SSE\n",
252
259
#ifdef CONFIG_X86_64