KVM: Add trace points in irqchip code
Gleb Natapov [Tue, 7 Jul 2009 13:00:57 +0000 (16:00 +0300)]
Add tracepoint in msi/ioapic/pic set_irq() functions,
in IPI sending and in the point where IRQ is placed into
apic's IRR.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>

arch/x86/kvm/i8259.c
arch/x86/kvm/lapic.c
arch/x86/kvm/trace.h
include/trace/events/kvm.h
virt/kvm/ioapic.c
virt/kvm/irq_comm.c

index 1d1bb75..e4bcbdd 100644 (file)
@@ -30,6 +30,7 @@
 #include "irq.h"
 
 #include <linux/kvm_host.h>
+#include "trace.h"
 
 static void pic_lock(struct kvm_pic *s)
        __acquires(&s->lock)
@@ -190,6 +191,8 @@ int kvm_pic_set_irq(void *opaque, int irq, int level)
        if (irq >= 0 && irq < PIC_NUM_PINS) {
                ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);
                pic_update_irq(s);
+               trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr,
+                                     s->pics[irq >> 3].imr, ret == 0);
        }
        pic_unlock(s);
 
index 6c84603..5d69760 100644 (file)
@@ -375,6 +375,8 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
                        break;
 
                result = !apic_test_and_set_irr(vector, apic);
