diff options
author | Huang Ying <ying.huang@intel.com> | 2011-07-13 01:14:22 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2011-08-03 11:12:37 -0400 |
commit | df013ffb8119c89f062ab05b7f544704315db47b (patch) | |
tree | db87f30545d2fd6cf9b0a547f09d924df3be90dd | |
parent | 9fb0bfe1408d5506b7b83d13d1eed573fd71d67d (diff) |
Add Kconfig option ARCH_HAVE_NMI_SAFE_CMPXCHG
cmpxchg() is widely used by lockless code, including NMI-safe lockless
code. But on some architectures, the cmpxchg() implementation is not
NMI-safe, on these architectures the lockless code may need a
spin_trylock_irqsave() based implementation.
This patch adds a Kconfig option: ARCH_HAVE_NMI_SAFE_CMPXCHG, so that
NMI-safe lockless code can depend on it or provide different
implementation according to it.
On many architectures, cmpxchg is only NMI-safe for several specific
operand sizes. So, ARCH_HAVE_NMI_SAFE_CMPXCHG define in this patch
only guarantees cmpxchg is NMI-safe for sizeof(unsigned long).
Signed-off-by: Huang Ying <ying.huang@intel.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Acked-by: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Chris Metcalf <cmetcalf@tilera.com>
Acked-by: Richard Henderson <rth@twiddle.net>
CC: Mikael Starvik <starvik@axis.com>
Acked-by: David Howells <dhowells@redhat.com>
CC: Yoshinori Sato <ysato@users.sourceforge.jp>
CC: Tony Luck <tony.luck@intel.com>
CC: Hirokazu Takata <takata@linux-m32r.org>
CC: Geert Uytterhoeven <geert@linux-m68k.org>
CC: Michal Simek <monstr@monstr.eu>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
CC: Kyle McMartin <kyle@mcmartin.ca>
CC: Martin Schwidefsky <schwidefsky@de.ibm.com>
CC: Chen Liqin <liqin.chen@sunplusct.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Ingo Molnar <mingo@redhat.com>
CC: Chris Zankel <chris@zankel.net>
Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r-- | arch/Kconfig | 3 | ||||
-rw-r--r-- | arch/alpha/Kconfig | 1 | ||||
-rw-r--r-- | arch/avr32/Kconfig | 1 | ||||
-rw-r--r-- | arch/frv/Kconfig | 1 | ||||
-rw-r--r-- | arch/ia64/Kconfig | 1 | ||||
-rw-r--r-- | arch/m68k/Kconfig | 1 | ||||
-rw-r--r-- | arch/parisc/Kconfig | 1 | ||||
-rw-r--r-- | arch/powerpc/Kconfig | 1 | ||||
-rw-r--r-- | arch/s390/Kconfig | 1 | ||||
-rw-r--r-- | arch/sh/Kconfig | 1 | ||||
-rw-r--r-- | arch/sparc/Kconfig | 1 | ||||
-rw-r--r-- | arch/tile/Kconfig | 1 | ||||
-rw-r--r-- | arch/x86/Kconfig | 1 |
13 files changed, 15 insertions, 0 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 26b0e2397a57..4b0669cbb3b0 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -178,4 +178,7 @@ config HAVE_ARCH_MUTEX_CPU_RELAX | |||
178 | config HAVE_RCU_TABLE_FREE | 178 | config HAVE_RCU_TABLE_FREE |
179 | bool | 179 | bool |
180 | 180 | ||
181 | config ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
182 | bool | ||
183 | |||
181 | source "kernel/gcov/Kconfig" | 184 | source "kernel/gcov/Kconfig" |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 60219bf94198..23f8d8c32886 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -13,6 +13,7 @@ config ALPHA | |||
13 | select AUTO_IRQ_AFFINITY if SMP | 13 | select AUTO_IRQ_AFFINITY if SMP |
14 | select GENERIC_IRQ_SHOW | 14 | select GENERIC_IRQ_SHOW |
15 | select ARCH_WANT_OPTIONAL_GPIOLIB | 15 | select ARCH_WANT_OPTIONAL_GPIOLIB |
16 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
16 | help | 17 | help |
17 | The Alpha is a 64-bit general-purpose processor designed and | 18 | The Alpha is a 64-bit general-purpose processor designed and |
18 | marketed by the Digital Equipment Corporation of blessed memory, | 19 | marketed by the Digital Equipment Corporation of blessed memory, |
diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig index e9d689b7c833..197e96f70405 100644 --- a/arch/avr32/Kconfig +++ b/arch/avr32/Kconfig | |||
@@ -10,6 +10,7 @@ config AVR32 | |||
10 | select GENERIC_IRQ_PROBE | 10 | select GENERIC_IRQ_PROBE |
11 | select HARDIRQS_SW_RESEND | 11 | select HARDIRQS_SW_RESEND |
12 | select GENERIC_IRQ_SHOW | 12 | select GENERIC_IRQ_SHOW |
13 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
13 | help | 14 | help |
14 | AVR32 is a high-performance 32-bit RISC microprocessor core, | 15 | AVR32 is a high-performance 32-bit RISC microprocessor core, |
15 | designed for cost-sensitive embedded applications, with particular | 16 | designed for cost-sensitive embedded applications, with particular |
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index cb884e489425..bad27a6ff407 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
@@ -7,6 +7,7 @@ config FRV | |||
7 | select HAVE_PERF_EVENTS | 7 | select HAVE_PERF_EVENTS |
8 | select HAVE_GENERIC_HARDIRQS | 8 | select HAVE_GENERIC_HARDIRQS |
9 | select GENERIC_IRQ_SHOW | 9 | select GENERIC_IRQ_SHOW |
10 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
10 | 11 | ||
11 | config ZONE_DMA | 12 | config ZONE_DMA |
12 | bool | 13 | bool |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 38280ef4a2af..b1227ddc672a 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -27,6 +27,7 @@ config IA64 | |||
27 | select GENERIC_PENDING_IRQ if SMP | 27 | select GENERIC_PENDING_IRQ if SMP |
28 | select IRQ_PER_CPU | 28 | select IRQ_PER_CPU |
29 | select GENERIC_IRQ_SHOW | 29 | select GENERIC_IRQ_SHOW |
30 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
30 | default y | 31 | default y |
31 | help | 32 | help |
32 | The Itanium Processor Family is Intel's 64-bit successor to | 33 | The Itanium Processor Family is Intel's 64-bit successor to |
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index d66e34c718d0..effe8f0fa31e 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -6,6 +6,7 @@ config M68K | |||
6 | select GENERIC_ATOMIC64 if MMU | 6 | select GENERIC_ATOMIC64 if MMU |
7 | select HAVE_GENERIC_HARDIRQS if !MMU | 7 | select HAVE_GENERIC_HARDIRQS if !MMU |
8 | select GENERIC_IRQ_SHOW if !MMU | 8 | select GENERIC_IRQ_SHOW if !MMU |
9 | select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS | ||
9 | 10 | ||
10 | config RWSEM_GENERIC_SPINLOCK | 11 | config RWSEM_GENERIC_SPINLOCK |
11 | bool | 12 | bool |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 65adc86a230e..e077b0bf56ca 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -15,6 +15,7 @@ config PARISC | |||
15 | select HAVE_GENERIC_HARDIRQS | 15 | select HAVE_GENERIC_HARDIRQS |
16 | select GENERIC_IRQ_PROBE | 16 | select GENERIC_IRQ_PROBE |
17 | select IRQ_PER_CPU | 17 | select IRQ_PER_CPU |
18 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
18 | 19 | ||
19 | help | 20 | help |
20 | The PA-RISC microprocessor is designed by Hewlett-Packard and used | 21 | The PA-RISC microprocessor is designed by Hewlett-Packard and used |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 2729c6663d8a..e55f754dd50d 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -134,6 +134,7 @@ config PPC | |||
134 | select GENERIC_IRQ_SHOW_LEVEL | 134 | select GENERIC_IRQ_SHOW_LEVEL |
135 | select HAVE_RCU_TABLE_FREE if SMP | 135 | select HAVE_RCU_TABLE_FREE if SMP |
136 | select HAVE_SYSCALL_TRACEPOINTS | 136 | select HAVE_SYSCALL_TRACEPOINTS |
137 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
137 | 138 | ||
138 | config EARLY_PRINTK | 139 | config EARLY_PRINTK |
139 | bool | 140 | bool |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index c03fef7a9c22..0f98bbddade5 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -81,6 +81,7 @@ config S390 | |||
81 | select INIT_ALL_POSSIBLE | 81 | select INIT_ALL_POSSIBLE |
82 | select HAVE_IRQ_WORK | 82 | select HAVE_IRQ_WORK |
83 | select HAVE_PERF_EVENTS | 83 | select HAVE_PERF_EVENTS |
84 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
84 | select HAVE_KERNEL_GZIP | 85 | select HAVE_KERNEL_GZIP |
85 | select HAVE_KERNEL_BZIP2 | 86 | select HAVE_KERNEL_BZIP2 |
86 | select HAVE_KERNEL_LZMA | 87 | select HAVE_KERNEL_LZMA |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index bbdeb48bbf8e..66405eb21766 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -11,6 +11,7 @@ config SUPERH | |||
11 | select HAVE_DMA_ATTRS | 11 | select HAVE_DMA_ATTRS |
12 | select HAVE_IRQ_WORK | 12 | select HAVE_IRQ_WORK |
13 | select HAVE_PERF_EVENTS | 13 | select HAVE_PERF_EVENTS |
14 | select ARCH_HAVE_NMI_SAFE_CMPXCHG if (GUSA_RB || CPU_SH4A) | ||
14 | select PERF_USE_VMALLOC | 15 | select PERF_USE_VMALLOC |
15 | select HAVE_KERNEL_GZIP | 16 | select HAVE_KERNEL_GZIP |
16 | select HAVE_KERNEL_BZIP2 | 17 | select HAVE_KERNEL_BZIP2 |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 253986bd6bb6..a63cddfb3a15 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -53,6 +53,7 @@ config SPARC64 | |||
53 | select HAVE_PERF_EVENTS | 53 | select HAVE_PERF_EVENTS |
54 | select PERF_USE_VMALLOC | 54 | select PERF_USE_VMALLOC |
55 | select IRQ_PREFLOW_FASTEOI | 55 | select IRQ_PREFLOW_FASTEOI |
56 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
56 | 57 | ||
57 | config ARCH_DEFCONFIG | 58 | config ARCH_DEFCONFIG |
58 | string | 59 | string |
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 0249b8b4db54..b30f71ac0d06 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
@@ -12,6 +12,7 @@ config TILE | |||
12 | select GENERIC_PENDING_IRQ if SMP | 12 | select GENERIC_PENDING_IRQ if SMP |
13 | select GENERIC_IRQ_SHOW | 13 | select GENERIC_IRQ_SHOW |
14 | select SYS_HYPERVISOR | 14 | select SYS_HYPERVISOR |
15 | select ARCH_HAVE_NMI_SAFE_CMPXCHG if !M386 | ||
15 | 16 | ||
16 | # FIXME: investigate whether we need/want these options. | 17 | # FIXME: investigate whether we need/want these options. |
17 | # select HAVE_IOREMAP_PROT | 18 | # select HAVE_IOREMAP_PROT |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index da349723d411..a680a60898de 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -70,6 +70,7 @@ config X86 | |||
70 | select IRQ_FORCED_THREADING | 70 | select IRQ_FORCED_THREADING |
71 | select USE_GENERIC_SMP_HELPERS if SMP | 71 | select USE_GENERIC_SMP_HELPERS if SMP |
72 | select HAVE_BPF_JIT if (X86_64 && NET) | 72 | select HAVE_BPF_JIT if (X86_64 && NET) |
73 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
73 | 74 | ||
74 | config INSTRUCTION_DECODER | 75 | config INSTRUCTION_DECODER |
75 | def_bool (KPROBES || PERF_EVENTS) | 76 | def_bool (KPROBES || PERF_EVENTS) |