From: Xiaoyao Li <xiaoyao.li@intel.com>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
wei.w.wang@intel.com, kan.liang@linux.intel.com
Cc: xiaoyao.li@intel.com, linux-perf-users@vger.kernel.org,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: [RFC PATCH v2 3/3] KVM: VMX: Stop/resume host PT before/after VMX transition when PT_MODE_HOST_GUEST
Date: Thu, 22 Sep 2022 00:45:21 +0800 [thread overview]
Message-ID: <20220921164521.2858932-4-xiaoyao.li@intel.com> (raw)
In-Reply-To: <20220921164521.2858932-1-xiaoyao.li@intel.com>
Current implementation in pt_guest_enter() has two issues when pt mode
is PT_MODE_HOST_GUEST.
1. It relies on VM_ENTRY_LOAD_IA32_RTIT_CTL to disable host's Intel PT
for the case that host enables PT while guest not.
However, it causes VM entry failure due to violating the requirement
stated in SDM "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.
2. In the case both host and guest enable Intel PT, it disables host's
Intel PT by manually clearing MSR_IA32_RTIT_CTL for the purpose to
context switch host and guest's PT configurations.
However, PT PMI can be delivered later and before VM entry. In the PT
PMI handler, it will a) update the host PT MSRs which leads to what KVM
stores in vmx->pt_desc.host becomes stale, and b) re-enable Intel PT
which leads to VM entry failure as #1.
To fix the above two issues, 1) grab and store host PT perf event and
disable/enable host PT before vm-enter/ after vm-exit. 2) drop host
pt_ctx and the logic to save/restore host PT MSRs since host PT driver
doesn't rely on the previous value of PT MSR, i.e., the re-enabling of PT
event after VM-exit re-initializes all the PT MSRs that it cares.
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
arch/x86/kvm/vmx/vmx.c | 31 +++++++++++++------------------
arch/x86/kvm/vmx/vmx.h | 2 +-
2 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index c9b49a09e6b5..df1a16264bb6 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -1124,37 +1124,32 @@ static inline void pt_save_msr(struct pt_ctx *ctx, u32 addr_range)
static void pt_guest_enter(struct vcpu_vmx *vmx)
{
+ struct perf_event *event;
+
if (vmx_pt_mode_is_system())
return;
- /*
- * GUEST_IA32_RTIT_CTL is already set in the VMCS.
- * Save host state before VM entry.
- */
- rdmsrl(MSR_IA32_RTIT_CTL, vmx->pt_desc.host.ctl);
- if (vmx->pt_desc.guest.ctl & RTIT_CTL_TRACEEN) {
- wrmsrl(MSR_IA32_RTIT_CTL, 0);
- pt_save_msr(&vmx->pt_desc.host, vmx->pt_desc.num_address_ranges);
+ event = pt_get_curr_event();
+ if (event)
+ perf_event_disable_local(event);
+ vmx->pt_desc.host_event = event;
+
+ if (vmx->pt_desc.guest.ctl & RTIT_CTL_TRACEEN)
pt_load_msr(&vmx->pt_desc.guest, vmx->pt_desc.num_address_ranges);
- }
}
static void pt_guest_exit(struct vcpu_vmx *vmx)
{
+ struct perf_event *event = vmx->pt_desc.host_event;
+
if (vmx_pt_mode_is_system())
return;
- if (vmx->pt_desc.guest.ctl & RTIT_CTL_TRACEEN) {
+ if (vmx->pt_desc.guest.ctl & RTIT_CTL_TRACEEN)
pt_save_msr(&vmx->pt_desc.guest, vmx->pt_desc.num_address_ranges);
- pt_load_msr(&vmx->pt_desc.host, vmx->pt_desc.num_address_ranges);
- }
- /*
- * KVM requires VM_EXIT_CLEAR_IA32_RTIT_CTL to expose PT to the guest,
- * i.e. RTIT_CTL is always cleared on VM-Exit. Restore it if necessary.
- */
- if (vmx->pt_desc.host.ctl)
- wrmsrl(MSR_IA32_RTIT_CTL, vmx->pt_desc.host.ctl);
+ if (event)
+ perf_event_enable_local(event);
}
void vmx_set_host_fs_gs(struct vmcs_host_state *host, u16 fs_sel, u16 gs_sel,
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
index 24d58c2ffaa3..4c20bdabc85b 100644
--- a/arch/x86/kvm/vmx/vmx.h
+++ b/arch/x86/kvm/vmx/vmx.h
@@ -66,7 +66,7 @@ struct pt_desc {
u64 ctl_bitmask;
u32 num_address_ranges;
u32 caps[PT_CPUID_REGS_NUM * PT_CPUID_LEAVES];
- struct pt_ctx host;
+ struct perf_event *host_event;
struct pt_ctx guest;
};
--
2.27.0
next prev parent reply other threads:[~2022-09-21 16:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-21 16:45 [RFC PATCH v2 0/3] KVM: VMX: Fix VM entry failure on PT_MODE_HOST_GUEST while host is using PT Xiaoyao Li
2022-09-21 16:45 ` [RFC PATCH v2 1/3] perf/core: Expose perf_event_{en,dis}able_local() Xiaoyao Li
2022-09-22 12:16 ` Wang, Wei W
2022-09-21 16:45 ` [RFC PATCH v2 2/3] perf/x86/intel/pt: Introduce and export pt_get_curr_event() Xiaoyao Li
2022-09-22 5:14 ` Xiaoyao Li
2022-09-22 12:33 ` Liang, Kan
2022-09-22 12:58 ` Wang, Wei W
2022-09-22 13:34 ` Peter Zijlstra
2022-09-22 13:59 ` Wang, Wei W
2022-09-22 14:09 ` Peter Zijlstra
2022-09-22 14:42 ` Wang, Wei W
2022-09-26 15:48 ` Liang, Kan
2022-09-26 17:24 ` Jim Mattson
2022-09-26 18:08 ` Liang, Kan
2022-09-27 14:27 ` Wang, Wei W
2022-09-27 16:52 ` Liang, Kan
2022-09-26 15:32 ` Liang, Kan
2022-09-21 16:45 ` Xiaoyao Li [this message]
2022-09-22 12:34 ` [RFC PATCH v2 3/3] KVM: VMX: Stop/resume host PT before/after VMX transition when PT_MODE_HOST_GUEST Wang, Wei W
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220921164521.2858932-4-xiaoyao.li@intel.com \
--to=xiaoyao.li@intel.com \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=seanjc@google.com \
--cc=wei.w.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).