diff mbox series

x86/cpu-policy: Allow for levelling of VERW side effects

Message ID 20240229181354.2560819-1-andrew.cooper3@citrix.com (mailing list archive)
State New
Headers show
Series x86/cpu-policy: Allow for levelling of VERW side effects | expand

Commit Message

Andrew Cooper Feb. 29, 2024, 6:13 p.m. UTC
MD_CLEAR and FB_CLEAR need OR-ing across a migrate pool.  Allow this, by
having them unconditinally set in max, with the host values reflected in
default.  Annotate the bits as having special properies.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Wei Liu <wl@xen.org>
---
 xen/arch/x86/cpu-policy.c                   | 24 +++++++++++++++++++++
 xen/include/public/arch-x86/cpufeatureset.h |  4 ++--
 2 files changed, 26 insertions(+), 2 deletions(-)


base-commit: 54fd7b997470e6686667ca8e18f9ba6139efcdea
prerequisite-patch-id: d2cbc8f341e98ccfd66016f19532df3ddbfc68a4
prerequisite-patch-id: 4b4799fae62b5f41b9b0d2078e8b081605341a0a

Comments

Roger Pau Monne March 1, 2024, 1:28 p.m. UTC | #1
On Thu, Feb 29, 2024 at 06:13:54PM +0000, Andrew Cooper wrote:
> MD_CLEAR and FB_CLEAR need OR-ing across a migrate pool.  Allow this, by
> having them unconditinally set in max, with the host values reflected in
> default.  Annotate the bits as having special properies.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Roger Pau Monné <roger.pau@citrix.com>
> CC: Wei Liu <wl@xen.org>
> ---
>  xen/arch/x86/cpu-policy.c                   | 24 +++++++++++++++++++++
>  xen/include/public/arch-x86/cpufeatureset.h |  4 ++--
>  2 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
> index f3ed2d3a3227..41123e6cf778 100644
> --- a/xen/arch/x86/cpu-policy.c
> +++ b/xen/arch/x86/cpu-policy.c
> @@ -442,6 +442,16 @@ static void __init guest_common_max_feature_adjustments(uint32_t *fs)
>          __set_bit(X86_FEATURE_RSBA, fs);
>          __set_bit(X86_FEATURE_RRSBA, fs);
>  
> +        /*
> +         * These bits indicate that the VERW instruction may have gained
> +         * scrubbing side effects.  With pooling, they mean "you might migrate
> +         * somewhere where scrubbing is necessary", and may need exposing on
> +         * unaffected hardware.  This is fine, because the VERW instruction
> +         * has been around since the 286.
> +         */
> +        __set_bit(X86_FEATURE_MD_CLEAR, fs);
> +        __set_bit(X86_FEATURE_FB_CLEAR, fs);
> +
>          /*
>           * The Gather Data Sampling microcode mitigation (August 2023) has an
>           * adverse performance impact on the CLWB instruction on SKX/CLX/CPX.
> @@ -476,6 +486,20 @@ static void __init guest_common_default_feature_adjustments(uint32_t *fs)
>               cpu_has_rdrand && !is_forced_cpu_cap(X86_FEATURE_RDRAND) )
>              __clear_bit(X86_FEATURE_RDRAND, fs);
>  
> +        /*
> +         * These bits indicate that the VERW instruction may have gained
> +         * scrubbing side effects.  The max policy has them set for migration
> +         * reasons, so reset the default policy back to the host values in
> +         * case we're unaffected.
> +         */
> +        fs[FEATURESET_7d0]   &= ~cpufeat_mask(X86_FEATURE_MD_CLEAR);
> +        fs[FEATURESET_m10Al] &= ~cpufeat_mask(X86_FEATURE_FB_CLEAR);
> +
> +        fs[FEATURESET_7d0]   |= (boot_cpu_data.x86_capability[FEATURESET_7d0] &
> +                                 cpufeat_mask(X86_FEATURE_MD_CLEAR));
> +        fs[FEATURESET_m10Al] |= (boot_cpu_data.x86_capability[FEATURESET_m10Al] &
> +                                 cpufeat_mask(X86_FEATURE_FB_CLEAR));

This seems quite convoluted, why not use:

__clear_bit(X86_FEATURE_MD_CLEAR, fs);
if ( boot_cpu_has(X86_FEATURE_MD_CLEAR) )
    __set_bit(X86_FEATURE_MD_CLEAR, fs);

And the same for FB_CLEAR. I think that's quite easier to read.

