Re: [PATCH][v6] KVM: X86: support APERF/MPERF registers

From: Xu, Like
Date: Thu Jun 04 2020 - 22:32:31 EST

Hi RongQing,

On 2020/6/5 9:44, Li RongQing wrote:
Guest kernel reports a fixed cpu frequency in /proc/cpuinfo,
this is confused to user when turbo is enable, and aperf/mperf
can be used to show current cpu frequency after 7d5905dc14a
"(x86 / CPU: Always show current CPU frequency in /proc/cpuinfo)"
so guest should support aperf/mperf capability

This patch implements aperf/mperf by three mode: none, software
emulation, and pass-through

None: default mode, guest does not support aperf/mperf

Software emulation: the period of aperf/mperf in guest mode are
accumulated as emulated value

Pass-though: it is only suitable for KVM_HINTS_REALTIME, Because
that hint guarantees we have a 1:1 vCPU:CPU binding and guaranteed
no over-commit.
The flag "KVM_HINTS_REALTIME 0" (in the Documentation/virt/kvm/cpuid.rst)
is claimed as "guest checks this feature bit to determine that vCPUs are never
preempted for an unlimited time allowing optimizations".

I couldn't see its relationship with "1:1 vCPU: pCPU binding".
The patch doesn't check this flag as well for your pass-through purpose.

Like Xu

And a per-VM capability is added to configure aperfmperf mode

Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx>
Signed-off-by: Chai Wen <chaiwen@xxxxxxxxx>
Signed-off-by: Jia Lina <jialina01@xxxxxxxxx>
diff v5:
return error if guest is configured with mperf/aperf, but host cpu has not

diff v4:
fix maybe-uninitialized warning

diff v3:
fix interception of MSR_IA32_MPERF/APERF in svm

diff v2:
support aperfmperf pass though
move common codes to kvm_get_msr_common

diff v1:
1. support AMD, but not test
2. support per-vm capability to enable

Documentation/virt/kvm/api.rst | 10 ++++++++++
arch/x86/include/asm/kvm_host.h | 11 +++++++++++
arch/x86/kvm/cpuid.c | 15 ++++++++++++++-
arch/x86/kvm/svm/svm.c | 8 ++++++++
arch/x86/kvm/vmx/vmx.c | 6 ++++++
arch/x86/kvm/x86.c | 42 +++++++++++++++++++++++++++++++++++++++++
arch/x86/kvm/x86.h | 15 +++++++++++++++
include/uapi/linux/kvm.h | 1 +
8 files changed, 107 insertions(+), 1 deletion(-)