[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241121185315.3416855-12-mizhang@google.com>
Date: Thu, 21 Nov 2024 18:53:03 +0000
From: Mingwei Zhang <mizhang@...gle.com>
To: Sean Christopherson <seanjc@...gle.com>, Paolo Bonzini <pbonzini@...hat.com>,
Huang Rui <ray.huang@....com>, "Gautham R. Shenoy" <gautham.shenoy@....com>,
Mario Limonciello <mario.limonciello@....com>, "Rafael J. Wysocki" <rafael@...nel.org>,
Viresh Kumar <viresh.kumar@...aro.org>,
Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>, Len Brown <lenb@...nel.org>
Cc: "H. Peter Anvin" <hpa@...or.com>, Perry Yuan <perry.yuan@....com>, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-pm@...r.kernel.org,
Jim Mattson <jmattson@...gle.com>, Mingwei Zhang <mizhang@...gle.com>
Subject: [RFC PATCH 11/22] KVM: x86: Initialize guest [am]perf at vcpu power-on
From: Jim Mattson <jmattson@...gle.com>
The guest's IA32_APERF and IA32_MPERF MSRs start at zero. However,
IA32_MPERF should be incremented whenever the vCPU is in C0, just as
the host's IA32_MPERF MSR is incremented by hardware.
Record the host TSC at vcpu_reset() to start tracking time spent in C0.
Later patches will add the host TSC delta to the guest's stored IA32_MPERF
value at appropriate points.
Signed-off-by: Jim Mattson <jmattson@...gle.com>
---
arch/x86/include/asm/kvm_host.h | 9 +++++++++
arch/x86/kvm/x86.c | 7 +++++++
2 files changed, 16 insertions(+)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 04ef56d10cbb1..067e6ec7f7e9c 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -738,6 +738,13 @@ struct kvm_queued_exception {
bool has_payload;
};
+struct kvm_vcpu_aperfmperf {
+ u64 guest_aperf;
+ u64 guest_mperf;
+ u64 host_tsc;
+ bool loaded_while_running;
+};
+
struct kvm_vcpu_arch {
/*
* rip and regs accesses must go through
@@ -1040,6 +1047,8 @@ struct kvm_vcpu_arch {
#if IS_ENABLED(CONFIG_HYPERV)
hpa_t hv_root_tdp;
#endif
+
+ struct kvm_vcpu_aperfmperf aperfmperf;
};
struct kvm_lpage_info {
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3c6b0ca91e5f5..d66cccff13347 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -12476,6 +12476,13 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
__kvm_set_xcr(vcpu, 0, XFEATURE_MASK_FP);
__kvm_set_msr(vcpu, MSR_IA32_XSS, 0, true);
+
+ /*
+ * IA32_MPERF should start running now. Record the host TSC
+ * so that we can add the host TSC delta the next time that
+ * we load the guest [am]perf values into the hardware MSRs.
+ */
+ vcpu->arch.aperfmperf.host_tsc = rdtsc();
}
/* All GPRs except RDX (handled below) are zeroed on RESET/INIT. */
--
2.47.0.371.ga323438b13-goog
Powered by blists - more mailing lists