Message ID | 20231108183003.5981-1-xin3.li@intel.com |
---|---|
Headers | show |
Series | Enable FRED with KVM VMX | expand |
> >+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? Different CPUs may implement it in different ways, which we can't assume. Other features needing it should set it separately, say with a refcount.
> > >+ if (cpu_feature_enabled(X86_FEATURE_FRED) && > > >+ !(_vmentry_control & VM_ENTRY_LOAD_IA32_FRED)) { > > >+ pr_warn_once("FRED enabled but no VMX VM-Entry > LOAD_IA32_FRED control: %x\n", > > >+ _vmentry_control); > > > > Can we just hide FRED from guests like what KVM does for other > > features which have similar dependencies? see vmx_set_cpu_caps(). > > Both of these warnings should simply be dropped. The > error_on_inconsistent_vmcs_config stuff is for inconsistencies within the allowed > VMCS fields. Having a feature that is supported in bare metal but not virtualized > is perfectly legal, if uncommon. I deliberately keep it, at least for now, because these checks are helpful during the development of nVMX FRED. It will be helpful for other VMMs being developed/tested on KVM. > What *is* needed is for KVM to refuse to virtualize FRED if the entry/exit controls > aren't consistent. E.g. if at least one control is present, and at least one > control is missing. I.e. KVM needs a version of vmcs_entry_exit_pairs that can > deal with SECONDAY_VM_EXIT controls. I agree there are better ways. But maybe after or before VMX FRED. > I'll circle back to this when I give the > series a proper review, which is going to be 3+ weeks. The traffic in KVM mailing list is surprisingly high recently. So that is totally expected.
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.
On Fri, Nov 10, 2023, Xin3 Li wrote: > > > >+ if (cpu_feature_enabled(X86_FEATURE_FRED) && > > > >+ !(_vmentry_control & VM_ENTRY_LOAD_IA32_FRED)) { > > > >+ pr_warn_once("FRED enabled but no VMX VM-Entry > > LOAD_IA32_FRED control: %x\n", > > > >+ _vmentry_control); > > > > > > Can we just hide FRED from guests like what KVM does for other > > > features which have similar dependencies? see vmx_set_cpu_caps(). > > > > Both of these warnings should simply be dropped. The > > error_on_inconsistent_vmcs_config stuff is for inconsistencies within the allowed > > VMCS fields. Having a feature that is supported in bare metal but not virtualized > > is perfectly legal, if uncommon. > > I deliberately keep it, at least for now, because these checks are helpful > during the development of nVMX FRED. It will be helpful for other VMMs > being developed/tested on KVM. No, remove it. It's architecturally legal for a CPU to support a feature in bare metal but not provide virtualization support. > > What *is* needed is for KVM to refuse to virtualize FRED if the entry/exit controls > > aren't consistent. E.g. if at least one control is present, and at least one > > control is missing. I.e. KVM needs a version of vmcs_entry_exit_pairs that can > > deal with SECONDAY_VM_EXIT controls. > > I agree there are better ways. But maybe after or before VMX FRED. Uh, no. This is not optional. FRED is the first feature that uses SECONDAY_VM_EXIT controls, so FRED gets the honor of adding the necessary infrastructure support.
> > > 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. To me, FRED is to _architecturally_ do the right thing for x86 event handling. I don't think FRED's major purpose is to kill legacy craps, but longer term it paves the way for that. Yeah, I would like to discuss whether to toggle 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. I should have made it clear that I wasn't talking at the ISA level. And of course CPU uarch implementations should be transparent to software. I mean a CPU uarch could choose to check the activation bit in the VM exit controls first and then decide whether to load the 2nd VM exit controls. While if resources allow, a CPU uarch could always load the 2nd VM exit controls. BTW, I believe the active-low controls are really gone with new features. All new controls are all 0s by default. > > 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. I do hope so. However, I don't know whether this is guaranteed or not on all uarch implementations. A decision to leave it set is good enough for now. Thanks! Xin
> > > > Can we just hide FRED from guests like what KVM does for other > > > > features which have similar dependencies? see vmx_set_cpu_caps(). > > > > > > Both of these warnings should simply be dropped. The > > > error_on_inconsistent_vmcs_config stuff is for inconsistencies within the > allowed > > > VMCS fields. Having a feature that is supported in bare metal but not > virtualized > > > is perfectly legal, if uncommon. > > > > I deliberately keep it, at least for now, because these checks are helpful > > during the development of nVMX FRED. It will be helpful for other VMMs > > being developed/tested on KVM. > > No, remove it. It's architecturally legal for a CPU to support a feature in bare > metal but not provide virtualization support. Like the stage when native Linux has FRED support while KVM not yet? > > > What *is* needed is for KVM to refuse to virtualize FRED if the entry/exit > controls > > > aren't consistent. E.g. if at least one control is present, and at least one > > > control is missing. I.e. KVM needs a version of vmcs_entry_exit_pairs that can > > > deal with SECONDAY_VM_EXIT controls. > > > > I agree there are better ways. But maybe after or before VMX FRED. > > Uh, no. This is not optional. FRED is the first feature that uses > SECONDAY_VM_EXIT > controls, so FRED gets the honor of adding the necessary infrastructure support. The 2nd VM exit controls is a must for FRED, so I should do it. I think you mean the consistency checks can be done in a better way (which is not just for FRED controls consistency checks). No? Thanks! Xin