diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-08-04 15:18:57 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-08-04 16:40:06 +0200 |
commit | 9160aae97794bac985d8dcb644a12c944fb11d33 (patch) | |
tree | 0f1b7afcc19f223bfdaa70c9d8d31687f2486a3a /src/compat | |
parent | f1ccce3fccbf21422c18fdc45fc89cc5af46b290 (diff) |
compat: better atomic acquire/release backport
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/compat')
-rw-r--r-- | src/compat/compat.h | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/compat/compat.h b/src/compat/compat.h index 86df5f3..c6e1e50 100644 --- a/src/compat/compat.h +++ b/src/compat/compat.h @@ -52,8 +52,12 @@ #define READ_ONCE ACCESS_ONCE #endif #ifndef WRITE_ONCE +#ifdef ACCESS_ONCE_RW +#define WRITE_ONCE(p, v) (ACCESS_ONCE_RW(p) = (v)) +#else #define WRITE_ONCE(p, v) (ACCESS_ONCE(p) = (v)) #endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) #include "udp_tunnel/udp_tunnel_partial_compat.h" @@ -614,24 +618,14 @@ static inline void *skb_put_data(struct sk_buff *skb, const void *data, unsigned #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0) -#ifndef smp_store_release -#define smp_store_release(p, v) \ -do { \ - smp_mb(); \ - ACCESS_ONCE(*p) = (v); \ -} while (0) -#endif -#ifndef smp_load_acquire -#define smp_load_acquire(p) \ -({ \ - typeof(*p) ___p1 = ACCESS_ONCE(*p); \ - smp_mb(); \ - ___p1; \ -}) +#include <linux/atomic.h> +#ifndef atomic_read_acquire +#define atomic_read_acquire(v) ({ int ___p1 = atomic_read(v); smp_rmb(); ___p1; }) #endif +#ifndef atomic_set_release +#define atomic_set_release(v, i) ({ smp_wmb(); atomic_set(v, i); }) #endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) +#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) #include <linux/atomic.h> #ifndef atomic_read_acquire #define atomic_read_acquire(v) smp_load_acquire(&(v)->counter) |