| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef BARRIERS_H |
| #define BARRIERS_H |
| |
| #define barrier() __asm__ __volatile__("" : : : "memory") |
| |
| #ifdef RUN |
| #define smp_mb() __sync_synchronize() |
| #define smp_mb__after_unlock_lock() __sync_synchronize() |
| #else |
| /* |
| * Copied from CBMC's implementation of __sync_synchronize(), which |
| * seems to be disabled by default. |
| */ |
| #define smp_mb() __CPROVER_fence("WWfence", "RRfence", "RWfence", "WRfence", \ |
| "WWcumul", "RRcumul", "RWcumul", "WRcumul") |
| #define smp_mb__after_unlock_lock() __CPROVER_fence("WWfence", "RRfence", "RWfence", "WRfence", \ |
| "WWcumul", "RRcumul", "RWcumul", "WRcumul") |
| #endif |
| |
| /* |
| * Allow memory barriers to be disabled in either the read or write side |
| * of SRCU individually. |
| */ |
| |
| #ifndef NO_SYNC_SMP_MB |
| #define sync_smp_mb() smp_mb() |
| #else |
| #define sync_smp_mb() do {} while (0) |
| #endif |
| |
| #ifndef NO_READ_SIDE_SMP_MB |
| #define rs_smp_mb() smp_mb() |
| #else |
| #define rs_smp_mb() do {} while (0) |
| #endif |
| |
| #define ACCESS_ONCE(x) (*(volatile typeof(x) *) &(x)) |
| #define READ_ONCE(x) ACCESS_ONCE(x) |
| #define WRITE_ONCE(x, val) (ACCESS_ONCE(x) = (val)) |
| |
| #endif |