diff options
author | Michael S. Tsirkin | 2016-01-07 17:54:54 +0200 |
---|---|---|
committer | Michael S. Tsirkin | 2016-01-12 20:47:01 +0200 |
commit | 3226aad81aa670015a59e51458a0deb2d3bcb600 (patch) | |
tree | 0cc2ab0abf363ad3f851fdcb14c0f7c1386e89de /arch/sh/include/asm/cmpxchg.h | |
parent | a65961272e1ebdb60804bbe2bb440481fcbd1c76 (diff) |
sh: support 1 and 2 byte xchg
This completes the xchg implementation for sh architecture. Note: The
llsc variant is tricky since this only supports 4 byte atomics, the
existing implementation of 1 byte xchg is wrong: we need to do a 4 byte
cmpxchg and retry if any bytes changed meanwhile.
Write this in C for clarity.
Suggested-by: Rich Felker <dalias@libc.org>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Diffstat (limited to 'arch/sh/include/asm/cmpxchg.h')
-rw-r--r-- | arch/sh/include/asm/cmpxchg.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h index 85c97b188d71..5225916c1057 100644 --- a/arch/sh/include/asm/cmpxchg.h +++ b/arch/sh/include/asm/cmpxchg.h @@ -27,6 +27,9 @@ extern void __xchg_called_with_bad_pointer(void); case 4: \ __xchg__res = xchg_u32(__xchg_ptr, x); \ break; \ + case 2: \ + __xchg__res = xchg_u16(__xchg_ptr, x); \ + break; \ case 1: \ __xchg__res = xchg_u8(__xchg_ptr, x); \ break; \ |