]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.13-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Nov 2017 09:05:54 +0000 (10:05 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Nov 2017 09:05:54 +0000 (10:05 +0100)
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

queue-4.13/series
queue-4.13/x86-debug-handle-warnings-before-the-notifier-chain-to-fix-kgdb-crash.patch [new file with mode: 0644]
queue-4.13/x86-oprofile-ppro-do-not-use-__this_cpu-in-preemptible-context.patch [new file with mode: 0644]
queue-4.13/x86-smpboot-make-optimization-of-delay-calibration-work-correctly.patch [new file with mode: 0644]

index 0b3212906fe68f5b116574e6261f533e725fe2bb..06d0324da594eadd8a3bf7bd97b501d115a2b704 100644 (file)
@@ -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 (file)
index 0000000..80bab5b
--- /dev/null
@@ -0,0 +1,64 @@
+From b8347c2196492f4e1cccde3d92fda1cc2cc7de7e Mon Sep 17 00:00:00 2001
+From: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+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 <alexander.shishkin@linux.intel.com>
+
+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 <alexander.shishkin@linux.intel.com>
+Tested-by: Ilya Dryomov <idryomov@gmail.com>
+Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
+Acked-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Jason Wessel <jason.wessel@windriver.com>
+Cc: Arjan van de Ven <arjan@linux.intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Richard Weinberger <richard.weinberger@gmail.com>
+Link: http://lkml.kernel.org/r/20170724100428.19173-1-alexander.shishkin@linux.intel.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..733a255
--- /dev/null
@@ -0,0 +1,56 @@
+From a743bbeef27b9176987ec0cb7f906ab0ab52d1da Mon Sep 17 00:00:00 2001
+From: Borislav Petkov <bp@suse.de>
+Date: Tue, 7 Nov 2017 18:53:07 +0100
+Subject: x86/oprofile/ppro: Do not use __this_cpu*() in preemptible context
+
+From: Borislav Petkov <bp@suse.de>
+
+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 <fengguang.wu@intel.com>
+Tested-by: Fengguang Wu <fengguang.wu@intel.com>
+Fix-creation-mandated-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Robert Richter <rric@kernel.org>
+Cc: x86@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..3c02501
--- /dev/null
@@ -0,0 +1,86 @@
+From 76ce7cfe35ef58f34e6ba85327afb5fbf6c3ff9b Mon Sep 17 00:00:00 2001
+From: Pavel Tatashin <pasha.tatashin@oracle.com>
+Date: Fri, 27 Oct 2017 20:11:00 -0400
+Subject: x86/smpboot: Make optimization of delay calibration work correctly
+
+From: Pavel Tatashin <pasha.tatashin@oracle.com>
+
+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 <pasha.tatashin@oracle.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+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 <gregkh@linuxfoundation.org>
+
+---
+ 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);