diff options
| -rw-r--r-- | arch/tile/Kconfig | 1 | ||||
| -rw-r--r-- | arch/tile/include/asm/atomic.h | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 0e500d90c2a0..9a9d08637ab9 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
| @@ -24,6 +24,7 @@ config TILE | |||
| 24 | select MODULES_USE_ELF_RELA | 24 | select MODULES_USE_ELF_RELA |
| 25 | select HAVE_ARCH_TRACEHOOK | 25 | select HAVE_ARCH_TRACEHOOK |
| 26 | select HAVE_SYSCALL_TRACEPOINTS | 26 | select HAVE_SYSCALL_TRACEPOINTS |
| 27 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | ||
| 27 | 28 | ||
| 28 | # FIXME: investigate whether we need/want these options. | 29 | # FIXME: investigate whether we need/want these options. |
| 29 | # select HAVE_IOREMAP_PROT | 30 | # select HAVE_IOREMAP_PROT |
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h index f2461429a4a4..e71387ab20ca 100644 --- a/arch/tile/include/asm/atomic.h +++ b/arch/tile/include/asm/atomic.h | |||
| @@ -131,4 +131,25 @@ static inline int atomic_read(const atomic_t *v) | |||
| 131 | #include <asm/atomic_64.h> | 131 | #include <asm/atomic_64.h> |
| 132 | #endif | 132 | #endif |
| 133 | 133 | ||
| 134 | #ifndef __ASSEMBLY__ | ||
| 135 | |||
| 136 | static inline long long atomic64_dec_if_positive(atomic64_t *v) | ||
| 137 | { | ||
| 138 | long long c, old, dec; | ||
| 139 | |||
| 140 | c = atomic64_read(v); | ||
| 141 | for (;;) { | ||
| 142 | dec = c - 1; | ||
| 143 | if (unlikely(dec < 0)) | ||
| 144 | break; | ||
| 145 | old = atomic64_cmpxchg((v), c, dec); | ||
| 146 | if (likely(old == c)) | ||
| 147 | break; | ||
| 148 | c = old; | ||
| 149 | } | ||
| 150 | return dec; | ||
| 151 | } | ||
| 152 | |||
| 153 | #endif /* __ASSEMBLY__ */ | ||
| 154 | |||
| 134 | #endif /* _ASM_TILE_ATOMIC_H */ | 155 | #endif /* _ASM_TILE_ATOMIC_H */ |
