linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cpu/hotplug: Fix "SMT disabled by BIOS" detection for KVM
@ 2019-01-28 16:52 Josh Poimboeuf
  2019-01-29 20:37 ` Josh Poimboeuf
  0 siblings, 1 reply; 3+ messages in thread
From: Josh Poimboeuf @ 2019-01-28 16:52 UTC (permalink / raw)
  To: x86
  Cc: linux-kernel, Thomas Gleixner, Joe Mario, Jiri Kosina,
	Peter Zijlstra, kvm, Igor Mammedov

With the following commit:

  73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")

... the hotplug code attempted to detect when SMT was disabled by BIOS,
in which case it reported SMT as permanently disabled.  However, that
code broke a virt hotplug scenario, where the guest is booted with only
primary CPU threads, and a sibling is brought online later.

The problem is that there doesn't seem to be a way to reliably
distinguish between the HW "SMT disabled by BIOS" case and the virt
"sibling not yet brought online" case.  So the above-mentioned commit
was a bit misguided, as it permanently disabled SMT for both cases,
preventing future virt sibling hotplugs.

Going back and reviewing the original problems which were attempted to
be solved by that commit, when SMT was disabled in BIOS:

  1) /sys/devices/system/cpu/smt/control showed "on" instead of
     "notsupported"; and

  2) vmx_vm_init() was incorrectly showing the L1TF_MSG_SMT warning.

I'd propose that we instead consider #1 above to not actually be a
problem.  Because, at least in the virt case, it's possible that SMT
wasn't disabled by BIOS and a sibling thread could be brought online
later.  So it makes sense to just always default the smt control to "on"
to allow for that possibility (assuming cpuid indicates that the CPU
supports SMT).

The real problem is #2, which has a simple fix: change vmx_vm_init() to
query the actual current SMT state -- i.e., whether any siblings are
currently online -- instead of looking at the SMT "control" sysfs value.

So fix it by:

  a) reverting the original "fix" and its followup fix:

     73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
     bc2d8d262cba ("cpu/hotplug: Fix SMT supported evaluation")

     and

  b) changing vmx_vm_init() to query the actual current SMT state --
     instead of the sysfs control value -- to determine whether the L1TF
     warning is needed.

Fixes: 73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
Reported-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 arch/x86/kernel/cpu/bugs.c |  2 +-
 arch/x86/kvm/vmx/vmx.c     |  3 ++-
 include/linux/cpu.h        |  2 --
 kernel/cpu.c               | 32 ++++----------------------------
 kernel/smp.c               |  2 --
 5 files changed, 7 insertions(+), 34 deletions(-)

diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index 1de0f4170178..01874d54f4fd 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -71,7 +71,7 @@ void __init check_bugs(void)
 	 * identify_boot_cpu() initialized SMT support information, let the
 	 * core code know.
 	 */
-	cpu_smt_check_topology_early();
+	cpu_smt_check_topology();
 
 	if (!IS_ENABLED(CONFIG_SMP)) {
 		pr_info("CPU: ");
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index f6915f10e584..e2d6fa3c60d5 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -26,6 +26,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/mm.h>
 #include <linux/sched.h>
+#include <linux/sched/smt.h>
 #include <linux/slab.h>
 #include <linux/tboot.h>
 #include <linux/trace_events.h>
@@ -6816,7 +6817,7 @@ static int vmx_vm_init(struct kvm *kvm)
 			 * Warn upon starting the first VM in a potentially
 			 * insecure environment.
 			 */
-			if (cpu_smt_control == CPU_SMT_ENABLED)
+			if (sched_smt_active())
 				pr_warn_once(L1TF_MSG_SMT);
 			if (l1tf_vmx_mitigation == VMENTER_L1D_FLUSH_NEVER)
 				pr_warn_once(L1TF_MSG_L1D);
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index 218df7f4d3e1..5041357d0297 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -180,12 +180,10 @@ enum cpuhp_smt_control {
 #if defined(CONFIG_SMP) && defined(CONFIG_HOTPLUG_SMT)
 extern enum cpuhp_smt_control cpu_smt_control;
 extern void cpu_smt_disable(bool force);
-extern void cpu_smt_check_topology_early(void);
 extern void cpu_smt_check_topology(void);
 #else
 # define cpu_smt_control		(CPU_SMT_ENABLED)
 static inline void cpu_smt_disable(bool force) { }
-static inline void cpu_smt_check_topology_early(void) { }
 static inline void cpu_smt_check_topology(void) { }
 #endif
 
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 34e40ef2f6e0..05d359e4173a 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -387,8 +387,6 @@ void __weak arch_smt_update(void) { }
 enum cpuhp_smt_control cpu_smt_control __read_mostly = CPU_SMT_ENABLED;
 EXPORT_SYMBOL_GPL(cpu_smt_control);
 
-static bool cpu_smt_available __read_mostly;
-
 void __init cpu_smt_disable(bool force)
 {
 	if (cpu_smt_control == CPU_SMT_FORCE_DISABLED ||
@@ -406,25 +404,11 @@ void __init cpu_smt_disable(bool force)
 
 /*
  * The decision whether SMT is supported can only be done after the full
- * CPU identification. Called from architecture code before non boot CPUs
- * are brought up.
- */
-void __init cpu_smt_check_topology_early(void)
-{
-	if (!topology_smt_supported())
-		cpu_smt_control = CPU_SMT_NOT_SUPPORTED;
-}
-
-/*
- * If SMT was disabled by BIOS, detect it here, after the CPUs have been
- * brought online. This ensures the smt/l1tf sysfs entries are consistent
- * with reality. cpu_smt_available is set to true during the bringup of non
- * boot CPUs when a SMT sibling is detected. Note, this may overwrite
- * cpu_smt_control's previous setting.
+ * CPU identification. Called from architecture code.
  */
 void __init cpu_smt_check_topology(void)
 {
-	if (!cpu_smt_available)
+	if (!topology_smt_supported())
 		cpu_smt_control = CPU_SMT_NOT_SUPPORTED;
 }
 
@@ -437,18 +421,10 @@ early_param("nosmt", smt_cmdline_disable);
 
 static inline bool cpu_smt_allowed(unsigned int cpu)
 {
-	if (topology_is_primary_thread(cpu))
+	if (cpu_smt_control == CPU_SMT_ENABLED)
 		return true;
 
-	/*
-	 * If the CPU is not a 'primary' thread and the booted_once bit is
-	 * set then the processor has SMT support. Store this information
-	 * for the late check of SMT support in cpu_smt_check_topology().
-	 */
-	if (per_cpu(cpuhp_state, cpu).booted_once)
-		cpu_smt_available = true;
-
-	if (cpu_smt_control == CPU_SMT_ENABLED)
+	if (topology_is_primary_thread(cpu))
 		return true;
 
 	/*
diff --git a/kernel/smp.c b/kernel/smp.c
index 163c451af42e..f4cf1b0bb3b8 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -584,8 +584,6 @@ void __init smp_init(void)
 		num_nodes, (num_nodes > 1 ? "s" : ""),
 		num_cpus,  (num_cpus  > 1 ? "s" : ""));
 
-	/* Final decision about SMT support */
-	cpu_smt_check_topology();
 	/* Any cleanup work */
 	smp_cpus_done(setup_max_cpus);
 }
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] cpu/hotplug: Fix "SMT disabled by BIOS" detection for KVM
  2019-01-28 16:52 [PATCH] cpu/hotplug: Fix "SMT disabled by BIOS" detection for KVM Josh Poimboeuf
@ 2019-01-29 20:37 ` Josh Poimboeuf
  2019-01-29 21:13   ` Thomas Gleixner
  0 siblings, 1 reply; 3+ messages in thread
From: Josh Poimboeuf @ 2019-01-29 20:37 UTC (permalink / raw)
  To: x86
  Cc: linux-kernel, Thomas Gleixner, Joe Mario, Jiri Kosina,
	Peter Zijlstra, kvm, Igor Mammedov

On Mon, Jan 28, 2019 at 10:52:56AM -0600, Josh Poimboeuf wrote:
> With the following commit:
> 
>   73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
> 
> ... the hotplug code attempted to detect when SMT was disabled by BIOS,
> in which case it reported SMT as permanently disabled.  However, that
> code broke a virt hotplug scenario, where the guest is booted with only
> primary CPU threads, and a sibling is brought online later.
> 
> The problem is that there doesn't seem to be a way to reliably
> distinguish between the HW "SMT disabled by BIOS" case and the virt
> "sibling not yet brought online" case.  So the above-mentioned commit
> was a bit misguided, as it permanently disabled SMT for both cases,
> preventing future virt sibling hotplugs.
> 
> Going back and reviewing the original problems which were attempted to
> be solved by that commit, when SMT was disabled in BIOS:
> 
>   1) /sys/devices/system/cpu/smt/control showed "on" instead of
>      "notsupported"; and
> 
>   2) vmx_vm_init() was incorrectly showing the L1TF_MSG_SMT warning.
> 
> I'd propose that we instead consider #1 above to not actually be a
> problem.  Because, at least in the virt case, it's possible that SMT
> wasn't disabled by BIOS and a sibling thread could be brought online
> later.  So it makes sense to just always default the smt control to "on"
> to allow for that possibility (assuming cpuid indicates that the CPU
> supports SMT).
> 
> The real problem is #2, which has a simple fix: change vmx_vm_init() to
> query the actual current SMT state -- i.e., whether any siblings are
> currently online -- instead of looking at the SMT "control" sysfs value.
> 
> So fix it by:
> 
>   a) reverting the original "fix" and its followup fix:
> 
>      73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
>      bc2d8d262cba ("cpu/hotplug: Fix SMT supported evaluation")
> 
>      and
> 
>   b) changing vmx_vm_init() to query the actual current SMT state --
>      instead of the sysfs control value -- to determine whether the L1TF
>      warning is needed.
> 
> Fixes: 73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
> Reported-by: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>

NACK - Need to export "sched_smt_present" so KVM can call
sched_smt_active().

-- 
Josh

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] cpu/hotplug: Fix "SMT disabled by BIOS" detection for KVM
  2019-01-29 20:37 ` Josh Poimboeuf
@ 2019-01-29 21:13   ` Thomas Gleixner
  0 siblings, 0 replies; 3+ messages in thread
From: Thomas Gleixner @ 2019-01-29 21:13 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: x86, linux-kernel, Joe Mario, Jiri Kosina, Peter Zijlstra, kvm,
	Igor Mammedov

On Tue, 29 Jan 2019, Josh Poimboeuf wrote:
> > Fixes: 73d5e2b47264 ("cpu/hotplug: detect SMT disabled by BIOS")
> > Reported-by: Igor Mammedov <imammedo@redhat.com>
> > Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
> 
> NACK - Need to export "sched_smt_present" so KVM can call
> sched_smt_active().

You beat me to it. Was just about to tell you :)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-01-29 21:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-28 16:52 [PATCH] cpu/hotplug: Fix "SMT disabled by BIOS" detection for KVM Josh Poimboeuf
2019-01-29 20:37 ` Josh Poimboeuf
2019-01-29 21:13   ` Thomas Gleixner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).