KVM: x86: Print names of apicv inhibit reasons in traces
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. Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com> Reviewed-by: Vasant Hegde <vasant.hegde@amd.com> Link: https://lore.kernel.org/r/20240506225321.3440701-2-alejandro.j.jimenez@oracle.com Co-developed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
6fef518594
commit
69148ccec6
@ -1277,8 +1277,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;
|
||||
|
@ -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,
|
||||
|
@ -10037,6 +10037,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
|
||||
|
Loading…
Reference in New Issue
Block a user