Introduce kvm module parameter global_tdp to turn on the direct build EPT mode
RFC 8/9 Introduce kvm module parameter global_tdp to turn on the direct build EPT mode
From: Yulei Zhang <[email protected]>
Currently global_tdp is only supported on intel X86 system with ept supported, and it will turn off the smm mode when enable global_tdp.
Signed-off-by Yulei Zhang <[email protected]>
--- arch/x86/include/asm/kvm_host.h | 4 ++++ arch/x86/kvm/mmu/mmu.c | 5 ++++- arch/x86/kvm/x86.c | 11 ++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-)
arch/x86/include/asm/kvm_host.h +4 -0
@@ -1368,6 +1368,8 @@ extern u64 kvm_default_tsc_scaling_ratio;extern u64 kvm_mce_cap_supported; +extern bool global_tdp; +/* * EMULTYPE_NO_DECODE - Set when re-emulating an instruction (after completing * userspace I/O) to indicate that the emulation context
@@ -1698,6 +1700,8 @@ static inline int kvm_cpu_get_apicid(int mps_cpu)#endif } +inline bool boot_cpu_is_amd (void ); +#define put_smstate (type, buf, offset, val) \ *(type *)((buf) + (offset) - 0x7e00) = val
arch/x86/kvm/mmu/mmu.c +4 -1
@@ -4630,7 +4630,7 @@ reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context) }EXPORT_SYMBOL_GPL (reset_shadow_zero_bits_mask); -static inline bool boot_cpu_is_amd (void ) +inline bool boot_cpu_is_amd (void ) {WARN_ON_ONCE (!tdp_enabled);return shadow_x_mask ==0 ;
@@ -6471,6 +6471,9 @@ int kvm_direct_tdp_populate_page_table(struct kvm *kvm, struct kvm_memory_slot *kvm_pfn_t pfn;int host_level; +if (!global_tdp) +return 0 ; +if (!kvm->arch.global_root_hpa) {struct page *page;WARN_ON (!tdp_enabled);
arch/x86/kvm/x86.c +10 -1
@@ -162,6 +162,9 @@ module_param(force_emulation_prefix, bool, S_IRUGO);int __read_mostly pi_inject_timer =-1 ;module_param (pi_inject_timer, bint,S_IRUGO |S_IWUSR ); +bool __read_mostly global_tdp; +module_param_named (global_tdp, global_tdp, bool,S_IRUGO ); +#define KVM_NR_SHARED_MSRS 16struct kvm_shared_msrs_global {
@@ -3403,7 +3406,10 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)* fringe case that is not enabled except via specific settings * of the module parameters. */ - r = kvm_x86_ops.has_emulated_msr (MSR_IA32_SMBASE ); +if (global_tdp) + r =0 ; +else + r = kvm_x86_ops.has_emulated_msr (MSR_IA32_SMBASE );break ;case KVM_CAP_VAPIC : r = !kvm_x86_ops.cpu_has_accelerated_tpr ();
@@ -9675,6 +9681,9 @@ int kvm_arch_hardware_setup(void *opaque)if (r !=0 )return r; +if ((tdp_enabled == false) ||boot_cpu_is_amd ()) + global_tdp =0 ; +memcpy (&kvm_x86_ops, ops->runtime_ops,sizeof (kvm_x86_ops));if (!kvm_cpu_cap_has (X86_FEATURE_XSAVES ))
Signature · 1 line
2.17.1