Re: [PATCH v1 06/23] KVM: VMX: Defer enabling FRED MSRs save/load until after set CPUID

Sean Christopherson
2023-11-10T00:18:25Z

On Thu, Nov 09, 2023, Xin3 Li wrote:
> > >+static void vmx_vcpu_config_fred_after_set_cpuid(struct kvm_vcpu *vcpu)
> > >+{
> > >+ struct vcpu_vmx *vmx = to_vmx(vcpu);
> > >+
> > >+ if (!cpu_feature_enabled(X86_FEATURE_FRED) ||
> > >+ !guest_cpuid_has(vcpu, X86_FEATURE_FRED))
> > >+ return;
> > >+
> > >+ /* Enable loading guest FRED MSRs from VMCS */
> > >+ vm_entry_controls_setbit(vmx, VM_ENTRY_LOAD_IA32_FRED);
> > >+
> > >+ /*
> > >+ * Enable saving guest FRED MSRs into VMCS and loading host FRED MSRs
> > >+ * from VMCS.
> > >+ */
> > >+ vm_exit_controls_setbit(vmx,
> > VM_EXIT_ACTIVATE_SECONDARY_CONTROLS);
> > >+ secondary_vm_exit_controls_setbit(vmx,
> > >+ SECONDARY_VM_EXIT_SAVE_IA32_FRED
> > |
> > >+
> > SECONDARY_VM_EXIT_LOAD_IA32_FRED);
> >
> > all above vmcs controls need to be cleared if guest doesn't enumerate FRED, see
> >
> > https://lore.kernel.org/all/ZJYzPn7ipYfO0fLZ@google.com/
>
> Good point, the user space could set cpuid multiple times...
>
> > Clearing VM_EXIT_ACTIVATE_SECONDARY_CONTROLS may be problematic when
> > new bits are added to secondary vmcs controls. Why not keep
> > VM_EXIT_ACTIVATE_SECONDARY_CONTROLS always on if it is supported? or you
> > see any perf impact?
>
> I think it from the other way, why keeps hw loading it on every vmentry
> even if it's not used by a guest?

Oh, yeesh, this is clearing the activation control. Yeah, NAK to that, just
leave it set. If it weren't for the fact that there is apparently a metrict ton
of FRED state (I thought the whole point of FRED was to kill off legacy crap like
CPL1 and CPL2 stacks?) _and_ that KVM needs to toggle MSR intercepts, I'd probably
push back on toggling even the FRED controls.

> Different CPUs may implement it in different ways, which we can't assume.

Implement what in a different way? The VMCS fields and FRED are architectural.
The internal layout of the VMCS is uarch specific, but the encodings and semantics
absolutely cannot change without breaking software. And if Intel does something
asinine like make a control active-low then we have far, far bigger problems.

> Other features needing it should set it separately, say with a refcount.

Absolutely not. Unless Intel screwed up the implementation, the cost of leaving
VM_EXIT_ACTIVATE_SECONDARY_CONTROLS set when it's supported shouldn't even be
measurable.