|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.17 v2.1 2/3] amd/virt_ssbd: set SSBD at vCPU context switch
On Thu, Nov 03, 2022 at 09:09:41AM +0100, Jan Beulich wrote:
> On 02.11.2022 18:38, Roger Pau Monné wrote:
> > On Wed, Nov 02, 2022 at 12:49:17PM +0100, Jan Beulich wrote:
> >> On 29.10.2022 15:12, Roger Pau Monne wrote:
> >>> --- a/xen/arch/x86/hvm/svm/svm.c
> >>> +++ b/xen/arch/x86/hvm/svm/svm.c
> >>> @@ -973,6 +973,16 @@ static void cf_check svm_ctxt_switch_from(struct
> >>> vcpu *v)
> >>>
> >>> /* Resume use of ISTs now that the host TR is reinstated. */
> >>> enable_each_ist(idt_tables[cpu]);
> >>> +
> >>> + /*
> >>> + * Clear previous guest selection of SSBD if set. Note that
> >>> SPEC_CTRL.SSBD
> >>> + * is already cleared by svm_vmexit_spec_ctrl.
> >>> + */
> >>> + if ( v->arch.msrs->virt_spec_ctrl.raw & SPEC_CTRL_SSBD )
> >>> + {
> >>> + ASSERT(v->domain->arch.cpuid->extd.virt_ssbd);
> >>> + amd_set_ssbd(false);
> >>> + }
> >>> }
> >>
> >> Aren't you potentially turning off SSBD here just to ...
> >>
> >>> @@ -1000,6 +1010,13 @@ static void cf_check svm_ctxt_switch_to(struct
> >>> vcpu *v)
> >>>
> >>> if ( cpu_has_msr_tsc_aux )
> >>> wrmsr_tsc_aux(v->arch.msrs->tsc_aux);
> >>> +
> >>> + /* Load SSBD if set by the guest. */
> >>> + if ( v->arch.msrs->virt_spec_ctrl.raw & SPEC_CTRL_SSBD )
> >>> + {
> >>> + ASSERT(v->domain->arch.cpuid->extd.virt_ssbd);
> >>> + amd_set_ssbd(true);
> >>> + }
> >>> }
> >>
> >> ... turn it on here again? IOW wouldn't switching better be isolated to
> >> just svm_ctxt_switch_to(), doing nothing if already in the intended mode?
> >
> > What if we switch from a HVM vCPU into a PV one? AFAICT then
> > svm_ctxt_switch_to() won't get called and we would be running the PV
> > guest with the previous HVM domain SSBD selection.
>
> Would that be a problem? Or in other words: What is the intended behavior
> for PV? PV domains can control SSBD via SPEC_CTRL (only), so all we need
> to guarantee is that we respect their choice there.
If the hardware only supports non-architectural way (LS_CFG) or
VIRT_SPEC_CTRL to set SSBD then PV guests won't be able to change the
setting inherited from a previously running HVM guest. IMO it's fine
to run Xen code with the guest selection of SSBD, but carrying such
selection (ie: SSBD set) across guest context switches will be a too
big penalty.
> >>> --- a/xen/arch/x86/msr.c
> >>> +++ b/xen/arch/x86/msr.c
> >>> @@ -697,7 +697,15 @@ int guest_wrmsr(struct vcpu *v, uint32_t msr,
> >>> uint64_t val)
> >>> msrs->spec_ctrl.raw &= ~SPEC_CTRL_SSBD;
> >>> }
> >>> else
> >>> + {
> >>> msrs->virt_spec_ctrl.raw = val & SPEC_CTRL_SSBD;
> >>> + if ( v == curr )
> >>> + /*
> >>> + * Propagate the value to hardware, as it won't be
> >>> context
> >>> + * switched on vmentry.
> >>> + */
> >>
> >> I have to admit that I find "on vmentry" in the comment misleading: Reading
> >> it I first thought you're still alluding to the old model. Plus I also find
> >> the combination of "context switched" and "on vmentry" problematic, as we
> >> generally mean something else when we say "context switch".
> >
> > I had a hard time wording this, because of the Xen/guest vs vCPU
> > context switches.
> >
> > What about:
> >
> > "Propagate the value to hardware, as it won't we set on guest resume
> > path."
>
> Sounds better, thanks (with s/we/be/).
Oh, yes, sorry.
>
> >>> + goto set_reg;
> >>
> >> It's not clear why you want to use hvm_set_reg() in the first place - the
> >> comment says "propagate to hardware", which would mean wrmsrl() in the
> >> usual case. Here it would mean a direct call to amd_set_ssbd() imo. That
> >> would then also be in line with all other "v == curr" conditionals, none
> >> of which apply to any "goto set_reg". ..._set_reg(), aiui, is meant only
> >> for use in cases where vCPU state needs updating such that proper state
> >> would be loaded later (e.g. during VM entry).
> >
> > I thought it was better to hide those vendor specific calls in the
> > already existing vendor hooks (set_reg). I don't mind calling
> > amd_set_ssbd() directly here if that's preferred, it seemed kind of a
> > layering violation when we have vendor specific hooks in place.
>
> Well, Andrew of course should correct me if I'm wrong, but my understanding
> of the get/set-reg interface is as described. On which grounds I don't see
> any layering violation here - doing the call right here is merely a more
> involved flavor of wrmsrl().
OK, will change, but first we need an agreement on the SSBD context
switch comment.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |