From: Greg Kroah-Hartman Date: Mon, 13 Nov 2017 09:05:54 +0000 (+0100) Subject: 4.13-stable patches X-Git-Tag: v3.18.81~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4a363ec82a9b4ec5874f356a9fcbbf8de1b6de0;p=thirdparty%2Fkernel%2Fstable-queue.git 4.13-stable patches added patches: x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch --- diff --git a/queue-4.13/series b/queue-4.13/series index 0b3212906fe..06d0324da59 100644 --- a/queue-4.13/series +++ b/queue-4.13/series @@ -28,3 +28,6 @@ can-sun4i-handle-overrun-in-rx-fifo.patch can-peak-add-support-for-new-pcie-m2-can-fd-interfaces.patch can-ifi-fix-transmitter-delay-calculation.patch can-c_can-don-t-indicate-triple-sampling-support-for-d_can.patch +x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch +x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch +x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch diff --git a/queue-4.13/x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch b/queue-4.13/x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch new file mode 100644 index 00000000000..80bab5bd21f --- /dev/null +++ b/queue-4.13/x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch @@ -0,0 +1,64 @@ +From b8347c2196492f4e1cccde3d92fda1cc2cc7de7e Mon Sep 17 00:00:00 2001 +From: Alexander Shishkin +Date: Mon, 24 Jul 2017 13:04:28 +0300 +Subject: x86/debug: Handle warnings before the notifier chain, to fix KGDB crash + +From: Alexander Shishkin + +commit b8347c2196492f4e1cccde3d92fda1cc2cc7de7e upstream. + +Commit: + + 9a93848fe787 ("x86/debug: Implement __WARN() using UD0") + +turned warnings into UD0, but the fixup code only runs after the +notify_die() chain. This is a problem, in particular, with kgdb, +which kicks in as if it was a BUG(). + +Fix this by running the fixup code before the notifier chain in +the invalid op handler path. + +Signed-off-by: Alexander Shishkin +Tested-by: Ilya Dryomov +Acked-by: Daniel Thompson +Acked-by: Thomas Gleixner +Cc: Jason Wessel +Cc: Arjan van de Ven +Cc: Borislav Petkov +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Richard Weinberger +Link: http://lkml.kernel.org/r/20170724100428.19173-1-alexander.shishkin@linux.intel.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/traps.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +--- a/arch/x86/kernel/traps.c ++++ b/arch/x86/kernel/traps.c +@@ -221,9 +221,6 @@ do_trap_no_signal(struct task_struct *ts + if (fixup_exception(regs, trapnr)) + return 0; + +- if (fixup_bug(regs, trapnr)) +- return 0; +- + tsk->thread.error_code = error_code; + tsk->thread.trap_nr = trapnr; + die(str, regs, error_code); +@@ -304,6 +301,13 @@ static void do_error_trap(struct pt_regs + + 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) != + NOTIFY_STOP) { + cond_local_irq_enable(regs); diff --git a/queue-4.13/x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch b/queue-4.13/x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch new file mode 100644 index 00000000000..733a2551d9a --- /dev/null +++ b/queue-4.13/x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch @@ -0,0 +1,56 @@ +From a743bbeef27b9176987ec0cb7f906ab0ab52d1da Mon Sep 17 00:00:00 2001 +From: Borislav Petkov +Date: Tue, 7 Nov 2017 18:53:07 +0100 +Subject: x86/oprofile/ppro: Do not use __this_cpu*() in preemptible context + +From: Borislav Petkov + +commit a743bbeef27b9176987ec0cb7f906ab0ab52d1da upstream. + +The warning below says it all: + + BUG: using __this_cpu_read() in preemptible [00000000] code: swapper/0/1 + caller is __this_cpu_preempt_check + CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.0-rc8 #4 + Call Trace: + dump_stack + check_preemption_disabled + ? do_early_param + __this_cpu_preempt_check + arch_perfmon_init + op_nmi_init + ? alloc_pci_root_info + oprofile_arch_init + oprofile_init + do_one_initcall + ... + +These accessors should not have been used in the first place: it is PPro so +no mixed silicon revisions and thus it can simply use boot_cpu_data. + +Reported-by: Fengguang Wu +Tested-by: Fengguang Wu +Fix-creation-mandated-by: Linus Torvalds +Signed-off-by: Borislav Petkov +Signed-off-by: Thomas Gleixner +Cc: Robert Richter +Cc: x86@kernel.org +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/oprofile/op_model_ppro.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- 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( + eax.full = cpuid_eax(0xa); + + /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ +- if (eax.split.version_id == 0 && __this_cpu_read(cpu_info.x86) == 6 && +- __this_cpu_read(cpu_info.x86_model) == 15) { ++ if (eax.split.version_id == 0 && boot_cpu_data.x86 == 6 && ++ boot_cpu_data.x86_model == 15) { + eax.split.version_id = 2; + eax.split.num_counters = 2; + eax.split.bit_width = 40; diff --git a/queue-4.13/x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch b/queue-4.13/x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch new file mode 100644 index 00000000000..3c02501227c --- /dev/null +++ b/queue-4.13/x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch @@ -0,0 +1,86 @@ +From 76ce7cfe35ef58f34e6ba85327afb5fbf6c3ff9b Mon Sep 17 00:00:00 2001 +From: Pavel Tatashin +Date: Fri, 27 Oct 2017 20:11:00 -0400 +Subject: x86/smpboot: Make optimization of delay calibration work correctly + +From: Pavel Tatashin + +commit 76ce7cfe35ef58f34e6ba85327afb5fbf6c3ff9b upstream. + +If the TSC has constant frequency then the delay calibration can be skipped +when it has been calibrated for a package already. This is checked in +calibrate_delay_is_known(), but that function is buggy in two aspects: + +It returns 'false' if + + (!tsc_disabled && !cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC) + +which is obviously the reverse of the intended check and the check for the +sibling mask cannot work either because the topology links have not been +set up yet. + +Correct the condition and move the call to set_cpu_sibling_map() before +invoking calibrate_delay() so the sibling check works correctly. + +[ tglx: Rewrote changelong ] + +Fixes: c25323c07345 ("x86/tsc: Use topology functions") +Signed-off-by: Pavel Tatashin +Signed-off-by: Thomas Gleixner +Cc: peterz@infradead.org +Cc: bob.picco@oracle.com +Cc: steven.sistare@oracle.com +Cc: daniel.m.jordan@oracle.com +Link: https://lkml.kernel.org/r/20171028001100.26603-1-pasha.tatashin@oracle.com +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/smpboot.c | 11 ++++++----- + arch/x86/kernel/tsc.c | 8 +++----- + 2 files changed, 9 insertions(+), 10 deletions(-) + +--- a/arch/x86/kernel/smpboot.c ++++ b/arch/x86/kernel/smpboot.c +@@ -194,6 +194,12 @@ static void smp_callin(void) + 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. + * Update loops_per_jiffy in cpu_data. Previous call to + * smp_store_cpu_info() stored a value that is close but not as +@@ -203,11 +209,6 @@ static void smp_callin(void) + cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; + 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(); + + notify_cpu_starting(cpuid); +--- a/arch/x86/kernel/tsc.c ++++ b/arch/x86/kernel/tsc.c +@@ -1346,12 +1346,10 @@ void __init tsc_init(void) + unsigned long calibrate_delay_is_known(void) + { + 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)) +- return 0; +- +- if (!mask) ++ if (tsc_disabled || !constant_tsc || !mask) + return 0; + + sibling = cpumask_any_but(mask, cpu);