From: wangrui <wangrui@xxxxxxxxxxx> Signed-by-off: Rui Wang <wangrui@xxxxxxxxxxx> Signed-by-off: hev <r@xxxxxx> --- arch/openrisc/include/asm/cmpxchg.h | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/arch/openrisc/include/asm/cmpxchg.h b/arch/openrisc/include/asm/cmpxchg.h index 79fd16162ccb..c69b91ed4b48 100644 --- a/arch/openrisc/include/asm/cmpxchg.h +++ b/arch/openrisc/include/asm/cmpxchg.h @@ -99,16 +99,10 @@ static inline u32 xchg_small(volatile void *ptr, u32 x, int size) int bitoff = off * BITS_PER_BYTE; #endif u32 bitmask = ((0x1 << size * BITS_PER_BYTE) - 1) << bitoff; - u32 oldv, newv; - u32 ret; - - do { - oldv = READ_ONCE(*p); - ret = (oldv & bitmask) >> bitoff; - newv = (oldv & ~bitmask) | (x << bitoff); - } while (cmpxchg_u32(p, oldv, newv) != oldv); + u32 oldv; - return ret; + oldv = atomic_fetch_and_or(p, ~bitmask, x << bitoff); + return (oldv & bitmask) >> bitoff; } /* -- 2.32.0