aboutsummaryrefslogtreecommitdiffstats
path: root/include/sys/atomic.h
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2009-12-04 15:54:12 -0800
committerBrian Behlendorf <[email protected]>2009-12-04 15:54:12 -0800
commitd04c8a563c09d6449d5663aa2b57840653defae5 (patch)
treedabaa7102180f3c4e18ac21e1f7fc3618e996bdb /include/sys/atomic.h
parentdb1aa22297d50fa19939e487b5cc7d1f5088c64e (diff)
Atomic64 compatibility for 32-bit systems without kernel support.
This patch is another step towards updating the code to handle the 32-bit kernels which I have not been regularly testing. This changes do not really impact the common case I'm expected which is the latest kernel running on an x86_64 arch. Until the linux-2.6.31 kernel the x86 arch did not have support for 64-bit atomic operations. Additionally, the new atomic_compat.h support for this case was wrong because it embedded a spinlock in the atomic variable which must always and only be 64-bits total. To handle these 32-bit issues we now simply fall back to the --enable-atomic-spinlock implementation if the kernel does not provide the 64-bit atomic funcs. The second issue this patch addresses is the DEBUG_KMEM assumption that there will always be atomic64 funcs available. On 32-bit archs this may not be true, and actually that's just fine. In that case the kernel will will never be able to allocate more the 32-bits worth anyway. So just check if atomic64 funcs are available, if they are not it means this is a 32-bit machine and we can safely use atomic_t's instead.
Diffstat (limited to 'include/sys/atomic.h')
-rw-r--r--include/sys/atomic.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/include/sys/atomic.h b/include/sys/atomic.h
index 7a741de17..f522781fc 100644
--- a/include/sys/atomic.h
+++ b/include/sys/atomic.h
@@ -30,7 +30,14 @@
#include <linux/module.h>
#include <linux/spinlock.h>
#include <sys/types.h>
-#include <asm/atomic_compat.h>
+
+#ifndef HAVE_ATOMIC64_CMPXCHG
+#define atomic64_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n)))
+#endif
+
+#ifndef HAVE_ATOMIC64_XCHG
+#define atomic64_xchg(v, n) (xchg(&((v)->counter), n))
+#endif
/*
* Two approaches to atomic operations are implemented each with its