From 7b99df34ad4bbf41c60351d6eba96618e91ee6e4 Mon Sep 17 00:00:00 2001 From: Liao Xuan Date: Thu, 13 Mar 2025 05:52:29 -0400 Subject: [PATCH] KVM: x86/svm: Add set_guest_pat_wb parameter for non-passthrough application scenarios hygon inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IDCT0K CVE: N/A Reference: https://gitee.com/anolis/cloud-kernel/commit/efc03fe84a714a362dae7e1f53b4cee2f24fc8ee -------------------------------------------------------------------------------- ANBZ: #19121 Add kernel parameter set_guest_pat_wb to set guest PAT to WB in some non-passthrough application scenarios to enhance performance. Hygon-SIG: commit efc03fe84a71 anolis KVM: x86/svm: Add set_guest_pat_wb parameter for non-passthrough application scenarios Backport to add set_guest_pat_wb parameter for non-passthrough application scenarios. Signed-off-by: Yanjing Zhou Signed-off-by: Liao Xuan [ Aichun Shi: amend commit log ] Signed-off-by: Aichun Shi --- arch/x86/kvm/svm.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index e62bcdb0822e..7a8d33f833f4 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -94,6 +94,8 @@ MODULE_DEVICE_TABLE(x86cpu, svm_cpu_id); #define TSC_RATIO_MIN 0x0000000000000001ULL #define TSC_RATIO_MAX 0x000000ffffffffffULL +#define GUEST_PAT_WB_ATTR 0x0606060606060606 + #define AVIC_HPA_MASK ~((0xFFFULL << 52) | 0xFFF) /* @@ -379,6 +381,17 @@ module_param(vgif, int, 0444); static int sev = IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT); module_param(sev, int, 0444); +/* + * Allow set guest PAT to WB in some non-passthrough + * application scenarios to enhance performance. + * + * Add kernel parameter set_guest_pat_wb(default 0): + * 1 - set guest PAT to WB + * 0 - keep guest PAT to the kernel default value + */ +static int set_guest_pat_wb; +module_param(set_guest_pat_wb, int, 0444); + static u8 rsm_ins_bytes[] = "\x0f\xaa"; static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0); @@ -1528,6 +1541,16 @@ static void avic_init_vmcb(struct vcpu_svm *svm) vmcb->control.int_ctl |= AVIC_ENABLE_MASK; } +static void svm_set_guest_pat(struct vcpu_svm *svm, u64 *g_pat) +{ + struct kvm_vcpu *vcpu = &svm->vcpu; + + if (!kvm_arch_has_assigned_device(vcpu->kvm)) + *g_pat = GUEST_PAT_WB_ATTR; + else + *g_pat = vcpu->arch.pat; +} + static void init_vmcb(struct vcpu_svm *svm) { struct vmcb_control_area *control = &svm->vmcb->control; @@ -1640,6 +1663,8 @@ static void init_vmcb(struct vcpu_svm *svm) clr_cr_intercept(svm, INTERCEPT_CR3_READ); clr_cr_intercept(svm, INTERCEPT_CR3_WRITE); save->g_pat = svm->vcpu.arch.pat; + if (set_guest_pat_wb) + svm_set_guest_pat(svm, &save->g_pat); save->cr3 = 0; save->cr4 = 0; } @@ -4310,6 +4335,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) return 1; vcpu->arch.pat = data; svm->vmcb->save.g_pat = data; + if (npt_enabled && set_guest_pat_wb) { + svm_set_guest_pat(svm, &svm->vmcb->save.g_pat); + vcpu->arch.pat = svm->vmcb->save.g_pat; + } mark_dirty(svm->vmcb, VMCB_NPT); break; case MSR_IA32_SPEC_CTRL: -- Gitee