aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/include/asm/processor.h1
-rw-r--r--arch/arc/include/asm/processor.h2
-rw-r--r--arch/arm/include/asm/processor.h2
-rw-r--r--arch/arm64/include/asm/processor.h1
-rw-r--r--arch/avr32/include/asm/processor.h1
-rw-r--r--arch/blackfin/include/asm/processor.h2
-rw-r--r--arch/c6x/include/asm/processor.h1
-rw-r--r--arch/cris/include/asm/processor.h1
-rw-r--r--arch/hexagon/include/asm/processor.h1
-rw-r--r--arch/ia64/include/asm/processor.h1
-rw-r--r--arch/m32r/include/asm/processor.h1
-rw-r--r--arch/m68k/include/asm/processor.h1
-rw-r--r--arch/metag/include/asm/processor.h1
-rw-r--r--arch/microblaze/include/asm/processor.h1
-rw-r--r--arch/mips/include/asm/processor.h1
-rw-r--r--arch/mn10300/include/asm/processor.h2
-rw-r--r--arch/openrisc/include/asm/processor.h1
-rw-r--r--arch/parisc/include/asm/processor.h1
-rw-r--r--arch/powerpc/include/asm/processor.h2
-rw-r--r--arch/s390/include/asm/processor.h2
-rw-r--r--arch/score/include/asm/processor.h1
-rw-r--r--arch/sh/include/asm/processor.h1
-rw-r--r--arch/sparc/include/asm/processor_32.h2
-rw-r--r--arch/sparc/include/asm/processor_64.h1
-rw-r--r--arch/tile/include/asm/processor.h2
-rw-r--r--arch/unicore32/include/asm/processor.h1
-rw-r--r--arch/x86/include/asm/processor.h2
-rw-r--r--arch/x86/um/asm/processor.h3
-rw-r--r--arch/xtensa/include/asm/processor.h1
-rw-r--r--include/linux/mutex.h4
-rw-r--r--kernel/locking/mcs_spinlock.c8
-rw-r--r--kernel/locking/mcs_spinlock.h4
-rw-r--r--kernel/locking/mutex.c4
-rw-r--r--kernel/locking/qrwlock.c9
-rw-r--r--kernel/locking/rwsem-xadd.c4
-rw-r--r--lib/lockref.c3
36 files changed, 51 insertions, 25 deletions
diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h
index 6cb7fe85c4b5..b4cf03690394 100644
--- a/arch/alpha/include/asm/processor.h
+++ b/arch/alpha/include/asm/processor.h
@@ -57,6 +57,7 @@ unsigned long get_wchan(struct task_struct *p);
57 ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp) 57 ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp)
58 58
59#define cpu_relax() barrier() 59#define cpu_relax() barrier()
60#define cpu_relax_lowlatency() cpu_relax()
60 61
61#define ARCH_HAS_PREFETCH 62#define ARCH_HAS_PREFETCH
62#define ARCH_HAS_PREFETCHW 63#define ARCH_HAS_PREFETCHW
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h
index d99f9b37cd15..82588f3ba77f 100644
--- a/arch/arc/include/asm/processor.h
+++ b/arch/arc/include/asm/processor.h
@@ -62,6 +62,8 @@ unsigned long thread_saved_pc(struct task_struct *t);
62#define cpu_relax() do { } while (0) 62#define cpu_relax() do { } while (0)
63#endif 63#endif
64 64
65#define cpu_relax_lowlatency() cpu_relax()
66
65#define copy_segments(tsk, mm) do { } while (0) 67#define copy_segments(tsk, mm) do { } while (0)
66#define release_segments(mm) do { } while (0) 68#define release_segments(mm) do { } while (0)
67 69
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h
index c3d5fc124a05..8a1e8e995dae 100644
--- a/arch/arm/include/asm/processor.h
+++ b/arch/arm/include/asm/processor.h
@@ -82,6 +82,8 @@ unsigned long get_wchan(struct task_struct *p);
82#define cpu_relax() barrier() 82#define cpu_relax() barrier()
83#endif 83#endif
84 84
85#define cpu_relax_lowlatency() cpu_relax()
86
85#define task_pt_regs(p) \ 87#define task_pt_regs(p) \
86 ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) 88 ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
87 89
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index 34de2a8f7d93..4610b0daf1bf 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -129,6 +129,7 @@ extern void release_thread(struct task_struct *);
129unsigned long get_wchan(struct task_struct *p); 129unsigned long get_wchan(struct task_struct *p);
130 130
131#define cpu_relax() barrier() 131#define cpu_relax() barrier()
132#define cpu_relax_lowlatency() cpu_relax()
132 133
133/* Thread switching */ 134/* Thread switching */
134extern struct task_struct *cpu_switch_to(struct task_struct *prev, 135extern struct task_struct *cpu_switch_to(struct task_struct *prev,
diff --git a/arch/avr32/include/asm/processor.h b/arch/avr32/include/asm/processor.h
index 972adcc1e8f4..941593c7d9f3 100644
--- a/arch/avr32/include/asm/processor.h
+++ b/arch/avr32/include/asm/processor.h
@@ -92,6 +92,7 @@ extern struct avr32_cpuinfo boot_cpu_data;
92#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) 92#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
93 93
94#define cpu_relax() barrier() 94#define cpu_relax() barrier()
95#define cpu_relax_lowlatency() cpu_relax()
95#define cpu_sync_pipeline() asm volatile("sub pc, -2" : : : "memory") 96#define cpu_sync_pipeline() asm volatile("sub pc, -2" : : : "memory")
96 97
97struct cpu_context { 98struct cpu_context {
diff --git a/arch/blackfin/include/asm/processor.h b/arch/blackfin/include/asm/processor.h
index d0e72e9475a6..7acd46653df3 100644
--- a/arch/blackfin/include/asm/processor.h
+++ b/arch/blackfin/include/asm/processor.h
@@ -99,7 +99,7 @@ unsigned long get_wchan(struct task_struct *p);
99#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp) 99#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
100 100
101#define cpu_relax() smp_mb() 101#define cpu_relax() smp_mb()
102 102#define cpu_relax_lowlatency() cpu_relax()
103 103
104/* Get the Silicon Revision of the chip */ 104/* Get the Silicon Revision of the chip */
105static inline uint32_t __pure bfin_revid(void) 105static inline uint32_t __pure bfin_revid(void)
diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h
index b9eb3da7f278..f2ef31be2f8b 100644
--- a/arch/c6x/include/asm/processor.h
+++ b/arch/c6x/include/asm/processor.h
@@ -121,6 +121,7 @@ extern unsigned long get_wchan(struct task_struct *p);
121#define KSTK_ESP(task) (task_pt_regs(task)->sp) 121#define KSTK_ESP(task) (task_pt_regs(task)->sp)
122 122
123#define cpu_relax() do { } while (0) 123#define cpu_relax() do { } while (0)
124#define cpu_relax_lowlatency() cpu_relax()
124 125
125extern const struct seq_operations cpuinfo_op; 126extern const struct seq_operations cpuinfo_op;
126 127
diff --git a/arch/cris/include/asm/processor.h b/arch/cris/include/asm/processor.h
index 15b815df29c1..862126b58116 100644
--- a/arch/cris/include/asm/processor.h
+++ b/arch/cris/include/asm/processor.h
@@ -63,6 +63,7 @@ static inline void release_thread(struct task_struct *dead_task)
63#define init_stack (init_thread_union.stack) 63#define init_stack (init_thread_union.stack)
64 64
65#define cpu_relax() barrier() 65#define cpu_relax() barrier()
66#define cpu_relax_lowlatency() cpu_relax()
66 67
67void default_idle(void); 68void default_idle(void);
68 69
diff --git a/arch/hexagon/include/asm/processor.h b/arch/hexagon/include/asm/processor.h
index 45a825402f63..d8501137c8d0 100644
--- a/arch/hexagon/include/asm/processor.h
+++ b/arch/hexagon/include/asm/processor.h
@@ -56,6 +56,7 @@ struct thread_struct {
56} 56}
57 57
58#define cpu_relax() __vmyield() 58#define cpu_relax() __vmyield()
59#define cpu_relax_lowlatency() cpu_relax()
59 60
60/* 61/*
61 * Decides where the kernel will search for a free chunk of vm space during 62 * Decides where the kernel will search for a free chunk of vm space during
diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h
index efd1b927ccb7..c7367130ab14 100644
--- a/arch/ia64/include/asm/processor.h
+++ b/arch/ia64/include/asm/processor.h
@@ -548,6 +548,7 @@ ia64_eoi (void)
548} 548}
549 549
550#define cpu_relax() ia64_hint(ia64_hint_pause) 550#define cpu_relax() ia64_hint(ia64_hint_pause)
551#define cpu_relax_lowlatency() cpu_relax()
551 552
552static inline int 553static inline int
553ia64_get_irr(unsigned int vector) 554ia64_get_irr(unsigned int vector)
diff --git a/arch/m32r/include/asm/processor.h b/arch/m32r/include/asm/processor.h
index 5767367550c6..9f8fd9bef70f 100644
--- a/arch/m32r/include/asm/processor.h
+++ b/arch/m32r/include/asm/processor.h
@@ -133,5 +133,6 @@ unsigned long get_wchan(struct task_struct *p);
133#define KSTK_ESP(tsk) ((tsk)->thread.sp) 133#define KSTK_ESP(tsk) ((tsk)->thread.sp)
134 134
135#define cpu_relax() barrier() 135#define cpu_relax() barrier()
136#define cpu_relax_lowlatency() cpu_relax()
136 137
137#endif /* _ASM_M32R_PROCESSOR_H */ 138#endif /* _ASM_M32R_PROCESSOR_H */
diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h
index b0768a657920..20dda1d4b860 100644
--- a/arch/m68k/include/asm/processor.h
+++ b/arch/m68k/include/asm/processor.h
@@ -176,5 +176,6 @@ unsigned long get_wchan(struct task_struct *p);
176#define task_pt_regs(tsk) ((struct pt_regs *) ((tsk)->thread.esp0)) 176#define task_pt_regs(tsk) ((struct pt_regs *) ((tsk)->thread.esp0))
177 177
178#define cpu_relax() barrier() 178#define cpu_relax() barrier()
179#define cpu_relax_lowlatency() cpu_relax()
179 180
180#endif 181#endif
diff --git a/arch/metag/include/asm/processor.h b/arch/metag/include/asm/processor.h
index a8a37477c66e..881071c07942 100644
--- a/arch/metag/include/asm/processor.h
+++ b/arch/metag/include/asm/processor.h
@@ -155,6 +155,7 @@ unsigned long get_wchan(struct task_struct *p);
155#define user_stack_pointer(regs) ((regs)->ctx.AX[0].U0) 155#define user_stack_pointer(regs) ((regs)->ctx.AX[0].U0)
156 156
157#define cpu_relax() barrier() 157#define cpu_relax() barrier()
158#define cpu_relax_lowlatency() cpu_relax()
158 159
159extern void setup_priv(void); 160extern void setup_priv(void);
160 161
diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h
index 9d31b057c355..497a988d79c2 100644
--- a/arch/microblaze/include/asm/processor.h
+++ b/arch/microblaze/include/asm/processor.h
@@ -22,6 +22,7 @@
22extern const struct seq_operations cpuinfo_op; 22extern const struct seq_operations cpuinfo_op;
23 23
24# define cpu_relax() barrier() 24# define cpu_relax() barrier()
25# define cpu_relax_lowlatency() cpu_relax()
25 26
26#define task_pt_regs(tsk) \ 27#define task_pt_regs(tsk) \
27 (((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1) 28 (((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1)
diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
index ad70cba8daff..d5098bc554f4 100644
--- a/arch/mips/include/asm/processor.h
+++ b/arch/mips/include/asm/processor.h
@@ -367,6 +367,7 @@ unsigned long get_wchan(struct task_struct *p);
367#define KSTK_STATUS(tsk) (task_pt_regs(tsk)->cp0_status) 367#define KSTK_STATUS(tsk) (task_pt_regs(tsk)->cp0_status)
368 368
369#define cpu_relax() barrier() 369#define cpu_relax() barrier()
370#define cpu_relax_lowlatency() cpu_relax()
370 371
371/* 372/*
372 * Return_address is a replacement for __builtin_return_address(count) 373 * Return_address is a replacement for __builtin_return_address(count)
diff --git a/arch/mn10300/include/asm/processor.h b/arch/mn10300/include/asm/processor.h
index 8b80b19d0c8a..769d5ed8e992 100644
--- a/arch/mn10300/include/asm/processor.h
+++ b/arch/mn10300/include/asm/processor.h
@@ -68,7 +68,9 @@ extern struct mn10300_cpuinfo cpu_data[];
68extern void identify_cpu(struct mn10300_cpuinfo *); 68extern void identify_cpu(struct mn10300_cpuinfo *);
69extern void print_cpu_info(struct mn10300_cpuinfo *); 69extern void print_cpu_info(struct mn10300_cpuinfo *);
70extern void dodgy_tsc(void); 70extern void dodgy_tsc(void);
71
71#define cpu_relax() barrier() 72#define cpu_relax() barrier()
73#define cpu_relax_lowlatency() cpu_relax()
72 74
73/* 75/*
74 * User space process size: 1.75GB (default). 76 * User space process size: 1.75GB (default).
diff --git a/arch/openrisc/include/asm/processor.h b/arch/openrisc/include/asm/processor.h
index cab746fa9e87..4d235e3d2534 100644
--- a/arch/openrisc/include/asm/processor.h
+++ b/arch/openrisc/include/asm/processor.h
@@ -101,6 +101,7 @@ extern unsigned long thread_saved_pc(struct task_struct *t);
101#define init_stack (init_thread_union.stack) 101#define init_stack (init_thread_union.stack)
102 102
103#define cpu_relax() barrier() 103#define cpu_relax() barrier()
104#define cpu_relax_lowlatency() cpu_relax()
104 105
105#endif /* __ASSEMBLY__ */ 106#endif /* __ASSEMBLY__ */
106#endif /* __ASM_OPENRISC_PROCESSOR_H */ 107#endif /* __ASM_OPENRISC_PROCESSOR_H */
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h
index d951c9681ab3..689a8ade3606 100644
--- a/arch/parisc/include/asm/processor.h
+++ b/arch/parisc/include/asm/processor.h
@@ -338,6 +338,7 @@ extern unsigned long get_wchan(struct task_struct *p);
338#define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30]) 338#define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30])
339 339
340#define cpu_relax() barrier() 340#define cpu_relax() barrier()
341#define cpu_relax_lowlatency() cpu_relax()
341 342
342/* Used as a macro to identify the combined VIPT/PIPT cached 343/* Used as a macro to identify the combined VIPT/PIPT cached
343 * CPUs which require a guarantee of coherency (no inequivalent 344 * CPUs which require a guarantee of coherency (no inequivalent
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 6d59072e13a7..dda7ac4c80bd 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -400,6 +400,8 @@ static inline unsigned long __pack_fe01(unsigned int fpmode)
400#define cpu_relax() barrier() 400#define cpu_relax() barrier()
401#endif 401#endif
402 402
403#define cpu_relax_lowlatency() cpu_relax()
404
403/* Check that a certain kernel stack pointer is valid in task_struct p */ 405/* Check that a certain kernel stack pointer is valid in task_struct p */
404int validate_sp(unsigned long sp, struct task_struct *p, 406int validate_sp(unsigned long sp, struct task_struct *p,
405 unsigned long nbytes); 407 unsigned long nbytes);
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index 6f02d452bbee..e568fc8a7250 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -217,7 +217,7 @@ static inline void cpu_relax(void)
217 barrier(); 217 barrier();
218} 218}
219 219
220#define arch_mutex_cpu_relax() barrier() 220#define cpu_relax_lowlatency() barrier()
221 221
222static inline void psw_set_key(unsigned int key) 222static inline void psw_set_key(unsigned int key)
223{ 223{
diff --git a/arch/score/include/asm/processor.h b/arch/score/include/asm/processor.h
index d9a922d8711b..851f441991d2 100644
--- a/arch/score/include/asm/processor.h
+++ b/arch/score/include/asm/processor.h
@@ -24,6 +24,7 @@ extern unsigned long get_wchan(struct task_struct *p);
24#define current_text_addr() ({ __label__ _l; _l: &&_l; }) 24#define current_text_addr() ({ __label__ _l; _l: &&_l; })
25 25
26#define cpu_relax() barrier() 26#define cpu_relax() barrier()
27#define cpu_relax_lowlatency() cpu_relax()
27#define release_thread(thread) do {} while (0) 28#define release_thread(thread) do {} while (0)
28 29
29/* 30/*
diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h
index 5448f9bbf4ab..1506897648aa 100644
--- a/arch/sh/include/asm/processor.h
+++ b/arch/sh/include/asm/processor.h
@@ -97,6 +97,7 @@ extern struct sh_cpuinfo cpu_data[];
97 97
98#define cpu_sleep() __asm__ __volatile__ ("sleep" : : : "memory") 98#define cpu_sleep() __asm__ __volatile__ ("sleep" : : : "memory")
99#define cpu_relax() barrier() 99#define cpu_relax() barrier()
100#define cpu_relax_lowlatency() cpu_relax()
100 101
101void default_idle(void); 102void default_idle(void);
102void stop_this_cpu(void *); 103void stop_this_cpu(void *);
diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h
index a564817bbc2e..812fd08f3e62 100644
--- a/arch/sparc/include/asm/processor_32.h
+++ b/arch/sparc/include/asm/processor_32.h
@@ -119,6 +119,8 @@ extern struct task_struct *last_task_used_math;
119int do_mathemu(struct pt_regs *regs, struct task_struct *fpt); 119int do_mathemu(struct pt_regs *regs, struct task_struct *fpt);
120 120
121#define cpu_relax() barrier() 121#define cpu_relax() barrier()
122#define cpu_relax_lowlatency() cpu_relax()
123
122extern void (*sparc_idle)(void); 124extern void (*sparc_idle)(void);
123 125
124#endif 126#endif
diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h
index 7028fe1a7c04..6924bdefe148 100644
--- a/arch/sparc/include/asm/processor_64.h
+++ b/arch/sparc/include/asm/processor_64.h
@@ -216,6 +216,7 @@ unsigned long get_wchan(struct task_struct *task);
216 "nop\n\t" \ 216 "nop\n\t" \
217 ".previous" \ 217 ".previous" \
218 ::: "memory") 218 ::: "memory")
219#define cpu_relax_lowlatency() cpu_relax()
219 220
220/* Prefetch support. This is tuned for UltraSPARC-III and later. 221/* Prefetch support. This is tuned for UltraSPARC-III and later.
221 * UltraSPARC-I will treat these as nops, and UltraSPARC-II has 222 * UltraSPARC-I will treat these as nops, and UltraSPARC-II has
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h
index 42323636c459..dd4f9f17e30a 100644
--- a/arch/tile/include/asm/processor.h
+++ b/arch/tile/include/asm/processor.h
@@ -266,6 +266,8 @@ static inline void cpu_relax(void)
266 barrier(); 266 barrier();
267} 267}
268 268
269#define cpu_relax_lowlatency() cpu_relax()
270
269/* Info on this processor (see fs/proc/cpuinfo.c) */ 271/* Info on this processor (see fs/proc/cpuinfo.c) */
270struct seq_operations; 272struct seq_operations;
271extern const struct seq_operations cpuinfo_op; 273extern const struct seq_operations cpuinfo_op;
diff --git a/arch/unicore32/include/asm/processor.h b/arch/unicore32/include/asm/processor.h
index 4eaa42167667..8d21b7adf26b 100644
--- a/arch/unicore32/include/asm/processor.h
+++ b/arch/unicore32/include/asm/processor.h
@@ -71,6 +71,7 @@ extern void release_thread(struct task_struct *);
71unsigned long get_wchan(struct task_struct *p); 71unsigned long get_wchan(struct task_struct *p);
72 72
73#define cpu_relax() barrier() 73#define cpu_relax() barrier()
74#define cpu_relax_lowlatency() cpu_relax()
74 75
75#define task_pt_regs(p) \ 76#define task_pt_regs(p) \
76 ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) 77 ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index a4ea02351f4d..32cc237f8e20 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -696,6 +696,8 @@ static inline void cpu_relax(void)
696 rep_nop(); 696 rep_nop();
697} 697}
698 698
699#define cpu_relax_lowlatency() cpu_relax()
700
699/* Stop speculative execution and prefetching of modified code. */ 701/* Stop speculative execution and prefetching of modified code. */
700static inline void sync_core(void) 702static inline void sync_core(void)
701{ 703{
diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h
index 04f82e020f2b..2a206d2b14ab 100644
--- a/arch/x86/um/asm/processor.h
+++ b/arch/x86/um/asm/processor.h
@@ -25,7 +25,8 @@ static inline void rep_nop(void)
25 __asm__ __volatile__("rep;nop": : :"memory"); 25 __asm__ __volatile__("rep;nop": : :"memory");
26} 26}
27 27
28#define cpu_relax() rep_nop() 28#define cpu_relax() rep_nop()
29#define cpu_relax_lowlatency() cpu_relax()
29 30
30#include <asm/processor-generic.h> 31#include <asm/processor-generic.h>
31 32
diff --git a/arch/xtensa/include/asm/processor.h b/arch/xtensa/include/asm/processor.h
index abb59708a3b7..b61bdf0eea25 100644
--- a/arch/xtensa/include/asm/processor.h
+++ b/arch/xtensa/include/asm/processor.h
@@ -182,6 +182,7 @@ extern unsigned long get_wchan(struct task_struct *p);
182#define KSTK_ESP(tsk) (task_pt_regs(tsk)->areg[1]) 182#define KSTK_ESP(tsk) (task_pt_regs(tsk)->areg[1])
183 183
184#define cpu_relax() barrier() 184#define cpu_relax() barrier()
185#define cpu_relax_lowlatency() cpu_relax()
185 186
186/* Special register access. */ 187/* Special register access. */
187 188
diff --git a/include/linux/mutex.h b/include/linux/mutex.h
index 42aa9b9ecd5f..8d5535c58cc2 100644
--- a/include/linux/mutex.h
+++ b/include/linux/mutex.h
@@ -176,8 +176,4 @@ extern void mutex_unlock(struct mutex *lock);
176 176
177extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); 177extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
178 178
179#ifndef arch_mutex_cpu_relax
180# define arch_mutex_cpu_relax() cpu_relax()
181#endif
182
183#endif /* __LINUX_MUTEX_H */ 179#endif /* __LINUX_MUTEX_H */
diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c
index be9ee1559fca..9887a905a762 100644
--- a/kernel/locking/mcs_spinlock.c
+++ b/kernel/locking/mcs_spinlock.c
@@ -1,6 +1,4 @@
1
2#include <linux/percpu.h> 1#include <linux/percpu.h>
3#include <linux/mutex.h>
4#include <linux/sched.h> 2#include <linux/sched.h>
5#include "mcs_spinlock.h" 3#include "mcs_spinlock.h"
6 4
@@ -79,7 +77,7 @@ osq_wait_next(struct optimistic_spin_queue *lock,
79 break; 77 break;
80 } 78 }
81 79
82 arch_mutex_cpu_relax(); 80 cpu_relax_lowlatency();
83 } 81 }
84 82
85 return next; 83 return next;
@@ -120,7 +118,7 @@ bool osq_lock(struct optimistic_spin_queue *lock)
120 if (need_resched()) 118 if (need_resched())
121 goto unqueue; 119 goto unqueue;
122 120
123 arch_mutex_cpu_relax(); 121 cpu_relax_lowlatency();
124 } 122 }
125 return true; 123 return true;
126 124
@@ -146,7 +144,7 @@ unqueue:
146 if (smp_load_acquire(&node->locked)) 144 if (smp_load_acquire(&node->locked))
147 return true; 145 return true;
148 146
149 arch_mutex_cpu_relax(); 147 cpu_relax_lowlatency();
150 148
151 /* 149 /*
152 * Or we race against a concurrent unqueue()'s step-B, in which 150 * Or we race against a concurrent unqueue()'s step-B, in which
diff --git a/kernel/locking/mcs_spinlock.h b/kernel/locking/mcs_spinlock.h
index 74356dc0ce29..23e89c5930e9 100644
--- a/kernel/locking/mcs_spinlock.h
+++ b/kernel/locking/mcs_spinlock.h
@@ -27,7 +27,7 @@ struct mcs_spinlock {
27#define arch_mcs_spin_lock_contended(l) \ 27#define arch_mcs_spin_lock_contended(l) \
28do { \ 28do { \
29 while (!(smp_load_acquire(l))) \ 29 while (!(smp_load_acquire(l))) \
30 arch_mutex_cpu_relax(); \ 30 cpu_relax_lowlatency(); \
31} while (0) 31} while (0)
32#endif 32#endif
33 33
@@ -104,7 +104,7 @@ void mcs_spin_unlock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
104 return; 104 return;
105 /* Wait until the next pointer is set */ 105 /* Wait until the next pointer is set */
106 while (!(next = ACCESS_ONCE(node->next))) 106 while (!(next = ACCESS_ONCE(node->next)))
107 arch_mutex_cpu_relax(); 107 cpu_relax_lowlatency();
108 } 108 }
109 109
110 /* Pass lock to next waiter. */ 110 /* Pass lock to next waiter. */
diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
index d3100521388c..ae712b25e492 100644
--- a/kernel/locking/mutex.c
+++ b/kernel/locking/mutex.c
@@ -146,7 +146,7 @@ int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner)
146 if (need_resched()) 146 if (need_resched())
147 break; 147 break;
148 148
149 arch_mutex_cpu_relax(); 149 cpu_relax_lowlatency();
150 } 150 }
151 rcu_read_unlock(); 151 rcu_read_unlock();
152 152
@@ -464,7 +464,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
464 * memory barriers as we'll eventually observe the right 464 * memory barriers as we'll eventually observe the right
465 * values at the cost of a few extra spins. 465 * values at the cost of a few extra spins.
466 */ 466 */
467 arch_mutex_cpu_relax(); 467 cpu_relax_lowlatency();
468 } 468 }
469 osq_unlock(&lock->osq); 469 osq_unlock(&lock->osq);
470slowpath: 470slowpath:
diff --git a/kernel/locking/qrwlock.c b/kernel/locking/qrwlock.c
index fb5b8ac411a5..f956ede7f90d 100644
--- a/kernel/locking/qrwlock.c
+++ b/kernel/locking/qrwlock.c
@@ -20,7 +20,6 @@
20#include <linux/cpumask.h> 20#include <linux/cpumask.h>
21#include <linux/percpu.h> 21#include <linux/percpu.h>
22#include <linux/hardirq.h> 22#include <linux/hardirq.h>
23#include <linux/mutex.h>
24#include <asm/qrwlock.h> 23#include <asm/qrwlock.h>
25 24
26/** 25/**
@@ -35,7 +34,7 @@ static __always_inline void
35rspin_until_writer_unlock(struct qrwlock *lock, u32 cnts) 34rspin_until_writer_unlock(struct qrwlock *lock, u32 cnts)
36{ 35{
37 while ((cnts & _QW_WMASK) == _QW_LOCKED) { 36 while ((cnts & _QW_WMASK) == _QW_LOCKED) {
38 arch_mutex_cpu_relax(); 37 cpu_relax_lowlatency();
39 cnts = smp_load_acquire((u32 *)&lock->cnts); 38 cnts = smp_load_acquire((u32 *)&lock->cnts);
40 } 39 }
41} 40}
@@ -75,7 +74,7 @@ void queue_read_lock_slowpath(struct qrwlock *lock)
75 * to make sure that the write lock isn't taken. 74 * to make sure that the write lock isn't taken.
76 */ 75 */
77 while (atomic_read(&lock->cnts) & _QW_WMASK) 76 while (atomic_read(&lock->cnts) & _QW_WMASK)
78 arch_mutex_cpu_relax(); 77 cpu_relax_lowlatency();
79 78
80 cnts = atomic_add_return(_QR_BIAS, &lock->cnts) - _QR_BIAS; 79 cnts = atomic_add_return(_QR_BIAS, &lock->cnts) - _QR_BIAS;
81 rspin_until_writer_unlock(lock, cnts); 80 rspin_until_writer_unlock(lock, cnts);
@@ -114,7 +113,7 @@ void queue_write_lock_slowpath(struct qrwlock *lock)
114 cnts | _QW_WAITING) == cnts)) 113 cnts | _QW_WAITING) == cnts))
115 break; 114 break;
116 115
117 arch_mutex_cpu_relax(); 116 cpu_relax_lowlatency();
118 } 117 }
119 118
120 /* When no more readers, set the locked flag */ 119 /* When no more readers, set the locked flag */
@@ -125,7 +124,7 @@ void queue_write_lock_slowpath(struct qrwlock *lock)
125 _QW_LOCKED) == _QW_WAITING)) 124 _QW_LOCKED) == _QW_WAITING))
126 break; 125 break;
127 126
128 arch_mutex_cpu_relax(); 127 cpu_relax_lowlatency();
129 } 128 }
130unlock: 129unlock:
131 arch_spin_unlock(&lock->lock); 130 arch_spin_unlock(&lock->lock);
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
index a2391ac135c8..d6203faf2eb1 100644
--- a/kernel/locking/rwsem-xadd.c
+++ b/kernel/locking/rwsem-xadd.c
@@ -329,7 +329,7 @@ bool rwsem_spin_on_owner(struct rw_semaphore *sem, struct task_struct *owner)
329 if (need_resched()) 329 if (need_resched())
330 break; 330 break;
331 331
332 arch_mutex_cpu_relax(); 332 cpu_relax_lowlatency();
333 } 333 }
334 rcu_read_unlock(); 334 rcu_read_unlock();
335 335
@@ -381,7 +381,7 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
381 * memory barriers as we'll eventually observe the right 381 * memory barriers as we'll eventually observe the right
382 * values at the cost of a few extra spins. 382 * values at the cost of a few extra spins.
383 */ 383 */
384 arch_mutex_cpu_relax(); 384 cpu_relax_lowlatency();
385 } 385 }
386 osq_unlock(&sem->osq); 386 osq_unlock(&sem->osq);
387done: 387done:
diff --git a/lib/lockref.c b/lib/lockref.c
index f07a40d33871..d2233de9a86e 100644
--- a/lib/lockref.c
+++ b/lib/lockref.c
@@ -1,6 +1,5 @@
1#include <linux/export.h> 1#include <linux/export.h>
2#include <linux/lockref.h> 2#include <linux/lockref.h>
3#include <linux/mutex.h>
4 3
5#if USE_CMPXCHG_LOCKREF 4#if USE_CMPXCHG_LOCKREF
6 5
@@ -29,7 +28,7 @@
29 if (likely(old.lock_count == prev.lock_count)) { \ 28 if (likely(old.lock_count == prev.lock_count)) { \
30 SUCCESS; \ 29 SUCCESS; \
31 } \ 30 } \
32 arch_mutex_cpu_relax(); \ 31 cpu_relax_lowlatency(); \
33 } \ 32 } \
34} while (0) 33} while (0)
35 34