From: Sean Christopherson <seanjc@google.com>
To: Krish Sadhukhan <krish.sadhukhan@oracle.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, jmattson@google.com,
vkuznets@redhat.com, wanpengli@tencent.com, joro@8bytes.org
Subject: Re: [PATCH] KVM: nVMX: nSVM: Show guest mode in kvm_{entry,exit} tracepoints
Date: Fri, 30 Jul 2021 19:37:04 +0000 [thread overview]
Message-ID: <YQRU4Es38nR6vo63@google.com> (raw)
In-Reply-To: <20210621204345.124480-2-krish.sadhukhan@oracle.com>
On Mon, Jun 21, 2021, Krish Sadhukhan wrote:
> From debugging point of view, KVM entry and exit tracepoints are important
> in that they indicate when a guest starts and exits. When L1 runs L2, there
> is no way we can determine from KVM tracing when L1 starts/exits and when
> L2 starts/exits as there is no marker in place today in those tracepoints.
> Debugging becomes even more difficult when more than one L2 run in an L1 and
> there is no way of determining which L2 from which L1 made the entries/exits.
> Therefore, showing guest mode in the entry and exit tracepoints
> will make debugging much easier.
> If an L1 runs multiple L2s, though we can not identify the specific L2 from
> the entry and exit tracepoints, we still will be able to determine whether it
> was L1 or an L2 that made the entries and the exits.
Hmm, this is a solvable problem, and might even be worth solving immediately,
e.g. kvm_x86_ops.get_vmcx12 to retrieve the L1 GPA of the vmcs12/vmcb12.
More below.
> With this patch KVM entry and exit tracepoints will show "guest_mode = 0" if
> it is a guest and "guest_mode = 1" if it is a nested guest.
Uber pedantry, but technically not true, as trace_kvm_entry() doesn't have the
'=', and in the exit tracepoint, the '=' should be dropped to be consistent with
the existing format. Might be a moot point though.
> Signed-off-by: Krish Sdhukhan <krish.sadhukhan@oracle.com>
> ---
> arch/x86/kvm/trace.h | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h
> index b484141ea15b..44dba26c6be2 100644
> --- a/arch/x86/kvm/trace.h
> +++ b/arch/x86/kvm/trace.h
> @@ -21,14 +21,17 @@ TRACE_EVENT(kvm_entry,
> TP_STRUCT__entry(
> __field( unsigned int, vcpu_id )
> __field( unsigned long, rip )
> + __field( bool, guest_mode )
> ),
>
> TP_fast_assign(
> __entry->vcpu_id = vcpu->vcpu_id;
> __entry->rip = kvm_rip_read(vcpu);
> + __entry->guest_mode = is_guest_mode(vcpu);
> ),
>
> - TP_printk("vcpu %u, rip 0x%lx", __entry->vcpu_id, __entry->rip)
> + TP_printk("vcpu %u, rip 0x%lx, guest_mode %d", __entry->vcpu_id,
> + __entry->rip, __entry->guest_mode)
> );
>
> /*
> @@ -285,6 +288,7 @@ TRACE_EVENT(name, \
> __field( u32, intr_info ) \
> __field( u32, error_code ) \
> __field( unsigned int, vcpu_id ) \
> + __field( bool, guest_mode ) \
> ), \
> \
> TP_fast_assign( \
> @@ -295,15 +299,17 @@ TRACE_EVENT(name, \
> static_call(kvm_x86_get_exit_info)(vcpu, &__entry->info1, \
> &__entry->info2, \
> &__entry->intr_info, \
> - &__entry->error_code); \
> + &__entry->error_code); \
> + __entry->guest_mode = is_guest_mode(vcpu); \
> ), \
> \
> TP_printk("vcpu %u reason %s%s%s rip 0x%lx info1 0x%016llx " \
> - "info2 0x%016llx intr_info 0x%08x error_code 0x%08x", \
> - __entry->vcpu_id, \
> + "info2 0x%016llx intr_info 0x%08x error_code 0x%08x " \
> + "guest_mode = %d", __entry->vcpu_id, \
I'm biased because I've never really liked is_guest_mode(), but I think guest_mode
will be confusing to users. KVM developers are familiar with guest_mode() == L2,
but random debuggers/users are unlikely to make that connection.
A clever/heinous way to "solve" this issue and display vmcx12 iff L2 is active
would be to bastardize the L1/L2 strings and vmcx12 value formatting to yield:
vcpu 0 reason <reason> guest L1 rip 0xfffff ...
and
vcpu 0 reason <reason> guest L2 vmcx12 0xaaaaa rip 0xfffff ...
#define TRACE_EVENT_KVM_EXIT(name) \
TRACE_EVENT(name, \
TP_PROTO(unsigned int exit_reason, struct kvm_vcpu *vcpu, u32 isa), \
TP_ARGS(exit_reason, vcpu, isa), \
\
TP_STRUCT__entry( \
__field( unsigned int, exit_reason ) \
__field( unsigned long, guest_rip ) \
__field( u32, isa ) \
__field( u64, info1 ) \
__field( u64, info2 ) \
__field( u32, intr_info ) \
__field( u32, error_code ) \
__field( unsigned int, vcpu_id ) \
__field( u64, vmcx12 ) \
), \
\
TP_fast_assign( \
__entry->exit_reason = exit_reason; \
__entry->guest_rip = kvm_rip_read(vcpu); \
__entry->isa = isa; \
__entry->vcpu_id = vcpu->vcpu_id; \
static_call(kvm_x86_get_exit_info)(vcpu, &__entry->info1, \
&__entry->info2, \
&__entry->intr_info, \
&__entry->error_code); \
__entry->vmcx12 = is_guest_mode(vcpu) ? \
static_call(kvm_x86_get_vmcx12) : \
INVALID_PAGE; \
), \
\
TP_printk("vcpu %u reason %s%s%s guest %s%llx rip 0x%lx " \
"info1 0x%016llx info2 0x%016llx " \
"intr_info 0x%08x error_code 0x%08x", \
__entry->vcpu_id, \
kvm_print_exit_reason(__entry->exit_reason, __entry->isa), \
__entry->vmcx12 == INVALID_PAGE ? "L" : "L2 vmcx12 0x", \
__entry->vmcx12 == INVALID_PAGE ? 1 : __entry->vmcx12, \
__entry->guest_rip, __entry->info1, __entry->info2, \
__entry->intr_info, __entry->error_code) \
)
next prev parent reply other threads:[~2021-07-30 19:37 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-21 20:43 [PATCH] KVM: nVMX: nSVM: Show guest mode in kvm_{entry,exit} tracepoints Krish Sadhukhan
2021-06-21 20:43 ` Krish Sadhukhan
2021-07-30 19:37 ` Sean Christopherson [this message]
2021-08-02 14:18 ` Paolo Bonzini
2021-08-02 16:34 ` Sean Christopherson
2021-08-02 16:39 ` Paolo Bonzini
2021-08-02 22:21 ` Krish Sadhukhan
2021-08-02 23:20 ` Jim Mattson
2021-08-03 0:03 ` Sean Christopherson
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=YQRU4Es38nR6vo63@google.com \
--to=seanjc@google.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=krish.sadhukhan@oracle.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.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