Thanks, Roger.
Andrew Cooper March 1, 2024, 3:01 p.m. UTC | #2
On 01/03/2024 1:28 pm, Roger Pau Monné wrote:
> On Thu, Feb 29, 2024 at 06:13:54PM +0000, Andrew Cooper wrote:
>> MD_CLEAR and FB_CLEAR need OR-ing across a migrate pool.  Allow this, by
>> having them unconditinally set in max, with the host values reflected in
>> default.  Annotate the bits as having special properies.
>>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
>> ---
>> CC: Jan Beulich <JBeulich@suse.com>
>> CC: Roger Pau Monné <roger.pau@citrix.com>
>> CC: Wei Liu <wl@xen.org>
>> ---
>>  xen/arch/x86/cpu-policy.c                   | 24 +++++++++++++++++++++
>>  xen/include/public/arch-x86/cpufeatureset.h |  4 ++--
>>  2 files changed, 26 insertions(+), 2 deletions(-)
>>
>> diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
>> index f3ed2d3a3227..41123e6cf778 100644
>> --- a/xen/arch/x86/cpu-policy.c
>> +++ b/xen/arch/x86/cpu-policy.c
>> @@ -442,6 +442,16 @@ static void __init guest_common_max_feature_adjustments(uint32_t *fs)
>>          __set_bit(X86_FEATURE_RSBA, fs);
>>          __set_bit(X86_FEATURE_RRSBA, fs);
>>  
>> +        /*
>> +         * These bits indicate that the VERW instruction may have gained
>> +         * scrubbing side effects.  With pooling, they mean "you might migrate
>> +         * somewhere where scrubbing is necessary", and may need exposing on
>> +         * unaffected hardware.  This is fine, because the VERW instruction
>> +         * has been around since the 286.
>> +         */
>> +        __set_bit(X86_FEATURE_MD_CLEAR, fs);
>> +        __set_bit(X86_FEATURE_FB_CLEAR, fs);
>> +
>>          /*
>>           * The Gather Data Sampling microcode mitigation (August 2023) has an
>>           * adverse performance impact on the CLWB instruction on SKX/CLX/CPX.
>> @@ -476,6 +486,20 @@ static void __init guest_common_default_feature_adjustments(uint32_t *fs)
>>               cpu_has_rdrand && !is_forced_cpu_cap(X86_FEATURE_RDRAND) )
>>              __clear_bit(X86_FEATURE_RDRAND, fs);
>>  
>> +        /*
>> +         * These bits indicate that the VERW instruction may have gained
>> +         * scrubbing side effects.  The max policy has them set for migration
>> +         * reasons, so reset the default policy back to the host values in
>> +         * case we're unaffected.
>> +         */
>> +        fs[FEATURESET_7d0]   &= ~cpufeat_mask(X86_FEATURE_MD_CLEAR);
>> +        fs[FEATURESET_m10Al] &= ~cpufeat_mask(X86_FEATURE_FB_CLEAR);
>> +
>> +        fs[FEATURESET_7d0]   |= (boot_cpu_data.x86_capability[FEATURESET_7d0] &
>> +                                 cpufeat_mask(X86_FEATURE_MD_CLEAR));
>> +        fs[FEATURESET_m10Al] |= (boot_cpu_data.x86_capability[FEATURESET_m10Al] &
>> +                                 cpufeat_mask(X86_FEATURE_FB_CLEAR));
> This seems quite convoluted, why not use:
>
> __clear_bit(X86_FEATURE_MD_CLEAR, fs);
> if ( boot_cpu_has(X86_FEATURE_MD_CLEAR) )
>     __set_bit(X86_FEATURE_MD_CLEAR, fs);
>
> And the same for FB_CLEAR. I think that's quite easier to read.

This better?

+        /*
+         * These bits indicate that the VERW instruction may have gained
+         * scrubbing side effects.  The max policy has them set for
migration
+         * reasons, so reset the default policy back to the host values in
+         * case we're unaffected.
+         */
+        __clear_bit(X86_FEATURE_MD_CLEAR);
+        if ( cpu_has_md_clear )
+            __set_bit(X86_FEATURE_MD_CLEAR);
+
+        __clear_bit(X86_FEATURE_FB_CLEAR);
+        if ( cpu_has_fb_clear )
+            __set_bit(X86_FEATURE_FB_CLEAR);

