Use static calls to improve kvm_pmu_ops performance, following the same pattern and naming scheme used by kvm-x86-ops.h. Here are the worst fenced_rdtsc() cycles numbers for the kvm_pmu_ops functions that is most often called (up to 7 digits of calls) when running a single perf test case in a guest on an ICX 2.70GHz host (mitigations=on): | legacy | static call ------------------------------------------------------------ .pmc_idx_to_pmc | 1304840 | 994872 (+23%) .pmc_is_enabled | 978670 | 1011750 (-3%) .msr_idx_to_pmc | 47828 | 41690 (+12%) .is_valid_msr | 28786 | 30108 (-4%) Signed-off-by: Like Xu <likexu@tencent.com> [sean: Handle static call updates in pmu.c, tweak changelog] Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20220329235054.3534728-5-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
32 lines
929 B
C
32 lines
929 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#if !defined(KVM_X86_PMU_OP) || !defined(KVM_X86_PMU_OP_OPTIONAL)
|
|
BUILD_BUG_ON(1)
|
|
#endif
|
|
|
|
/*
|
|
* KVM_X86_PMU_OP() and KVM_X86_PMU_OP_OPTIONAL() are used to help generate
|
|
* both DECLARE/DEFINE_STATIC_CALL() invocations and
|
|
* "static_call_update()" calls.
|
|
*
|
|
* KVM_X86_PMU_OP_OPTIONAL() can be used for those functions that can have
|
|
* a NULL definition, for example if "static_call_cond()" will be used
|
|
* at the call sites.
|
|
*/
|
|
KVM_X86_PMU_OP(pmc_perf_hw_id)
|
|
KVM_X86_PMU_OP(pmc_is_enabled)
|
|
KVM_X86_PMU_OP(pmc_idx_to_pmc)
|
|
KVM_X86_PMU_OP(rdpmc_ecx_to_pmc)
|
|
KVM_X86_PMU_OP(msr_idx_to_pmc)
|
|
KVM_X86_PMU_OP(is_valid_rdpmc_ecx)
|
|
KVM_X86_PMU_OP(is_valid_msr)
|
|
KVM_X86_PMU_OP(get_msr)
|
|
KVM_X86_PMU_OP(set_msr)
|
|
KVM_X86_PMU_OP(refresh)
|
|
KVM_X86_PMU_OP(init)
|
|
KVM_X86_PMU_OP(reset)
|
|
KVM_X86_PMU_OP_OPTIONAL(deliver_pmi)
|
|
KVM_X86_PMU_OP_OPTIONAL(cleanup)
|
|
|
|
#undef KVM_X86_PMU_OP
|
|
#undef KVM_X86_PMU_OP_OPTIONAL
|