Browse Source

locking/mcs: Allow architecture specific asm files to be used for contended case

This patch allows each architecture to add its specific assembly optimized
arch_mcs_spin_lock_contended and arch_mcs_spinlock_uncontended for
MCS lock and unlock functions.

Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Scott J Norton <scott.norton@hp.com>
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Cc: AswinChandramouleeswaran <aswin@hp.com>
Cc: George Spelvin <linux@horizon.com>
Cc: Rik vanRiel <riel@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: MichelLespinasse <walken@google.com>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Alex Shi <alex.shi@linaro.org>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Figo.zhang" <figo1802@gmail.com>
Cc: "Paul E.McKenney" <paulmck@linux.vnet.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Davidlohr Bueso <davidlohr.bueso@hp.com>
Cc: Waiman Long <waiman.long@hp.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthew R Wilcox <matthew.r.wilcox@intel.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1390347382.3138.67.camel@schen9-DESK
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Tim Chen 11 years ago
parent
commit
ddf1d169c0

+ 1 - 0
arch/alpha/include/asm/Kbuild

@@ -3,5 +3,6 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/arc/include/asm/Kbuild

@@ -22,6 +22,7 @@ generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += param.h
 generic-y += param.h

+ 1 - 0
arch/arm/include/asm/Kbuild

@@ -14,6 +14,7 @@ generic-y += irq_regs.h
 generic-y += kdebug.h
 generic-y += kdebug.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += param.h
 generic-y += param.h
 generic-y += parport.h
 generic-y += parport.h

+ 1 - 0
arch/arm64/include/asm/Kbuild

@@ -23,6 +23,7 @@ generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += mutex.h
 generic-y += mutex.h

+ 1 - 0
arch/avr32/include/asm/Kbuild

@@ -11,6 +11,7 @@ generic-y += hash.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += param.h
 generic-y += param.h
 generic-y += percpu.h
 generic-y += percpu.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 1 - 0
arch/blackfin/include/asm/Kbuild

@@ -20,6 +20,7 @@ generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += mutex.h
 generic-y += mutex.h

+ 1 - 0
arch/c6x/include/asm/Kbuild

@@ -25,6 +25,7 @@ generic-y += irq_regs.h
 generic-y += kdebug.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kmap_types.h
 generic-y += local.h
 generic-y += local.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += mmu.h
 generic-y += mmu.h
 generic-y += mmu_context.h
 generic-y += mmu_context.h

+ 1 - 0
arch/cris/include/asm/Kbuild

@@ -9,6 +9,7 @@ generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += linkage.h
+generic-y += mcs_spinlock.h
 generic-y += module.h
 generic-y += module.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/frv/include/asm/Kbuild

@@ -2,5 +2,6 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/hexagon/include/asm/Kbuild

@@ -27,6 +27,7 @@ generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kmap_types.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += pci.h
 generic-y += pci.h

+ 1 - 0
arch/ia64/include/asm/Kbuild

@@ -3,6 +3,7 @@ generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h
 generic-y += vtime.h
 generic-y += vtime.h

+ 1 - 0
arch/m32r/include/asm/Kbuild

@@ -2,6 +2,7 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += module.h
 generic-y += module.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/m68k/include/asm/Kbuild

@@ -16,6 +16,7 @@ generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += percpu.h
 generic-y += percpu.h

+ 1 - 0
arch/metag/include/asm/Kbuild

@@ -24,6 +24,7 @@ generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += param.h
 generic-y += param.h

+ 1 - 0
arch/microblaze/include/asm/Kbuild

@@ -3,6 +3,7 @@ generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += syscalls.h
 generic-y += syscalls.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/mips/include/asm/Kbuild

@@ -4,6 +4,7 @@ generic-y += current.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += hash.h
 generic-y += hash.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += parport.h
 generic-y += parport.h
 generic-y += percpu.h
 generic-y += percpu.h

+ 1 - 0
arch/mn10300/include/asm/Kbuild

@@ -3,5 +3,6 @@ generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/openrisc/include/asm/Kbuild

@@ -35,6 +35,7 @@ generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kmap_types.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += module.h
 generic-y += module.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h

