diff options
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 *); | |||
129 | unsigned long get_wchan(struct task_struct *p); | 129 | unsigned 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 */ |
134 | extern struct task_struct *cpu_switch_to(struct task_struct *prev, | 135 | extern 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 | ||
97 | struct cpu_context { | 98 | struct 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 */ |
105 | static inline uint32_t __pure bfin_revid(void) | 105 | static 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 | ||
125 | extern const struct seq_operations cpuinfo_op; | 126 | extern 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 | ||
67 | void default_idle(void); | 68 | void 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 | ||
552 | static inline int | 553 | static inline int |
553 | ia64_get_irr(unsigned int vector) | 554 | ia64_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 | ||
159 | extern void setup_priv(void); | 160 | extern 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 @@ | |||
22 | extern const struct seq_operations cpuinfo_op; | 22 | extern 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[]; | |||
68 | extern void identify_cpu(struct mn10300_cpuinfo *); | 68 | extern void identify_cpu(struct mn10300_cpuinfo *); |
69 | extern void print_cpu_info(struct mn10300_cpuinfo *); | 69 | extern void print_cpu_info(struct mn10300_cpuinfo *); |
70 | extern void dodgy_tsc(void); | 70 | extern 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 */ |
404 | int validate_sp(unsigned long sp, struct task_struct *p, | 406 | int 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 | ||
222 | static inline void psw_set_key(unsigned int key) | 222 | static 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 | ||
101 | void default_idle(void); | 102 | void default_idle(void); |
102 | void stop_this_cpu(void *); | 103 | void 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; | |||
119 | int do_mathemu(struct pt_regs *regs, struct task_struct *fpt); | 119 | int 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 | |||
122 | extern void (*sparc_idle)(void); | 124 | extern 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) */ |
270 | struct seq_operations; | 272 | struct seq_operations; |
271 | extern const struct seq_operations cpuinfo_op; | 273 | extern 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 *); | |||
71 | unsigned long get_wchan(struct task_struct *p); | 71 | unsigned 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. */ |
700 | static inline void sync_core(void) | 702 | static 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 | ||
177 | extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); | 177 | extern 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) \ |
28 | do { \ | 28 | do { \ |
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); |
470 | slowpath: | 470 | slowpath: |
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 | |||
35 | rspin_until_writer_unlock(struct qrwlock *lock, u32 cnts) | 34 | rspin_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 | } |
130 | unlock: | 129 | unlock: |
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); |
387 | done: | 387 | done: |
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 | ||