+               trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode,
+                                         trig_mode, vector, result);
                if (!result) {
                        if (trig_mode)
                                apic_debug("level trig mode repeatedly for "
@@ -493,6 +495,8 @@ static void apic_send_ipi(struct kvm_lapic *apic)
        else
                irq.dest_id = GET_APIC_DEST_FIELD(icr_high);
 
+       trace_kvm_apic_ipi(icr_low, irq.dest_id);
+
        apic_debug("icr_high 0x%x, icr_low 0x%x, "
                   "short_hand 0x%x, dest 0x%x, trig_mode 0x%x, level 0x%x, "
                   "dest_mode 0x%x, delivery_mode 0x%x, vector 0x%x\n",
index 6c2c87f..0d480e7 100644 (file)
@@ -264,6 +264,91 @@ TRACE_EVENT(kvm_cr,
 #define trace_kvm_cr_read(cr, val)             trace_kvm_cr(0, cr, val)
 #define trace_kvm_cr_write(cr, val)            trace_kvm_cr(1, cr, val)
 
+TRACE_EVENT(kvm_pic_set_irq,
+           TP_PROTO(__u8 chip, __u8 pin, __u8 elcr, __u8 imr, bool coalesced),
+           TP_ARGS(chip, pin, elcr, imr, coalesced),
+
+       TP_STRUCT__entry(
+               __field(        __u8,           chip            )
+               __field(        __u8,           pin             )
+               __field(        __u8,           elcr            )
+               __field(        __u8,           imr             )
+               __field(        bool,           coalesced       )
+       ),
+
+       TP_fast_assign(
+               __entry->chip           = chip;
+               __entry->pin            = pin;
+               __entry->elcr           = elcr;
+               __entry->imr            = imr;
+               __entry->coalesced      = coalesced;
+       ),
+
+       TP_printk("chip %u pin %u (%s%s)%s",
+                 __entry->chip, __entry->pin,
+                 (__entry->elcr & (1 << __entry->pin)) ? "level":"edge",
+                 (__entry->imr & (1 << __entry->pin)) ? "|masked":"",
+                 __entry->coalesced ? " (coalesced)" : "")
+);
+
+#define kvm_apic_dst_shorthand         \
+       {0x0, "dst"},                   \
+       {0x1, "self"},                  \
+       {0x2, "all"},                   \
+       {0x3, "all-but-self"}
+
+TRACE_EVENT(kvm_apic_ipi,
+           TP_PROTO(__u32 icr_low, __u32 dest_id),
+           TP_ARGS(icr_low, dest_id),
+
+       TP_STRUCT__entry(
+               __field(        __u32,          icr_low         )
+               __field(        __u32,          dest_id         )
+       ),
+
+       TP_fast_assign(
+               __entry->icr_low        = icr_low;
+               __entry->dest_id        = dest_id;
+       ),
+
+       TP_printk("dst %x vec %u (%s|%s|%s|%s|%s)",
+                 __entry->dest_id, (u8)__entry->icr_low,
+                 __print_symbolic((__entry->icr_low >> 8 & 0x7),
+                                  kvm_deliver_mode),
+                 (__entry->icr_low & (1<<11)) ? "logical" : "physical",
+                 (__entry->icr_low & (1<<14)) ? "assert" : "de-assert",
+                 (__entry->icr_low & (1<<15)) ? "level" : "edge",
+                 __print_symbolic((__entry->icr_low >> 18 & 0x3),
+                                  kvm_apic_dst_shorthand))
+);
+
+TRACE_EVENT(kvm_apic_accept_irq,
+           TP_PROTO(__u32 apicid, __u16 dm, __u8 tm, __u8 vec, bool coalesced),
+           TP_ARGS(apicid, dm, tm, vec, coalesced),
+
+       TP_STRUCT__entry(
+               __field(        __u32,          apicid          )
+               __field(        __u16,          dm              )
+               __field(        __u8,           tm              )
+               __field(        __u8,           vec             )
+               __field(        bool,           coalesced       )
+       ),
+
+       TP_fast_assign(
+               __entry->apicid         = apicid;
+               __entry->dm             = dm;
+               __entry->tm             = tm;
+               __entry->vec            = vec;
+               __entry->coalesced      = coalesced;
+       ),
+
+       TP_printk("apicid %x vec %u (%s|%s)%s",
+                 __entry->apicid, __entry->vec,
+                 __print_symbolic((__entry->dm >> 8 & 0x7), kvm_deliver_mode),
+                 __entry->tm ? "level" : "edge",
+                 __entry->coalesced ? " (coalesced)" : "")
+);
+
 #endif /* _TRACE_KVM_H */
 
 /* This part must be outside protection */
index 77022af..dbe1084 100644 (file)
@@ -28,6 +28,62 @@ TRACE_EVENT(kvm_set_irq,
                  __entry->gsi, __entry->level, __entry->irq_source_id)
 );
 
+#define kvm_deliver_mode               \
+       {0x0, "Fixed"},                 \
+       {0x1, "LowPrio"},               \
+       {0x2, "SMI"},                   \
+       {0x3, "Res3"},                  \
+       {0x4, "NMI"},                   \
+       {0x5, "INIT"},                  \
+       {0x6, "SIPI"},                  \
+       {0x7, "ExtINT"}
+
+TRACE_EVENT(kvm_ioapic_set_irq,
+           TP_PROTO(__u64 e, int pin, bool coalesced),
+           TP_ARGS(e, pin, coalesced),
+
+       TP_STRUCT__entry(
+               __field(        __u64,          e               )
+               __field(        int,            pin             )
+               __field(        bool,           coalesced       )
+       ),
+
+       TP_fast_assign(
+               __entry->e              = e;
+               __entry->pin            = pin;
+               __entry->coalesced      = coalesced;
+       ),
+
+       TP_printk("pin %u dst %x vec=%u (%s|%s|%s%s)%s",
+                 __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e,
+                 __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),
+                 (__entry->e & (1<<11)) ? "logical" : "physical",
+                 (__entry->e & (1<<15)) ? "level" : "edge",
+                 (__entry->e & (1<<16)) ? "|masked" : "",
+                 __entry->coalesced ? " (coalesced)" : "")
+);
+
+TRACE_EVENT(kvm_msi_set_irq,
+           TP_PROTO(__u64 address, __u64 data),
+           TP_ARGS(address, data),
+
+       TP_STRUCT__entry(
+               __field(        __u64,          address         )
+               __field(        __u64,          data            )
+       ),
+
+       TP_fast_assign(
+               __entry->address        = address;
+               __entry->data           = data;
+       ),
+
+       TP_printk("dst %u vec %x (%s|%s|%s%s)",
+                 (u8)(__entry->address >> 12), (u8)__entry->data,
+                 __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode),
+                 (__entry->address & (1<<2)) ? "logical" : "physical",
+                 (__entry->data & (1<<15)) ? "level" : "edge",
+                 (__entry->address & (1<<3)) ? "|rh" : "")
+);
 
 #define kvm_irqchips                                           \
        {KVM_IRQCHIP_PIC_MASTER,        "PIC master"},          \
index 92496ff..b91fbb2 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/current.h>
+#include <trace/events/kvm.h>
 
 #include "ioapic.h"
 #include "lapic.h"
@@ -193,6 +194,7 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level)
                            (!edge && !entry.fields.remote_irr))
                                ret = ioapic_service(ioapic, irq);
                }
+               trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0);
        }
        return ret;
 }
index a9d7fd1..001663f 100644 (file)
@@ -100,6 +100,8 @@ static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
 {
        struct kvm_lapic_irq irq;
 
+       trace_kvm_msi_set_irq(e->msi.address_lo, e->msi.data);
+
        irq.dest_id = (e->msi.address_lo &
                        MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
        irq.vector = (e->msi.data &