Re: [slubllv5 07/25] x86: Add support for cmpxchg_double

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Le jeudi 26 mai 2011 Ã 16:16 -0500, Christoph Lameter a Ãcrit :
> Here is a new patch that may address the concerns. The list of cpus that
> support CMPXCHG_DOUBLE is not complete.Could someone help me complete it?
> 
> 
> 
> Subject: x86: Add support for cmpxchg_double
> 
> A simple implementation that only supports the word size and does not
> have a fallback mode (would require a spinlock).
> 
> And 32 and 64 bit support for cmpxchg_double. cmpxchg double uses
> the cmpxchg8b or cmpxchg16b instruction on x86 processors to compare
> and swap 2 machine words. This allows lockless algorithms to move more
> context information through critical sections.
> 
> Set a flag CONFIG_CMPXCHG_DOUBLE to signal the support of that feature
> during kernel builds.
> 
> Cc: tj@xxxxxxxxxx
> Signed-off-by: Christoph Lameter <cl@xxxxxxxxx>
> 
> ---
>  arch/x86/Kconfig.cpu              |   10 +++++++
>  arch/x86/include/asm/cmpxchg_32.h |   48 ++++++++++++++++++++++++++++++++++++++
>  arch/x86/include/asm/cmpxchg_64.h |   45 +++++++++++++++++++++++++++++++++++
>  arch/x86/include/asm/cpufeature.h |    1
>  4 files changed, 104 insertions(+)
> 
> Index: linux-2.6/arch/x86/include/asm/cmpxchg_64.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/cmpxchg_64.h	2011-05-26 16:03:33.595608967 -0500
> +++ linux-2.6/arch/x86/include/asm/cmpxchg_64.h	2011-05-26 16:06:25.815607865 -0500
> @@ -151,4 +151,49 @@ extern void __cmpxchg_wrong_size(void);
>  	cmpxchg_local((ptr), (o), (n));					\
>  })
> 
> +#define cmpxchg16b(ptr, o1, o2, n1, n2)				\
> +({								\
> +	char __ret;						\
> +	__typeof__(o2) __junk;					\
> +	__typeof__(*(ptr)) __old1 = (o1);			\
> +	__typeof__(o2) __old2 = (o2);				\
> +	__typeof__(*(ptr)) __new1 = (n1);			\
> +	__typeof__(o2) __new2 = (n2);				\
> +	asm volatile(LOCK_PREFIX_HERE "lock; cmpxchg16b (%%rsi);setz %1" \

If there is no emulation, why do you force rsi here ?

It could be something else, like "=m" (*ptr) ?

(same remark for other functions)


> +		       : "=d"(__junk), "=a"(__ret)		\
> +		       : "S"(ptr), "b"(__new1),	"c"(__new2),	\
> +		         "a"(__old1), "d"(__old2));		\
> +	__ret; })
> +
> +


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxxx  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]