KVM: Add trace points in irqchip code
[cascardo/linux.git] / virt / kvm / irq_comm.c
index 08a9a49..001663f 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <linux/kvm_host.h>
+#include <trace/events/kvm.h>
 
 #include <asm/msidef.h>
 #ifdef CONFIG_IA64
@@ -68,10 +69,8 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
                        kvm_is_dm_lowest_prio(irq))
                printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n");
 
-       for (i = 0; i < KVM_MAX_VCPUS; i++) {
-               vcpu = kvm->vcpus[i];
-
-               if (!vcpu || !kvm_apic_present(vcpu))
+       kvm_for_each_vcpu(i, vcpu, kvm) {
+               if (!kvm_apic_present(vcpu))
                        continue;
 
                if (!kvm_apic_match_dest(vcpu, src, irq->shorthand,
@@ -101,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 &
@@ -127,6 +128,8 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level)
        unsigned long *irq_state, sig_level;
        int ret = -1;
 
+       trace_kvm_set_irq(irq, level, irq_source_id);
+
        WARN_ON(!mutex_is_locked(&kvm->irq_lock));
 
        if (irq < KVM_IOAPIC_NUM_PINS) {
@@ -138,7 +141,9 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level)
                else
                        clear_bit(irq_source_id, irq_state);
                sig_level = !!(*irq_state);
-       } else /* Deal with MSI/MSI-X */
+       } else if (!level)
+               return ret;
+       else /* Deal with MSI/MSI-X */
                sig_level = 1;
 
        /* Not possible to detect if the guest uses the PIC or the
@@ -163,6 +168,8 @@ void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin)
        struct hlist_node *n;
        unsigned gsi = pin;
 
+       trace_kvm_ack_irq(irqchip, pin);
+
        list_for_each_entry(e, &kvm->irq_routing, link)
                if (e->type == KVM_IRQ_ROUTING_IRQCHIP &&
                    e->irqchip.irqchip == irqchip &&