There is one bug in KVM that can hit vm-entry failure 100% on platform supporting PT_MODE_HOST_GUEST mode following below steps: 1. #modprobe -r kvm_intel 2. #modprobe kvm_intel pt_mode=1 3. start a VM with QEMU 4. on host: #perf record -e intel_pt// The vm-entry failure happens because it violates the requirement stated in Intel SDM 26.2.1.1 VM-Execution Control Fields If the logical processor is operating with Intel PT enabled (if IA32_RTIT_CTL.TraceEn = 1) at the time of VM entry, the "load IA32_RTIT_CTL" VM-entry control must be 0. On PT_MODE_HOST_GUEST node, vm-entry load RTIT is always set. Thus KVM needs to ensure IA32_RTIT_CTL.TraceEn is 0 before VM-entry. Currently KVM manually WRMSR(IA32_RTIT_CTL) to clear TraceEn bit. However, it doesn't work everytime since there is a posibility that IA32_RTIT_CTL.TraceEn is re-enabled in PT PMI handler before vm-entry. This series tries to fix the issue by exposing and calling perf driver API to stop host PT event (if any) before vm-entry and resume PT event after vm-exit. Perf API can prevent PT PMI handler from re-enabling PT. By the way, drop the save/restore of PT MSRs of host because the resume of PT event after vm-exit doesn't rely on the previous value of PT MSRs. Changes in v1: - Export perf_event_{en,dis}able_local() and pt_get_curr_event() for KVM to stop/resume PT event; (Suggested-by Wang, Wei W <wei.w.wang@xxxxxxxxx>) - Drop the save/restore of host PT MSRs. v1: https://lore.kernel.org/all/20220825085625.867763-1-xiaoyao.li@xxxxxxxxx/ Xiaoyao Li (3): perf/core: Expose perf_event_{en,dis}able_local() perf/x86/intel/pt: Introduce and export pt_get_curr_event() KVM: VMX: Stop/resume host PT before/after VMX transition when PT_MODE_HOST_GUEST arch/x86/events/intel/pt.c | 8 ++++++++ arch/x86/include/asm/perf_event.h | 2 ++ arch/x86/kvm/vmx/vmx.c | 31 +++++++++++++------------------ arch/x86/kvm/vmx/vmx.h | 2 +- include/linux/perf_event.h | 1 + kernel/events/core.c | 7 +++++++ 6 files changed, 32 insertions(+), 19 deletions(-) -- 2.27.0