]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/x86/kernel/cpu/bugs.c
x86/speculation: Prepare arch_smt_update() for PRCTL mode
[mirror_ubuntu-bionic-kernel.git] / arch / x86 / kernel / cpu / bugs.c
index 68cc8ed4a7a7a7f95dc2f4161bce2bfdd463ce71..f30f168aa9cb34135395d16346742026ad442ca1 100644 (file)
@@ -527,40 +527,44 @@ specv2_set_mode:
        arch_smt_update();
 }
 
-static bool stibp_needed(void)
+static void update_stibp_msr(void * __unused)
 {
-       /* Enhanced IBRS makes using STIBP unnecessary. */
-       if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
-               return false;
-
-       /* Check for strict user mitigation mode */
-       return spectre_v2_user == SPECTRE_V2_USER_STRICT;
+       wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base);
 }
 
-static void update_stibp_msr(void *info)
+/* Update x86_spec_ctrl_base in case SMT state changed. */
+static void update_stibp_strict(void)
 {
-       wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base);
+       u64 mask = x86_spec_ctrl_base & ~SPEC_CTRL_STIBP;
+
+       if (sched_smt_active())
+               mask |= SPEC_CTRL_STIBP;
+
+       if (mask == x86_spec_ctrl_base)
+               return;
+
+       pr_info("Update user space SMT mitigation: STIBP %s\n",
+               mask & SPEC_CTRL_STIBP ? "always-on" : "off");
+       x86_spec_ctrl_base = mask;
+       on_each_cpu(update_stibp_msr, NULL, 1);
 }
 
 void arch_smt_update(void)
 {
-       u64 mask;
-
-       if (!stibp_needed())
+       /* Enhanced IBRS implies STIBP. No update required. */
+       if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
                return;
 
        mutex_lock(&spec_ctrl_mutex);
 
-       mask = x86_spec_ctrl_base & ~SPEC_CTRL_STIBP;
-       if (sched_smt_active())
-               mask |= SPEC_CTRL_STIBP;
-
-       if (mask != x86_spec_ctrl_base) {
-               pr_info("Spectre v2 cross-process SMT mitigation: %s STIBP\n",
-                       mask & SPEC_CTRL_STIBP ? "Enabling" : "Disabling");
-               x86_spec_ctrl_base = mask;
-               on_each_cpu(update_stibp_msr, NULL, 1);
+       switch (spectre_v2_user) {
+       case SPECTRE_V2_USER_NONE:
+               break;
+       case SPECTRE_V2_USER_STRICT:
+               update_stibp_strict();
+               break;
        }
+
        mutex_unlock(&spec_ctrl_mutex);
 }