TSA mitigation:
d8010d4ba43e ("x86/bugs: Add a Transient Scheduler Attacks mitigation")
introduced VM_CLEAR_CPU_BUFFERS for guests on AMD CPUs. Currently on Intel
CLEAR_CPU_BUFFERS is being used for guests which has a much broader scope
(kernel->user also).
Make mitigations on Intel consistent with TSA. This would help handling the
guest-only mitigations better in future.
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
---
arch/x86/kernel/cpu/bugs.c | 9 +++++++--
arch/x86/kvm/vmx/vmenter.S | 3 ++-
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index d7fa03bf51b4517c12cc68e7c441f7589a4983d1..6d00a9ea7b4f28da291114a7a096b26cc129b57e 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -194,7 +194,7 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
/*
* Controls CPU Fill buffer clear before VMenter. This is a subset of
- * X86_FEATURE_CLEAR_CPU_BUF, and should only be enabled when KVM-only
+ * X86_FEATURE_CLEAR_CPU_BUF_VM, and should only be enabled when KVM-only
* mitigation is required.
*/
DEFINE_STATIC_KEY_FALSE(cpu_buf_vm_clear);
@@ -536,6 +536,7 @@ static void __init mds_apply_mitigation(void)
if (mds_mitigation == MDS_MITIGATION_FULL ||
mds_mitigation == MDS_MITIGATION_VMWERV) {
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF);
+ setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
if (!boot_cpu_has(X86_BUG_MSBDS_ONLY) &&
(mds_nosmt || smt_mitigations == SMT_MITIGATIONS_ON))
cpu_smt_disable(false);
@@ -647,6 +648,7 @@ static void __init taa_apply_mitigation(void)
* present on host, enable the mitigation for UCODE_NEEDED as well.
*/
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF);
+ setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
if (taa_nosmt || smt_mitigations == SMT_MITIGATIONS_ON)
cpu_smt_disable(false);
@@ -752,6 +754,7 @@ static void __init mmio_apply_mitigation(void)
} else {
static_branch_enable(&cpu_buf_vm_clear);
}
+ setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
/*
* If Processor-MMIO-Stale-Data bug is present and Fill Buffer data can
@@ -839,8 +842,10 @@ static void __init rfds_update_mitigation(void)
static void __init rfds_apply_mitigation(void)
{
- if (rfds_mitigation == RFDS_MITIGATION_VERW)
+ if (rfds_mitigation == RFDS_MITIGATION_VERW) {
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF);
+ setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
+ }
}
static __init int rfds_parse_cmdline(char *str)
diff --git a/arch/x86/kvm/vmx/vmenter.S b/arch/x86/kvm/vmx/vmenter.S
index bc255d709d8a16ae22b5bc401965d209a89a8692..0dd23beae207795484150698d1674dc4044cc520 100644
--- a/arch/x86/kvm/vmx/vmenter.S
+++ b/arch/x86/kvm/vmx/vmenter.S
@@ -161,7 +161,8 @@ SYM_FUNC_START(__vmx_vcpu_run)
mov VCPU_RAX(%_ASM_AX), %_ASM_AX
/* Clobbers EFLAGS.ZF */
- CLEAR_CPU_BUFFERS
+ VM_CLEAR_CPU_BUFFERS
+.Lskip_clear_cpu_buffers:
/* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */
jnc .Lvmlaunch
--
2.34.1
On Wed Oct 29, 2025 at 9:26 PM UTC, Pawan Gupta wrote:
> TSA mitigation:
>
> d8010d4ba43e ("x86/bugs: Add a Transient Scheduler Attacks mitigation")
>
> introduced VM_CLEAR_CPU_BUFFERS for guests on AMD CPUs. Currently on Intel
> CLEAR_CPU_BUFFERS is being used for guests which has a much broader scope
> (kernel->user also).
>
> Make mitigations on Intel consistent with TSA. This would help handling the
> guest-only mitigations better in future.
>
> Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> ---
> arch/x86/kernel/cpu/bugs.c | 9 +++++++--
> arch/x86/kvm/vmx/vmenter.S | 3 ++-
> 2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> index d7fa03bf51b4517c12cc68e7c441f7589a4983d1..6d00a9ea7b4f28da291114a7a096b26cc129b57e 100644
> --- a/arch/x86/kernel/cpu/bugs.c
> +++ b/arch/x86/kernel/cpu/bugs.c
> @@ -194,7 +194,7 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
>
> /*
> * Controls CPU Fill buffer clear before VMenter. This is a subset of
> - * X86_FEATURE_CLEAR_CPU_BUF, and should only be enabled when KVM-only
> + * X86_FEATURE_CLEAR_CPU_BUF_VM, and should only be enabled when KVM-only
> * mitigation is required.
> */
So if I understand correctly with this patch the aim is:
X86_FEATURE_CLEAR_CPU_BUF means verw before exit to usermode
X86_FEATURE_CLEAR_CPU_BUF_VM means unconditional verw before VM Enter
cpu_buf_vm_clear[_mmio_only] means verw before VM Enter for
MMIO-capable guests.
Since this is being cleaned up can we also:
- Update the definition of X86_FEATURE_CLEAR_CPU_BUF in cpufeatures.h to
say what context it applies to (now it's specifically exit to user)
- Clear up how verw_clear_cpu_buf_mitigation_selected relates to these
two flags. Thinking aloud here... it looks like this is set:
- If MDS mitigations are on, meaning both flags are set
- If TAA mitigations are on, meaning both flags are set
- If MMIO mitigations are on, and the CPU has MDS or TAA. In this case
both flags are set, but this causality is messier.
- If RFDS mitigations are on and supported, meaning both flags are set
So if I'm reading this correctly whenever
verw_clear_cpu_buf_mitigation_selected we should expect both flags
enabled. So I think all that's needed is to add a reference to
X86_FEATURE_CLEAR_CPU_BUF_VM to the comment?
I think we also need to update the assertion of vmx->disable_fb_clear?
Anyway thanks this seems like a very clear improvement to me.
On Thu, Oct 30, 2025 at 12:28:06PM +0000, Brendan Jackman wrote:
> On Wed Oct 29, 2025 at 9:26 PM UTC, Pawan Gupta wrote:
> > TSA mitigation:
> >
> > d8010d4ba43e ("x86/bugs: Add a Transient Scheduler Attacks mitigation")
> >
> > introduced VM_CLEAR_CPU_BUFFERS for guests on AMD CPUs. Currently on Intel
> > CLEAR_CPU_BUFFERS is being used for guests which has a much broader scope
> > (kernel->user also).
> >
> > Make mitigations on Intel consistent with TSA. This would help handling the
> > guest-only mitigations better in future.
> >
> > Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> > ---
> > arch/x86/kernel/cpu/bugs.c | 9 +++++++--
> > arch/x86/kvm/vmx/vmenter.S | 3 ++-
> > 2 files changed, 9 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> > index d7fa03bf51b4517c12cc68e7c441f7589a4983d1..6d00a9ea7b4f28da291114a7a096b26cc129b57e 100644
> > --- a/arch/x86/kernel/cpu/bugs.c
> > +++ b/arch/x86/kernel/cpu/bugs.c
> > @@ -194,7 +194,7 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
> >
> > /*
> > * Controls CPU Fill buffer clear before VMenter. This is a subset of
> > - * X86_FEATURE_CLEAR_CPU_BUF, and should only be enabled when KVM-only
> > + * X86_FEATURE_CLEAR_CPU_BUF_VM, and should only be enabled when KVM-only
> > * mitigation is required.
> > */
>
> So if I understand correctly with this patch the aim is:
>
> X86_FEATURE_CLEAR_CPU_BUF means verw before exit to usermode
>
> X86_FEATURE_CLEAR_CPU_BUF_VM means unconditional verw before VM Enter
>
> cpu_buf_vm_clear[_mmio_only] means verw before VM Enter for
> MMIO-capable guests.
Yup, thats the goal.
> Since this is being cleaned up can we also:
>
> - Update the definition of X86_FEATURE_CLEAR_CPU_BUF in cpufeatures.h to
> say what context it applies to (now it's specifically exit to user)
>
> - Clear up how verw_clear_cpu_buf_mitigation_selected relates to these
> two flags. Thinking aloud here... it looks like this is set:
>
> - If MDS mitigations are on, meaning both flags are set
>
> - If TAA mitigations are on, meaning both flags are set
>
> - If MMIO mitigations are on, and the CPU has MDS or TAA. In this case
> both flags are set, but this causality is messier.
>
> - If RFDS mitigations are on and supported, meaning both flags are set
>
> So if I'm reading this correctly whenever
> verw_clear_cpu_buf_mitigation_selected we should expect both flags
> enabled. So I think all that's needed is to add a reference to
> X86_FEATURE_CLEAR_CPU_BUF_VM to the comment?
Yes. I will update the comment accordingly.
> I think we also need to update the assertion of vmx->disable_fb_clear?
I am not quite sure about the update needed. Could you please clarify?
> Anyway thanks this seems like a very clear improvement to me.
Thanks for the review and suggestions!
On Thu Oct 30, 2025 at 6:43 PM UTC, Pawan Gupta wrote:
> On Thu, Oct 30, 2025 at 12:28:06PM +0000, Brendan Jackman wrote:
>> On Wed Oct 29, 2025 at 9:26 PM UTC, Pawan Gupta wrote:
>> > TSA mitigation:
>> >
>> > d8010d4ba43e ("x86/bugs: Add a Transient Scheduler Attacks mitigation")
>> >
>> > introduced VM_CLEAR_CPU_BUFFERS for guests on AMD CPUs. Currently on Intel
>> > CLEAR_CPU_BUFFERS is being used for guests which has a much broader scope
>> > (kernel->user also).
>> >
>> > Make mitigations on Intel consistent with TSA. This would help handling the
>> > guest-only mitigations better in future.
>> >
>> > Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
>> > ---
>> > arch/x86/kernel/cpu/bugs.c | 9 +++++++--
>> > arch/x86/kvm/vmx/vmenter.S | 3 ++-
>> > 2 files changed, 9 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
>> > index d7fa03bf51b4517c12cc68e7c441f7589a4983d1..6d00a9ea7b4f28da291114a7a096b26cc129b57e 100644
>> > --- a/arch/x86/kernel/cpu/bugs.c
>> > +++ b/arch/x86/kernel/cpu/bugs.c
>> > @@ -194,7 +194,7 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
>> >
>> > /*
>> > * Controls CPU Fill buffer clear before VMenter. This is a subset of
>> > - * X86_FEATURE_CLEAR_CPU_BUF, and should only be enabled when KVM-only
>> > + * X86_FEATURE_CLEAR_CPU_BUF_VM, and should only be enabled when KVM-only
>> > * mitigation is required.
>> > */
>>
>> So if I understand correctly with this patch the aim is:
>>
>> X86_FEATURE_CLEAR_CPU_BUF means verw before exit to usermode
>>
>> X86_FEATURE_CLEAR_CPU_BUF_VM means unconditional verw before VM Enter
>>
>> cpu_buf_vm_clear[_mmio_only] means verw before VM Enter for
>> MMIO-capable guests.
>
> Yup, thats the goal.
>
>> Since this is being cleaned up can we also:
>>
>> - Update the definition of X86_FEATURE_CLEAR_CPU_BUF in cpufeatures.h to
>> say what context it applies to (now it's specifically exit to user)
>>
>> - Clear up how verw_clear_cpu_buf_mitigation_selected relates to these
>> two flags. Thinking aloud here... it looks like this is set:
>>
>> - If MDS mitigations are on, meaning both flags are set
>>
>> - If TAA mitigations are on, meaning both flags are set
>>
>> - If MMIO mitigations are on, and the CPU has MDS or TAA. In this case
>> both flags are set, but this causality is messier.
>>
>> - If RFDS mitigations are on and supported, meaning both flags are set
>>
>> So if I'm reading this correctly whenever
>> verw_clear_cpu_buf_mitigation_selected we should expect both flags
>> enabled. So I think all that's needed is to add a reference to
>> X86_FEATURE_CLEAR_CPU_BUF_VM to the comment?
>
> Yes. I will update the comment accordingly.
>
>> I think we also need to update the assertion of vmx->disable_fb_clear?
>
> I am not quite sure about the update needed. Could you please clarify?
>
>> Anyway thanks this seems like a very clear improvement to me.
>
> Thanks for the review and suggestions!
I will drop this thread and continue here:
https://lore.kernel.org/all/20251031003040.3491385-2-seanjc@google.com/
On Wed, Oct 29, 2025 at 02:26:28PM -0700, Pawan Gupta wrote: > diff --git a/arch/x86/kvm/vmx/vmenter.S b/arch/x86/kvm/vmx/vmenter.S > index bc255d709d8a16ae22b5bc401965d209a89a8692..0dd23beae207795484150698d1674dc4044cc520 100644 > --- a/arch/x86/kvm/vmx/vmenter.S > +++ b/arch/x86/kvm/vmx/vmenter.S > @@ -161,7 +161,8 @@ SYM_FUNC_START(__vmx_vcpu_run) > mov VCPU_RAX(%_ASM_AX), %_ASM_AX > > /* Clobbers EFLAGS.ZF */ > - CLEAR_CPU_BUFFERS > + VM_CLEAR_CPU_BUFFERS > +.Lskip_clear_cpu_buffers: Agh, this label belongs to patch 3/3. > /* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */ > jnc .Lvmlaunch
© 2016 - 2025 Red Hat, Inc.