~Andrew
Roger Pau Monne March 1, 2024, 7:34 p.m. UTC | #3
On Fri, Mar 01, 2024 at 03:01:36PM +0000, Andrew Cooper wrote:
> On 01/03/2024 1:28 pm, Roger Pau Monné wrote:
> > On Thu, Feb 29, 2024 at 06:13:54PM +0000, Andrew Cooper wrote:
> >> MD_CLEAR and FB_CLEAR need OR-ing across a migrate pool.  Allow this, by
> >> having them unconditinally set in max, with the host values reflected in
> >> default.  Annotate the bits as having special properies.
> >>
> >> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> >> ---
> >> CC: Jan Beulich <JBeulich@suse.com>
> >> CC: Roger Pau Monné <roger.pau@citrix.com>
> >> CC: Wei Liu <wl@xen.org>
> >> ---
> >>  xen/arch/x86/cpu-policy.c                   | 24 +++++++++++++++++++++
> >>  xen/include/public/arch-x86/cpufeatureset.h |  4 ++--
> >>  2 files changed, 26 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
> >> index f3ed2d3a3227..41123e6cf778 100644
> >> --- a/xen/arch/x86/cpu-policy.c
> >> +++ b/xen/arch/x86/cpu-policy.c
> >> @@ -442,6 +442,16 @@ static void __init guest_common_max_feature_adjustments(uint32_t *fs)
> >>          __set_bit(X86_FEATURE_RSBA, fs);
> >>          __set_bit(X86_FEATURE_RRSBA, fs);
> >>  
> >> +        /*
> >> +         * These bits indicate that the VERW instruction may have gained
> >> +         * scrubbing side effects.  With pooling, they mean "you might migrate
> >> +         * somewhere where scrubbing is necessary", and may need exposing on
> >> +         * unaffected hardware.  This is fine, because the VERW instruction
> >> +         * has been around since the 286.
> >> +         */
> >> +        __set_bit(X86_FEATURE_MD_CLEAR, fs);
> >> +        __set_bit(X86_FEATURE_FB_CLEAR, fs);
> >> +
> >>          /*
> >>           * The Gather Data Sampling microcode mitigation (August 2023) has an
> >>           * adverse performance impact on the CLWB instruction on SKX/CLX/CPX.
> >> @@ -476,6 +486,20 @@ static void __init guest_common_default_feature_adjustments(uint32_t *fs)
> >>               cpu_has_rdrand && !is_forced_cpu_cap(X86_FEATURE_RDRAND) )
> >>              __clear_bit(X86_FEATURE_RDRAND, fs);
> >>  
> >> +        /*
> >> +         * These bits indicate that the VERW instruction may have gained
> >> +         * scrubbing side effects.  The max policy has them set for migration
> >> +         * reasons, so reset the default policy back to the host values in
> >> +         * case we're unaffected.
> >> +         */
> >> +        fs[FEATURESET_7d0]   &= ~cpufeat_mask(X86_FEATURE_MD_CLEAR);
> >> +        fs[FEATURESET_m10Al] &= ~cpufeat_mask(X86_FEATURE_FB_CLEAR);
> >> +
> >> +        fs[FEATURESET_7d0]   |= (boot_cpu_data.x86_capability[FEATURESET_7d0] &
> >> +                                 cpufeat_mask(X86_FEATURE_MD_CLEAR));
> >> +        fs[FEATURESET_m10Al] |= (boot_cpu_data.x86_capability[FEATURESET_m10Al] &
> >> +                                 cpufeat_mask(X86_FEATURE_FB_CLEAR));
> > This seems quite convoluted, why not use:
> >
> > __clear_bit(X86_FEATURE_MD_CLEAR, fs);
> > if ( boot_cpu_has(X86_FEATURE_MD_CLEAR) )
> >     __set_bit(X86_FEATURE_MD_CLEAR, fs);
> >
> > And the same for FB_CLEAR. I think that's quite easier to read.
> 
> This better?
> 
> +        /*
> +         * These bits indicate that the VERW instruction may have gained
> +         * scrubbing side effects.  The max policy has them set for
> migration
> +         * reasons, so reset the default policy back to the host values in
> +         * case we're unaffected.
> +         */
> +        __clear_bit(X86_FEATURE_MD_CLEAR);
> +        if ( cpu_has_md_clear )
> +            __set_bit(X86_FEATURE_MD_CLEAR);
> +
> +        __clear_bit(X86_FEATURE_FB_CLEAR);
> +        if ( cpu_has_fb_clear )
> +            __set_bit(X86_FEATURE_FB_CLEAR);

Sure, with that please add my:

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Thanks, Roger.
diff mbox series

Patch

diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
index f3ed2d3a3227..41123e6cf778 100644
--- a/xen/arch/x86/cpu-policy.c
+++ b/xen/arch/x86/cpu-policy.c
@@ -442,6 +442,16 @@  static void __init guest_common_max_feature_adjustments(uint32_t *fs)
         __set_bit(X86_FEATURE_RSBA, fs);
         __set_bit(X86_FEATURE_RRSBA, fs);
 
