Commit 152bbb43 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 69581c74 b8347c21
...@@ -253,7 +253,7 @@ extern int force_personality32; ...@@ -253,7 +253,7 @@ extern int force_personality32;
* space open for things that want to use the area for 32-bit pointers. * space open for things that want to use the area for 32-bit pointers.
*/ */
#define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \ #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \
(TASK_SIZE / 3 * 2)) (DEFAULT_MAP_WINDOW / 3 * 2))
/* This yields a mask that user programs can use to figure out what /* This yields a mask that user programs can use to figure out what
instruction set this CPU supports. This could be done in user space, instruction set this CPU supports. This could be done in user space,
......
...@@ -92,8 +92,6 @@ static const __initdata struct idt_data def_idts[] = { ...@@ -92,8 +92,6 @@ static const __initdata struct idt_data def_idts[] = {
INTG(X86_TRAP_DF, double_fault), INTG(X86_TRAP_DF, double_fault),
#endif #endif
INTG(X86_TRAP_DB, debug), INTG(X86_TRAP_DB, debug),
INTG(X86_TRAP_NMI, nmi),
INTG(X86_TRAP_BP, int3),
#ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_MCE
INTG(X86_TRAP_MC, &machine_check), INTG(X86_TRAP_MC, &machine_check),
......
...@@ -193,6 +193,12 @@ static void smp_callin(void) ...@@ -193,6 +193,12 @@ static void smp_callin(void)
*/ */
smp_store_cpu_info(cpuid); smp_store_cpu_info(cpuid);
/*
* The topology information must be up to date before
* calibrate_delay() and notify_cpu_starting().
*/
set_cpu_sibling_map(raw_smp_processor_id());
/* /*
* Get our bogomips. * Get our bogomips.
* Update loops_per_jiffy in cpu_data. Previous call to * Update loops_per_jiffy in cpu_data. Previous call to
...@@ -203,11 +209,6 @@ static void smp_callin(void) ...@@ -203,11 +209,6 @@ static void smp_callin(void)
cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy;
pr_debug("Stack at about %p\n", &cpuid); pr_debug("Stack at about %p\n", &cpuid);
/*
* This must be done before setting cpu_online_mask
* or calling notify_cpu_starting.
*/
set_cpu_sibling_map(raw_smp_processor_id());
wmb(); wmb();
notify_cpu_starting(cpuid); notify_cpu_starting(cpuid);
......
...@@ -209,9 +209,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, ...@@ -209,9 +209,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
if (fixup_exception(regs, trapnr)) if (fixup_exception(regs, trapnr))
return 0; return 0;
if (fixup_bug(regs, trapnr))
return 0;
tsk->thread.error_code = error_code; tsk->thread.error_code = error_code;
tsk->thread.trap_nr = trapnr; tsk->thread.trap_nr = trapnr;
die(str, regs, error_code); die(str, regs, error_code);
...@@ -292,6 +289,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str, ...@@ -292,6 +289,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
/*
* WARN*()s end up here; fix them up before we call the
* notifier chain.
*/
if (!user_mode(regs) && fixup_bug(regs, trapnr))
return;
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
NOTIFY_STOP) { NOTIFY_STOP) {
cond_local_irq_enable(regs); cond_local_irq_enable(regs);
......
...@@ -1346,12 +1346,10 @@ void __init tsc_init(void) ...@@ -1346,12 +1346,10 @@ void __init tsc_init(void)
unsigned long calibrate_delay_is_known(void) unsigned long calibrate_delay_is_known(void)
{ {
int sibling, cpu = smp_processor_id(); int sibling, cpu = smp_processor_id();
struct cpumask *mask = topology_core_cpumask(cpu); int constant_tsc = cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC);
const struct cpumask *mask = topology_core_cpumask(cpu);
if (!tsc_disabled && !cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC)) if (tsc_disabled || !constant_tsc || !mask)
return 0;
if (!mask)
return 0; return 0;
sibling = cpumask_any_but(mask, cpu); sibling = cpumask_any_but(mask, cpu);
......
...@@ -279,7 +279,7 @@ static bool deref_stack_reg(struct unwind_state *state, unsigned long addr, ...@@ -279,7 +279,7 @@ static bool deref_stack_reg(struct unwind_state *state, unsigned long addr,
if (!stack_access_ok(state, addr, sizeof(long))) if (!stack_access_ok(state, addr, sizeof(long)))
return false; return false;
*val = READ_ONCE_TASK_STACK(state->task, *(unsigned long *)addr); *val = READ_ONCE_NOCHECK(*(unsigned long *)addr);
return true; return true;
} }
......
...@@ -212,8 +212,8 @@ static void arch_perfmon_setup_counters(void) ...@@ -212,8 +212,8 @@ static void arch_perfmon_setup_counters(void)
eax.full = cpuid_eax(0xa); eax.full = cpuid_eax(0xa);
/* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */
if (eax.split.version_id == 0 && __this_cpu_read(cpu_info.x86) == 6 && if (eax.split.version_id == 0 && boot_cpu_data.x86 == 6 &&
__this_cpu_read(cpu_info.x86_model) == 15) { boot_cpu_data.x86_model == 15) {
eax.split.version_id = 2; eax.split.version_id = 2;
eax.split.num_counters = 2; eax.split.num_counters = 2;
eax.split.bit_width = 40; eax.split.bit_width = 40;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment