linux/lib/atomic64_test.c
<<
>>
Prefs
   1/*
   2 * Testsuite for atomic64_t functions
   3 *
   4 * Copyright © 2010  Luca Barbieri
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 */
  11#include <linux/init.h>
  12#include <linux/bug.h>
  13#include <linux/kernel.h>
  14#include <linux/atomic.h>
  15
  16#define INIT(c) do { atomic64_set(&v, c); r = c; } while (0)
  17static __init int test_atomic64(void)
  18{
  19        long long v0 = 0xaaa31337c001d00dLL;
  20        long long v1 = 0xdeadbeefdeafcafeLL;
  21        long long v2 = 0xfaceabadf00df001LL;
  22        long long onestwos = 0x1111111122222222LL;
  23        long long one = 1LL;
  24
  25        atomic64_t v = ATOMIC64_INIT(v0);
  26        long long r = v0;
  27        BUG_ON(v.counter != r);
  28
  29        atomic64_set(&v, v1);
  30        r = v1;
  31        BUG_ON(v.counter != r);
  32        BUG_ON(atomic64_read(&v) != r);
  33
  34        INIT(v0);
  35        atomic64_add(onestwos, &v);
  36        r += onestwos;
  37        BUG_ON(v.counter != r);
  38
  39        INIT(v0);
  40        atomic64_add(-one, &v);
  41        r += -one;
  42        BUG_ON(v.counter != r);
  43
  44        INIT(v0);
  45        r += onestwos;
  46        BUG_ON(atomic64_add_return(onestwos, &v) != r);
  47        BUG_ON(v.counter != r);
  48
  49        INIT(v0);
  50        r += -one;
  51        BUG_ON(atomic64_add_return(-one, &v) != r);
  52        BUG_ON(v.counter != r);
  53
  54        INIT(v0);
  55        atomic64_sub(onestwos, &v);
  56        r -= onestwos;
  57        BUG_ON(v.counter != r);
  58
  59        INIT(v0);
  60        atomic64_sub(-one, &v);
  61        r -= -one;
  62        BUG_ON(v.counter != r);
  63
  64        INIT(v0);
  65        r -= onestwos;
  66        BUG_ON(atomic64_sub_return(onestwos, &v) != r);
  67        BUG_ON(v.counter != r);
  68
  69        INIT(v0);
  70        r -= -one;
  71        BUG_ON(atomic64_sub_return(-one, &v) != r);
  72        BUG_ON(v.counter != r);
  73
  74        INIT(v0);
  75        atomic64_inc(&v);
  76        r += one;
  77        BUG_ON(v.counter != r);
  78
  79        INIT(v0);
  80        r += one;
  81        BUG_ON(atomic64_inc_return(&v) != r);
  82        BUG_ON(v.counter != r);
  83
  84        INIT(v0);
  85        atomic64_dec(&v);
  86        r -= one;
  87        BUG_ON(v.counter != r);
  88
  89        INIT(v0);
  90        r -= one;
  91        BUG_ON(atomic64_dec_return(&v) != r);
  92        BUG_ON(v.counter != r);
  93
  94        INIT(v0);
  95        BUG_ON(atomic64_xchg(&v, v1) != v0);
  96        r = v1;
  97        BUG_ON(v.counter != r);
  98
  99        INIT(v0);
 100        BUG_ON(atomic64_cmpxchg(&v, v0, v1) != v0);
 101        r = v1;
 102        BUG_ON(v.counter != r);
 103
 104        INIT(v0);
 105        BUG_ON(atomic64_cmpxchg(&v, v2, v1) != v0);
 106        BUG_ON(v.counter != r);
 107
 108        INIT(v0);
 109        BUG_ON(atomic64_add_unless(&v, one, v0));
 110        BUG_ON(v.counter != r);
 111
 112        INIT(v0);
 113        BUG_ON(!atomic64_add_unless(&v, one, v1));
 114        r += one;
 115        BUG_ON(v.counter != r);
 116
 117#ifdef CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
 118        INIT(onestwos);
 119        BUG_ON(atomic64_dec_if_positive(&v) != (onestwos - 1));
 120        r -= one;
 121        BUG_ON(v.counter != r);
 122
 123        INIT(0);
 124        BUG_ON(atomic64_dec_if_positive(&v) != -one);
 125        BUG_ON(v.counter != r);
 126
 127        INIT(-one);
 128        BUG_ON(atomic64_dec_if_positive(&v) != (-one - one));
 129        BUG_ON(v.counter != r);
 130#else
 131#warning Please implement atomic64_dec_if_positive for your architecture and select the above Kconfig symbol
 132#endif
 133
 134        INIT(onestwos);
 135        BUG_ON(!atomic64_inc_not_zero(&v));
 136        r += one;
 137        BUG_ON(v.counter != r);
 138
 139        INIT(0);
 140        BUG_ON(atomic64_inc_not_zero(&v));
 141        BUG_ON(v.counter != r);
 142
 143        INIT(-one);
 144        BUG_ON(!atomic64_inc_not_zero(&v));
 145        r += one;
 146        BUG_ON(v.counter != r);
 147
 148#ifdef CONFIG_X86
 149        printk(KERN_INFO "atomic64 test passed for %s platform %s CX8 and %s SSE\n",
 150#ifdef CONFIG_X86_64
 151               "x86-64",
 152#elif defined(CONFIG_X86_CMPXCHG64)
 153               "i586+",
 154#else
 155               "i386+",
 156#endif
 157               boot_cpu_has(X86_FEATURE_CX8) ? "with" : "without",
 158               boot_cpu_has(X86_FEATURE_XMM) ? "with" : "without");
 159#else
 160        printk(KERN_INFO "atomic64 test passed\n");
 161#endif
 162
 163        return 0;
 164}
 165
 166core_initcall(test_atomic64);
 167
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.