Commit d7c3f8ce authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds
Browse files

percpu: Omit segment prefix in the UP case for cmpxchg_double



Omit the segment prefix in the UP case. GS is not used then
and we will generate segfaults if cmpxchg16b is used otherwise.

Signed-off-by: default avatarChristoph Lameter <cl@linux.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 76597cd3
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@
#include <linux/stringify.h>

#ifdef CONFIG_SMP
#define __percpu_arg(x)		"%%"__stringify(__percpu_seg)":%P" #x
#define __percpu_prefix		"%%"__stringify(__percpu_seg)":"
#define __my_cpu_offset		percpu_read(this_cpu_off)

/*
@@ -62,9 +62,11 @@
	(typeof(*(ptr)) __kernel __force *)tcp_ptr__;	\
})
#else
#define __percpu_arg(x)		"%P" #x
#define __percpu_prefix		""
#endif

#define __percpu_arg(x)		__percpu_prefix "%P" #x

/*
 * Initialized pointers to per-cpu variables needed for the boot
 * processor need to use these macros to get the proper address
@@ -516,11 +518,11 @@ do { \
	typeof(o2) __n2 = n2;						\
	typeof(o2) __dummy;						\
	alternative_io("call this_cpu_cmpxchg16b_emu\n\t" P6_NOP4,	\
		       "cmpxchg16b %%gs:(%%rsi)\n\tsetz %0\n\t",	\
		       "cmpxchg16b " __percpu_prefix "(%%rsi)\n\tsetz %0\n\t",	\
		       X86_FEATURE_CX16,				\
		       ASM_OUTPUT2("=a"(__ret), "=d"(__dummy)),		\
		       "S" (&pcp1), "b"(__n1), "c"(__n2),		\
		       "a"(__o1), "d"(__o2));				\
		       "a"(__o1), "d"(__o2) : "memory");		\
	__ret;								\
})

+10 −4
Original line number Diff line number Diff line
@@ -10,6 +10,12 @@
#include <asm/frame.h>
#include <asm/dwarf2.h>

#ifdef CONFIG_SMP
#define SEG_PREFIX %gs:
#else
#define SEG_PREFIX
#endif

.text

/*
@@ -37,13 +43,13 @@ this_cpu_cmpxchg16b_emu:
	pushf
	cli

	cmpq %gs:(%rsi), %rax
	cmpq SEG_PREFIX(%rsi), %rax
	jne not_same
	cmpq %gs:8(%rsi), %rdx
	cmpq SEG_PREFIX 8(%rsi), %rdx
	jne not_same

	movq %rbx, %gs:(%rsi)
	movq %rcx, %gs:8(%rsi)
	movq %rbx, SEG_PREFIX(%rsi)
	movq %rcx, SEG_PREFIX 8(%rsi)

	popf
	mov $1, %al