Message ID | 20231104091615.4884-3-wuqiang.matt@bytedance.com |
---|---|
State | New |
Headers | show |
Series | locking/atomic: arch_cmpxchg[64]_local undefined | expand |
On Sat, 4 Nov 2023 17:16:13 +0800 "wuqiang.matt" <wuqiang.matt@bytedance.com> wrote: > For architectures that support native cmpxchg, we'd like to > implement arch_cmpxchg[64]_local with the native variants of > supported data size. If not, the generci_cmpxchg[64]_local > will be used. > Looks good to me. Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > Signed-off-by: wuqiang.matt <wuqiang.matt@bytedance.com> > --- > arch/arc/include/asm/cmpxchg.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/arch/arc/include/asm/cmpxchg.h b/arch/arc/include/asm/cmpxchg.h > index bf46514f6f12..91429f2350df 100644 > --- a/arch/arc/include/asm/cmpxchg.h > +++ b/arch/arc/include/asm/cmpxchg.h > @@ -80,6 +80,34 @@ > > #endif > > +/* > + * always make arch_cmpxchg[64]_local available, native cmpxchg > + * will be used if available, then generic_cmpxchg[64]_local > + */ > +#include <asm-generic/cmpxchg-local.h> > +static inline unsigned long __cmpxchg_local(volatile void *ptr, > + unsigned long old, > + unsigned long new, int size) > +{ > + switch (size) { > +#ifdef CONFIG_ARC_HAS_LLSC > + case 4: > + return __cmpxchg_32((int32_t *)ptr, old, new); > +#endif > + default: > + return __generic_cmpxchg_local(ptr, old, new, size); > + } > + > + return old; > +} > +#define arch_cmpxchg_local(ptr, o, n) ({ \ > + (__typeof__(*ptr))__cmpxchg_local((ptr), \ > + (unsigned long)(o), \ > + (unsigned long)(n), \ > + sizeof(*(ptr))); \ > +}) > +#define arch_cmpxchg64_local(ptr, o, n) __generic_cmpxchg64_local((ptr), (o), (n)) > + > /* > * xchg > */ > -- > 2.40.1 >
diff --git a/arch/arc/include/asm/cmpxchg.h b/arch/arc/include/asm/cmpxchg.h index bf46514f6f12..91429f2350df 100644 --- a/arch/arc/include/asm/cmpxchg.h +++ b/arch/arc/include/asm/cmpxchg.h @@ -80,6 +80,34 @@ #endif +/* + * always make arch_cmpxchg[64]_local available, native cmpxchg + * will be used if available, then generic_cmpxchg[64]_local + */ +#include <asm-generic/cmpxchg-local.h> +static inline unsigned long __cmpxchg_local(volatile void *ptr, + unsigned long old, + unsigned long new, int size) +{ + switch (size) { +#ifdef CONFIG_ARC_HAS_LLSC + case 4: + return __cmpxchg_32((int32_t *)ptr, old, new); +#endif + default: + return __generic_cmpxchg_local(ptr, old, new, size); + } + + return old; +} +#define arch_cmpxchg_local(ptr, o, n) ({ \ + (__typeof__(*ptr))__cmpxchg_local((ptr), \ + (unsigned long)(o), \ + (unsigned long)(n), \ + sizeof(*(ptr))); \ +}) +#define arch_cmpxchg64_local(ptr, o, n) __generic_cmpxchg64_local((ptr), (o), (n)) + /* * xchg */
For architectures that support native cmpxchg, we'd like to implement arch_cmpxchg[64]_local with the native variants of supported data size. If not, the generci_cmpxchg[64]_local will be used. Signed-off-by: wuqiang.matt <wuqiang.matt@bytedance.com> --- arch/arc/include/asm/cmpxchg.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)