diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-12 13:12:41 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-12 13:12:41 -0500 |
commit | 152bbb43b30ced1b32e9ed6f5ba2ac448de725b6 (patch) | |
tree | e000f3cc8b82bc48531ce417cfe97e9b7c51239e | |
parent | 69581c74721f40b2e21667197a135120844c03b7 (diff) | |
parent | b8347c2196492f4e1cccde3d92fda1cc2cc7de7e (diff) |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Thomas Gleixner:
"A set of small fixes:
- make KGDB work again which got broken by the conversion of WARN()
to #UD. The WARN fixup needs to run before the notifier callchain,
otherwise KGDB tries to handle it and crashes.
- disable KASAN in the ORC unwinder to prevent false positive KASAN
warnings
- prevent default mapping above 47bit when 5 level page tables are
enabled
- make the delay calibration optimization work correctly, which had
the conditionals the wrong way around and was operating on data
which was not yet updated.
- remove the bogus X86_TRAP_BP trap init from the default IDT init
table, which broke 32bit int3 handling by overwriting the correct
int3 setup.
- replace this_cpu* with boot_cpu_data access in the preemptible
oprofile init code"
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/debug: Handle warnings before the notifier chain, to fix KGDB crash
x86/mm: Fix ELF_ET_DYN_BASE for 5-level paging
x86/idt: Remove X86_TRAP_BP initialization in idt_setup_traps()
x86/oprofile/ppro: Do not use __this_cpu*() in preemptible context
x86/unwind: Disable KASAN checking in the ORC unwinder
x86/smpboot: Make optimization of delay calibration work correctly
-rw-r--r-- | arch/x86/include/asm/elf.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/idt.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/smpboot.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/traps.c | 10 | ||||
-rw-r--r-- | arch/x86/kernel/tsc.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/unwind_orc.c | 2 | ||||
-rw-r--r-- | arch/x86/oprofile/op_model_ppro.c | 4 |
7 files changed, 20 insertions, 19 deletions
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index c1a125e47ff3..3a091cea36c5 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
@@ -253,7 +253,7 @@ extern int force_personality32; | |||
253 | * space open for things that want to use the area for 32-bit pointers. | 253 | * space open for things that want to use the area for 32-bit pointers. |
254 | */ | 254 | */ |
255 | #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \ | 255 | #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \ |
256 | (TASK_SIZE / 3 * 2)) | 256 | (DEFAULT_MAP_WINDOW / 3 * 2)) |
257 | 257 | ||
258 | /* This yields a mask that user programs can use to figure out what | 258 | /* This yields a mask that user programs can use to figure out what |
259 | instruction set this CPU supports. This could be done in user space, | 259 | instruction set this CPU supports. This could be done in user space, |
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index 6107ee1cb8d5..014cb2fc47ff 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c | |||
@@ -92,8 +92,6 @@ static const __initdata struct idt_data def_idts[] = { | |||
92 | INTG(X86_TRAP_DF, double_fault), | 92 | INTG(X86_TRAP_DF, double_fault), |
93 | #endif | 93 | #endif |
94 | INTG(X86_TRAP_DB, debug), | 94 | INTG(X86_TRAP_DB, debug), |
95 | INTG(X86_TRAP_NMI, nmi), | ||
96 | INTG(X86_TRAP_BP, int3), | ||
97 | 95 | ||
98 | #ifdef CONFIG_X86_MCE | 96 | #ifdef CONFIG_X86_MCE |
99 | INTG(X86_TRAP_MC, &machine_check), | 97 | INTG(X86_TRAP_MC, &machine_check), |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index ad59edd84de7..65a0ccdc3050 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -194,6 +194,12 @@ static void smp_callin(void) | |||
194 | smp_store_cpu_info(cpuid); | 194 | smp_store_cpu_info(cpuid); |
195 | 195 | ||
196 | /* | 196 | /* |
197 | * The topology information must be up to date before | ||
198 | * calibrate_delay() and notify_cpu_starting(). | ||
199 | */ | ||
200 | set_cpu_sibling_map(raw_smp_processor_id()); | ||
201 | |||
202 | /* | ||
197 | * Get our bogomips. | 203 | * Get our bogomips. |
198 | * Update loops_per_jiffy in cpu_data. Previous call to | 204 | * Update loops_per_jiffy in cpu_data. Previous call to |
199 | * smp_store_cpu_info() stored a value that is close but not as | 205 | * smp_store_cpu_info() stored a value that is close but not as |
@@ -203,11 +209,6 @@ static void smp_callin(void) | |||
203 | cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; | 209 | cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; |
204 | pr_debug("Stack at about %p\n", &cpuid); | 210 | pr_debug("Stack at about %p\n", &cpuid); |
205 | 211 | ||
206 | /* | ||
207 | * This must be done before setting cpu_online_mask | ||
208 | * or calling notify_cpu_starting. | ||
209 | */ | ||
210 | set_cpu_sibling_map(raw_smp_processor_id()); | ||
211 | wmb(); | 212 | wmb(); |
212 | 213 | ||
213 | notify_cpu_starting(cpuid); | 214 | notify_cpu_starting(cpuid); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 67db4f43309e..5a6b8f809792 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -209,9 +209,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, | |||
209 | if (fixup_exception(regs, trapnr)) | 209 | if (fixup_exception(regs, trapnr)) |
210 | return 0; | 210 | return 0; |
211 | 211 | ||
212 | if (fixup_bug(regs, trapnr)) | ||
213 | return 0; | ||
214 | |||
215 | tsk->thread.error_code = error_code; | 212 | tsk->thread.error_code = error_code; |
216 | tsk->thread.trap_nr = trapnr; | 213 | tsk->thread.trap_nr = trapnr; |
217 | die(str, regs, error_code); | 214 | die(str, regs, error_code); |
@@ -292,6 +289,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str, | |||
292 | 289 | ||
293 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); | 290 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); |
294 | 291 | ||
292 | /* | ||
293 | * WARN*()s end up here; fix them up before we call the | ||
294 | * notifier chain. | ||
295 | */ | ||
296 | if (!user_mode(regs) && fixup_bug(regs, trapnr)) | ||
297 | return; | ||
298 | |||
295 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != | 299 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != |
296 | NOTIFY_STOP) { | 300 | NOTIFY_STOP) { |
297 | cond_local_irq_enable(regs); | 301 | cond_local_irq_enable(regs); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 796d96bb0821..ad2b925a808e 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -1346,12 +1346,10 @@ void __init tsc_init(void) | |||
1346 | unsigned long calibrate_delay_is_known(void) | 1346 | unsigned long calibrate_delay_is_known(void) |
1347 | { | 1347 | { |
1348 | int sibling, cpu = smp_processor_id(); | 1348 | int sibling, cpu = smp_processor_id(); |
1349 | struct cpumask *mask = topology_core_cpumask(cpu); | 1349 | int constant_tsc = cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC); |
1350 | const struct cpumask *mask = topology_core_cpumask(cpu); | ||
1350 | 1351 | ||
1351 | if (!tsc_disabled && !cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC)) | 1352 | if (tsc_disabled || !constant_tsc || !mask) |
1352 | return 0; | ||
1353 | |||
1354 | if (!mask) | ||
1355 | return 0; | 1353 | return 0; |
1356 | 1354 | ||
1357 | sibling = cpumask_any_but(mask, cpu); | 1355 | sibling = cpumask_any_but(mask, cpu); |
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c index b95007e7c1b3..a3f973b2c97a 100644 --- a/arch/x86/kernel/unwind_orc.c +++ b/arch/x86/kernel/unwind_orc.c | |||
@@ -279,7 +279,7 @@ static bool deref_stack_reg(struct unwind_state *state, unsigned long addr, | |||
279 | if (!stack_access_ok(state, addr, sizeof(long))) | 279 | if (!stack_access_ok(state, addr, sizeof(long))) |
280 | return false; | 280 | return false; |
281 | 281 | ||
282 | *val = READ_ONCE_TASK_STACK(state->task, *(unsigned long *)addr); | 282 | *val = READ_ONCE_NOCHECK(*(unsigned long *)addr); |
283 | return true; | 283 | return true; |
284 | } | 284 | } |
285 | 285 | ||
diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index 350f7096baac..7913b6921959 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c | |||
@@ -212,8 +212,8 @@ static void arch_perfmon_setup_counters(void) | |||
212 | eax.full = cpuid_eax(0xa); | 212 | eax.full = cpuid_eax(0xa); |
213 | 213 | ||
214 | /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ | 214 | /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ |
215 | if (eax.split.version_id == 0 && __this_cpu_read(cpu_info.x86) == 6 && | 215 | if (eax.split.version_id == 0 && boot_cpu_data.x86 == 6 && |
216 | __this_cpu_read(cpu_info.x86_model) == 15) { | 216 | boot_cpu_data.x86_model == 15) { |
217 | eax.split.version_id = 2; | 217 | eax.split.version_id = 2; |
218 | eax.split.num_counters = 2; | 218 | eax.split.num_counters = 2; |
219 | eax.split.bit_width = 40; | 219 | eax.split.bit_width = 40; |