+        /*
+         * These bits indicate that the VERW instruction may have gained
+         * scrubbing side effects.  With pooling, they mean "you might migrate
+         * somewhere where scrubbing is necessary", and may need exposing on
+         * unaffected hardware.  This is fine, because the VERW instruction
+         * has been around since the 286.
+         */
+        __set_bit(X86_FEATURE_MD_CLEAR, fs);
+        __set_bit(X86_FEATURE_FB_CLEAR, fs);
+
         /*
          * The Gather Data Sampling microcode mitigation (August 2023) has an
          * adverse performance impact on the CLWB instruction on SKX/CLX/CPX.
@@ -476,6 +486,20 @@  static void __init guest_common_default_feature_adjustments(uint32_t *fs)
              cpu_has_rdrand && !is_forced_cpu_cap(X86_FEATURE_RDRAND) )
             __clear_bit(X86_FEATURE_RDRAND, fs);
 
+        /*
+         * These bits indicate that the VERW instruction may have gained
+         * scrubbing side effects.  The max policy has them set for migration
+         * reasons, so reset the default policy back to the host values in
+         * case we're unaffected.
+         */
+        fs[FEATURESET_7d0]   &= ~cpufeat_mask(X86_FEATURE_MD_CLEAR);
+        fs[FEATURESET_m10Al] &= ~cpufeat_mask(X86_FEATURE_FB_CLEAR);
+
+        fs[FEATURESET_7d0]   |= (boot_cpu_data.x86_capability[FEATURESET_7d0] &
+                                 cpufeat_mask(X86_FEATURE_MD_CLEAR));
+        fs[FEATURESET_m10Al] |= (boot_cpu_data.x86_capability[FEATURESET_m10Al] &
+                                 cpufeat_mask(X86_FEATURE_FB_CLEAR));
+
         /*
          * The Gather Data Sampling microcode mitigation (August 2023) has an
          * adverse performance impact on the CLWB instruction on SKX/CLX/CPX.
diff --git a/xen/include/public/arch-x86/cpufeatureset.h b/xen/include/public/arch-x86/cpufeatureset.h
index b230d3a6907d..0374cec3a2af 100644
--- a/xen/include/public/arch-x86/cpufeatureset.h
+++ b/xen/include/public/arch-x86/cpufeatureset.h
@@ -262,7 +262,7 @@  XEN_CPUFEATURE(AVX512_4FMAPS, 9*32+ 3) /*A  AVX512 Multiply Accumulation Single
 XEN_CPUFEATURE(FSRM,          9*32+ 4) /*A  Fast Short REP MOVS */
 XEN_CPUFEATURE(AVX512_VP2INTERSECT, 9*32+8) /*a  VP2INTERSECT{D,Q} insns */
 XEN_CPUFEATURE(SRBDS_CTRL,    9*32+ 9) /*   MSR_MCU_OPT_CTRL and RNGDS_MITG_DIS. */
-XEN_CPUFEATURE(MD_CLEAR,      9*32+10) /*A  VERW clears microarchitectural buffers */
+XEN_CPUFEATURE(MD_CLEAR,      9*32+10) /*!A VERW clears microarchitectural buffers */
 XEN_CPUFEATURE(RTM_ALWAYS_ABORT, 9*32+11) /*! June 2021 TSX defeaturing in microcode. */
 XEN_CPUFEATURE(TSX_FORCE_ABORT, 9*32+13) /* MSR_TSX_FORCE_ABORT.RTM_ABORT */
 XEN_CPUFEATURE(SERIALIZE,     9*32+14) /*A  SERIALIZE insn */
@@ -334,7 +334,7 @@  XEN_CPUFEATURE(DOITM,              16*32+12) /*   Data Operand Invariant Timing
 XEN_CPUFEATURE(SBDR_SSDP_NO,       16*32+13) /*A  No Shared Buffer Data Read or Sideband Stale Data Propagation */
 XEN_CPUFEATURE(FBSDP_NO,           16*32+14) /*A  No Fill Buffer Stale Data Propagation */
 XEN_CPUFEATURE(PSDP_NO,            16*32+15) /*A  No Primary Stale Data Propagation */
-XEN_CPUFEATURE(FB_CLEAR,           16*32+17) /*A  Fill Buffers cleared by VERW */
+XEN_CPUFEATURE(FB_CLEAR,           16*32+17) /*!A Fill Buffers cleared by VERW */
 XEN_CPUFEATURE(FB_CLEAR_CTRL,      16*32+18) /*   MSR_OPT_CPU_CTRL.FB_CLEAR_DIS */
 XEN_CPUFEATURE(RRSBA,              16*32+19) /*!  Restricted RSB Alternative */
 XEN_CPUFEATURE(BHI_NO,             16*32+20) /*A  No Branch History Injection  */