|
@@ -530,40 +530,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);
|
|
|
}
|
|
|
|