Messages in this thread | | | Subject | Re: [PATCH v2] sparc: Provide cmpxchg64 for 32-bit builds | From | Joe Perches <> | Date | Wed, 25 Oct 2017 21:53:52 -0700 |
| |
On Wed, 2017-10-25 at 19:51 -0700, Guenter Roeck wrote: > Fix the following build error, seen when building sparc32:allmodconfig. > > drivers/net/ethernet/intel/i40e/i40e_ethtool.c: > In function 'i40e_set_priv_flags': > drivers/net/ethernet/intel/i40e/i40e_ethtool.c:4150:2: error: > implicit declaration of function 'cmpxchg64' > > Signed-off-by: Guenter Roeck <linux@roeck-us.net> > --- > v2: Actually implement cmpxchg64 with code snippet provided by Dave Miller > Note: I am aware that this doesn't pass checkpatch; I found it more > important to be in line with __cmpxchg_u32(). > > arch/sparc/include/asm/cmpxchg_32.h | 2 ++ > arch/sparc/lib/atomic32.c | 14 ++++++++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/arch/sparc/include/asm/cmpxchg_32.h b/arch/sparc/include/asm/cmpxchg_32.h > index 83ffb83c5397..7f95d3ca20e2 100644 > --- a/arch/sparc/include/asm/cmpxchg_32.h > +++ b/arch/sparc/include/asm/cmpxchg_32.h > @@ -62,6 +62,8 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size) > (unsigned long)_n_, sizeof(*(ptr))); \ > }) > > +extern u64 cmpxchg64(u64 *ptr, u64 old, u64 new);
This extern is unusual style for sparc function declarations.
> + > #include <asm-generic/cmpxchg-local.h> > > /* > diff --git a/arch/sparc/lib/atomic32.c b/arch/sparc/lib/atomic32.c > index 2c373329d5cb..41601eb540e7 100644 > --- a/arch/sparc/lib/atomic32.c > +++ b/arch/sparc/lib/atomic32.c > @@ -172,6 +172,20 @@ unsigned long __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new) > } > EXPORT_SYMBOL(__cmpxchg_u32); > > +u64 cmpxchg64(u64 *ptr, u64 old, u64 new) > +{ > + unsigned long flags; > + u64 prev; > + > + spin_lock_irqsave(ATOMIC_HASH(ptr), flags); > + if ((prev = *ptr) == old) > + *ptr = new; > + spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags); > + > + return prev; > +} > +EXPORT_SYMBOL(cmpxchg64); > + > unsigned long __xchg_u32(volatile u32 *ptr, u32 new) > { > unsigned long flags;
| |