+ 1 - 0
arch/parisc/include/asm/Kbuild

@@ -14,6 +14,7 @@ generic-y += kdebug.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += param.h
 generic-y += param.h
 generic-y += percpu.h
 generic-y += percpu.h

+ 1 - 0
arch/powerpc/include/asm/Kbuild

@@ -1,6 +1,7 @@
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += rwsem.h
 generic-y += rwsem.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/s390/include/asm/Kbuild

@@ -2,5 +2,6 @@
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h

+ 1 - 0
arch/score/include/asm/Kbuild

@@ -5,6 +5,7 @@ header-y +=
 generic-y += barrier.h
 generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += hash.h
 generic-y += hash.h
+generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += trace_clock.h
 generic-y += trace_clock.h
 generic-y += xor.h
 generic-y += xor.h

+ 1 - 0
arch/sh/include/asm/Kbuild

@@ -15,6 +15,7 @@ generic-y += irq_regs.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += param.h
 generic-y += param.h

+ 1 - 0
arch/sparc/include/asm/Kbuild

@@ -11,6 +11,7 @@ generic-y += irq_regs.h
 generic-y += linkage.h
 generic-y += linkage.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += module.h
 generic-y += module.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 1 - 0
arch/tile/include/asm/Kbuild

@@ -19,6 +19,7 @@ generic-y += ipcbuf.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += param.h
 generic-y += param.h

+ 1 - 0
arch/um/include/asm/Kbuild

@@ -15,6 +15,7 @@ generic-y += hw_irq.h
 generic-y += io.h
 generic-y += io.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += kdebug.h
 generic-y += kdebug.h
+generic-y += mcs_spinlock.h
 generic-y += mutex.h
 generic-y += mutex.h
 generic-y += param.h
 generic-y += param.h
 generic-y += pci.h
 generic-y += pci.h

+ 1 - 0
arch/unicore32/include/asm/Kbuild

@@ -25,6 +25,7 @@ generic-y += irq_regs.h
 generic-y += kdebug.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kmap_types.h
 generic-y += local.h
 generic-y += local.h
+generic-y += mcs_spinlock.h
 generic-y += mman.h
 generic-y += mman.h
 generic-y += module.h
 generic-y += module.h
 generic-y += msgbuf.h
 generic-y += msgbuf.h

+ 1 - 0
arch/x86/include/asm/Kbuild

@@ -5,3 +5,4 @@ genhdr-y += unistd_64.h
 genhdr-y += unistd_x32.h
 genhdr-y += unistd_x32.h
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
+generic-y += mcs_spinlock.h

+ 1 - 0
arch/xtensa/include/asm/Kbuild

@@ -18,6 +18,7 @@ generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += linkage.h
 generic-y += local.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += local64.h
+generic-y += mcs_spinlock.h
 generic-y += percpu.h
 generic-y += percpu.h
 generic-y += preempt.h
 generic-y += preempt.h
 generic-y += resource.h
 generic-y += resource.h

+ 13 - 0
include/asm-generic/mcs_spinlock.h

@@ -0,0 +1,13 @@
+#ifndef __ASM_MCS_SPINLOCK_H
+#define __ASM_MCS_SPINLOCK_H
+
+/*
+ * Architectures can define their own:
+ *
+ *   arch_mcs_spin_lock_contended(l)
+ *   arch_mcs_spin_unlock_contended(l)
+ *
+ * See kernel/locking/mcs_spinlock.c.
+ */
+
+#endif /* __ASM_MCS_SPINLOCK_H */

+ 2 - 0
include/linux/mcs_spinlock.h

@@ -12,6 +12,8 @@
 #ifndef __LINUX_MCS_SPINLOCK_H
 #ifndef __LINUX_MCS_SPINLOCK_H
 #define __LINUX_MCS_SPINLOCK_H
 #define __LINUX_MCS_SPINLOCK_H
 
 
+#include <asm/mcs_spinlock.h>
+
 struct mcs_spinlock {
 struct mcs_spinlock {
 	struct mcs_spinlock *next;
 	struct mcs_spinlock *next;
 	int locked; /* 1 if lock acquired */
 	int locked; /* 1 if lock acquired */