]>
git.proxmox.com Git - mirror_spl.git/blob - include/asm/atomic_compat.h
1 #ifndef _SPL_ATOMIC_COMPAT_H
2 #define _SPL_ATOMIC_COMPAT_H
4 #include <asm/atomic.h>
5 #include <spl_config.h>
7 #ifndef HAVE_ATOMIC64_T
8 #include <linux/spinlock.h>
15 #define ATOMIC64_INIT(i) { .lock = SPIN_LOCK_UNLOCKED, .val = (i) }
17 static inline void atomic64_add(__s64 i
, atomic64_t
*v
)
21 spin_lock_irqsave(&v
->lock
, flags
);
23 spin_unlock_irqrestore(&v
->lock
, flags
);
26 static inline void atomic64_sub(__s64 i
, atomic64_t
*v
)
30 spin_lock_irqsave(&v
->lock
, flags
);
32 spin_unlock_irqrestore(&v
->lock
, flags
);
35 #define atomic64_inc(v) (atomic64_add(1, (v)))
36 #define atomic64_dec(v) (atomic64_sub(1, (v)))
38 static inline __s64
atomic64_add_return(__s64 i
, atomic64_t
*v
)
43 spin_lock_irqsave(&v
->lock
, flags
);
46 spin_unlock_irqrestore(&v
->lock
, flags
);
51 static inline __s64
atomic64_sub_return(__s64 i
, atomic64_t
*v
)
56 spin_lock_irqsave(&v
->lock
, flags
);
59 spin_unlock_irqrestore(&v
->lock
, flags
);
64 #define atomic64_inc_return(v) (atomic64_add_return(1, (v)))
65 #define atomic64_dec_return(v) (atomic64_sub_return(1, (v)))
67 static inline __s64
atomic64_read(atomic64_t
*v
)
72 spin_lock_irqsave(&v
->lock
, flags
);
74 spin_unlock_irqrestore(&v
->lock
, flags
);
79 static inline void atomic64_set(atomic64_t
*v
, __s64 i
)
83 spin_lock_irqsave(&v
->lock
, flags
);
85 spin_unlock_irqrestore(&v
->lock
, flags
);
88 #endif /* HAVE_ATOMIC64_T */
90 #ifndef HAVE_ATOMIC64_CMPXCHG
91 #define atomic64_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n)))
94 #ifndef HAVE_ATOMIC64_XCHG
95 #define atomic64_xchg(v, n) (xchg(&((v)->counter), n))
98 #endif /* _SPL_ATOMIC_COMPAT_H */