diff options
Diffstat (limited to 'arch/ia64/include/asm/barrier.h')
-rw-r--r-- | arch/ia64/include/asm/barrier.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h index 60576e06b6fb..d0a69aa35e27 100644 --- a/arch/ia64/include/asm/barrier.h +++ b/arch/ia64/include/asm/barrier.h | |||
@@ -45,14 +45,37 @@ | |||
45 | # define smp_rmb() rmb() | 45 | # define smp_rmb() rmb() |
46 | # define smp_wmb() wmb() | 46 | # define smp_wmb() wmb() |
47 | # define smp_read_barrier_depends() read_barrier_depends() | 47 | # define smp_read_barrier_depends() read_barrier_depends() |
48 | |||
48 | #else | 49 | #else |
50 | |||
49 | # define smp_mb() barrier() | 51 | # define smp_mb() barrier() |
50 | # define smp_rmb() barrier() | 52 | # define smp_rmb() barrier() |
51 | # define smp_wmb() barrier() | 53 | # define smp_wmb() barrier() |
52 | # define smp_read_barrier_depends() do { } while(0) | 54 | # define smp_read_barrier_depends() do { } while(0) |
55 | |||
53 | #endif | 56 | #endif |
54 | 57 | ||
55 | /* | 58 | /* |
59 | * IA64 GCC turns volatile stores into st.rel and volatile loads into ld.acq no | ||
60 | * need for asm trickery! | ||
61 | */ | ||
62 | |||
63 | #define smp_store_release(p, v) \ | ||
64 | do { \ | ||
65 | compiletime_assert_atomic_type(*p); \ | ||
66 | barrier(); \ | ||
67 | ACCESS_ONCE(*p) = (v); \ | ||
68 | } while (0) | ||
69 | |||
70 | #define smp_load_acquire(p) \ | ||
71 | ({ \ | ||
72 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
73 | compiletime_assert_atomic_type(*p); \ | ||
74 | barrier(); \ | ||
75 | ___p1; \ | ||
76 | }) | ||
77 | |||
78 | /* | ||
56 | * XXX check on this ---I suspect what Linus really wants here is | 79 | * XXX check on this ---I suspect what Linus really wants here is |
57 | * acquire vs release semantics but we can't discuss this stuff with | 80 | * acquire vs release semantics but we can't discuss this stuff with |
58 | * Linus just yet. Grrr... | 81 | * Linus just yet. Grrr... |