mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 19:04:45 +03:00
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.
This commit is contained in:
@@ -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
|
||||
|
||||
+29
-1
@@ -41,7 +41,7 @@ extern "C" {
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/hash.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <asm/atomic_compat.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/debug.h>
|
||||
#include <sys/vmsystm.h>
|
||||
@@ -109,12 +109,40 @@ kmalloc_node_nofail(size_t size, gfp_t flags, int node)
|
||||
#endif /* HAVE_KMALLOC_NODE */
|
||||
|
||||
#ifdef DEBUG_KMEM
|
||||
# ifdef HAVE_ATOMIC64_T
|
||||
|
||||
extern atomic64_t kmem_alloc_used;
|
||||
extern unsigned long long kmem_alloc_max;
|
||||
extern atomic64_t vmem_alloc_used;
|
||||
extern unsigned long long vmem_alloc_max;
|
||||
|
||||
# define kmem_alloc_used_add(size) atomic64_add(size, &kmem_alloc_used)
|
||||
# define kmem_alloc_used_sub(size) atomic64_sub(size, &kmem_alloc_used)
|
||||
# define kmem_alloc_used_read() atomic64_read(&kmem_alloc_used)
|
||||
# define kmem_alloc_used_set(size) atomic64_set(&kmem_alloc_used, size)
|
||||
# define vmem_alloc_used_add(size) atomic64_add(size, &vmem_alloc_used)
|
||||
# define vmem_alloc_used_sub(size) atomic64_sub(size, &vmem_alloc_used)
|
||||
# define vmem_alloc_used_read() atomic64_read(&vmem_alloc_used)
|
||||
# define vmem_alloc_used_set(size) atomic64_set(&vmem_alloc_used, size)
|
||||
|
||||
# else
|
||||
|
||||
extern atomic_t kmem_alloc_used;
|
||||
extern unsigned long long kmem_alloc_max;
|
||||
extern atomic_t vmem_alloc_used;
|
||||
extern unsigned long long vmem_alloc_max;
|
||||
|
||||
# define kmem_alloc_used_add(size) atomic_add(size, &kmem_alloc_used)
|
||||
# define kmem_alloc_used_sub(size) atomic_sub(size, &kmem_alloc_used)
|
||||
# define kmem_alloc_used_read() atomic_read(&kmem_alloc_used)
|
||||
# define kmem_alloc_used_set(size) atomic_set(&kmem_alloc_used, size)
|
||||
# define vmem_alloc_used_add(size) atomic_add(size, &vmem_alloc_used)
|
||||
# define vmem_alloc_used_sub(size) atomic_sub(size, &vmem_alloc_used)
|
||||
# define vmem_alloc_used_read() atomic_read(&vmem_alloc_used)
|
||||
# define vmem_alloc_used_set(size) atomic_set(&vmem_alloc_used, size)
|
||||
|
||||
# endif /* _LP64 */
|
||||
|
||||
# define kmem_alloc(size, flags) __kmem_alloc((size), (flags), 0, 0)
|
||||
# define kmem_zalloc(size, flags) __kmem_alloc((size), ((flags) | \
|
||||
__GFP_ZERO), 0, 0)
|
||||
|
||||
Reference in New Issue
Block a user