Message ID | 20240506225321.3440701-2-alejandro.j.jimenez@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Print names of apicv inhibit reasons in traces | expand |
On 5/7/2024 4:23 AM, Alejandro Jimenez wrote: > Use the tracing infrastructure helper __print_flags() for printing flag > bitfields, to enhance the trace output by displaying a string describing > each of the inhibit reasons set. > > The kvm_apicv_inhibit_changed tracepoint currently shows the raw bitmap > value, requiring the user to consult the source file where the inhibit > reasons are defined to decode the trace output. > > Co-developed-by: Sean Christopherson <seanjc@google.com> > Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com> Looks good to me. Reviewed-by: Vasant Hegde <vasant.hegde@amd.com> -Vasant > --- > arch/x86/include/asm/kvm_host.h | 19 +++++++++++++++++++ > arch/x86/kvm/trace.h | 9 +++++++-- > arch/x86/kvm/x86.c | 4 ++++ > 3 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 1d13e3cd1dc5..08f83efd12ff 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -1273,8 +1273,27 @@ enum kvm_apicv_inhibit { > * mapping between logical ID and vCPU. > */ > APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED, > + > + NR_APICV_INHIBIT_REASONS, > }; > > +#define __APICV_INHIBIT_REASON(reason) \ > + { BIT(APICV_INHIBIT_REASON_##reason), #reason } > + > +#define APICV_INHIBIT_REASONS \ > + __APICV_INHIBIT_REASON(DISABLE), \ > + __APICV_INHIBIT_REASON(HYPERV), \ > + __APICV_INHIBIT_REASON(ABSENT), \ > + __APICV_INHIBIT_REASON(BLOCKIRQ), \ > + __APICV_INHIBIT_REASON(PHYSICAL_ID_ALIASED), \ > + __APICV_INHIBIT_REASON(APIC_ID_MODIFIED), \ > + __APICV_INHIBIT_REASON(APIC_BASE_MODIFIED), \ > + __APICV_INHIBIT_REASON(NESTED), \ > + __APICV_INHIBIT_REASON(IRQWIN), \ > + __APICV_INHIBIT_REASON(PIT_REINJ), \ > + __APICV_INHIBIT_REASON(SEV), \ > + __APICV_INHIBIT_REASON(LOGICAL_ID_ALIASED) > + > struct kvm_arch { > unsigned long n_used_mmu_pages; > unsigned long n_requested_mmu_pages; > diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h > index 9d0b02ef307e..f23fb9a6776e 100644 > --- a/arch/x86/kvm/trace.h > +++ b/arch/x86/kvm/trace.h > @@ -1375,6 +1375,10 @@ TRACE_EVENT(kvm_hv_stimer_cleanup, > __entry->vcpu_id, __entry->timer_index) > ); > > +#define kvm_print_apicv_inhibit_reasons(inhibits) \ > + (inhibits), (inhibits) ? " " : "", \ > + (inhibits) ? __print_flags(inhibits, "|", APICV_INHIBIT_REASONS) : "" > + > TRACE_EVENT(kvm_apicv_inhibit_changed, > TP_PROTO(int reason, bool set, unsigned long inhibits), > TP_ARGS(reason, set, inhibits), > @@ -1391,9 +1395,10 @@ TRACE_EVENT(kvm_apicv_inhibit_changed, > __entry->inhibits = inhibits; > ), > > - TP_printk("%s reason=%u, inhibits=0x%lx", > + TP_printk("%s reason=%u, inhibits=0x%lx%s%s", > __entry->set ? "set" : "cleared", > - __entry->reason, __entry->inhibits) > + __entry->reason, > + kvm_print_apicv_inhibit_reasons(__entry->inhibits)) > ); > > TRACE_EVENT(kvm_apicv_accept_irq, > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index b389129d59a9..597ff748f955 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -10011,6 +10011,10 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_apicv_activated); > static void set_or_clear_apicv_inhibit(unsigned long *inhibits, > enum kvm_apicv_inhibit reason, bool set) > { > + const struct trace_print_flags apicv_inhibits[] = { APICV_INHIBIT_REASONS }; > + > + BUILD_BUG_ON(ARRAY_SIZE(apicv_inhibits) != NR_APICV_INHIBIT_REASONS); > + > if (set) > __set_bit(reason, inhibits); > else
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 1d13e3cd1dc5..08f83efd12ff 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1273,8 +1273,27 @@ enum kvm_apicv_inhibit { * mapping between logical ID and vCPU. */ APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED, + + NR_APICV_INHIBIT_REASONS, }; +#define __APICV_INHIBIT_REASON(reason) \ + { BIT(APICV_INHIBIT_REASON_##reason), #reason } + +#define APICV_INHIBIT_REASONS \ + __APICV_INHIBIT_REASON(DISABLE), \ + __APICV_INHIBIT_REASON(HYPERV), \ + __APICV_INHIBIT_REASON(ABSENT), \ + __APICV_INHIBIT_REASON(BLOCKIRQ), \ + __APICV_INHIBIT_REASON(PHYSICAL_ID_ALIASED), \ + __APICV_INHIBIT_REASON(APIC_ID_MODIFIED), \ + __APICV_INHIBIT_REASON(APIC_BASE_MODIFIED), \ + __APICV_INHIBIT_REASON(NESTED), \ + __APICV_INHIBIT_REASON(IRQWIN), \ + __APICV_INHIBIT_REASON(PIT_REINJ), \ + __APICV_INHIBIT_REASON(SEV), \ + __APICV_INHIBIT_REASON(LOGICAL_ID_ALIASED) + struct kvm_arch { unsigned long n_used_mmu_pages; unsigned long n_requested_mmu_pages; diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h index 9d0b02ef307e..f23fb9a6776e 100644 --- a/arch/x86/kvm/trace.h +++ b/arch/x86/kvm/trace.h @@ -1375,6 +1375,10 @@ TRACE_EVENT(kvm_hv_stimer_cleanup, __entry->vcpu_id, __entry->timer_index) ); +#define kvm_print_apicv_inhibit_reasons(inhibits) \ + (inhibits), (inhibits) ? " " : "", \ + (inhibits) ? __print_flags(inhibits, "|", APICV_INHIBIT_REASONS) : "" + TRACE_EVENT(kvm_apicv_inhibit_changed, TP_PROTO(int reason, bool set, unsigned long inhibits), TP_ARGS(reason, set, inhibits), @@ -1391,9 +1395,10 @@ TRACE_EVENT(kvm_apicv_inhibit_changed, __entry->inhibits = inhibits; ), - TP_printk("%s reason=%u, inhibits=0x%lx", + TP_printk("%s reason=%u, inhibits=0x%lx%s%s", __entry->set ? "set" : "cleared", - __entry->reason, __entry->inhibits) + __entry->reason, + kvm_print_apicv_inhibit_reasons(__entry->inhibits)) ); TRACE_EVENT(kvm_apicv_accept_irq, diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b389129d59a9..597ff748f955 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10011,6 +10011,10 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_apicv_activated); static void set_or_clear_apicv_inhibit(unsigned long *inhibits, enum kvm_apicv_inhibit reason, bool set) { + const struct trace_print_flags apicv_inhibits[] = { APICV_INHIBIT_REASONS }; + + BUILD_BUG_ON(ARRAY_SIZE(apicv_inhibits) != NR_APICV_INHIBIT_REASONS); + if (set) __set_bit(reason, inhibits); else
Use the tracing infrastructure helper __print_flags() for printing flag bitfields, to enhance the trace output by displaying a string describing each of the inhibit reasons set. The kvm_apicv_inhibit_changed tracepoint currently shows the raw bitmap value, requiring the user to consult the source file where the inhibit reasons are defined to decode the trace output. Co-developed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com> --- arch/x86/include/asm/kvm_host.h | 19 +++++++++++++++++++ arch/x86/kvm/trace.h | 9 +++++++-- arch/x86/kvm/x86.c | 4 ++++ 3 files changed, 30 insertions(+), 2 deletions(-)