OSDN Git Service

KVM: s390: fixup I/O interrupt traces
authorChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 7 Jun 2016 07:37:17 +0000 (09:37 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 10 Jun 2016 10:07:26 +0000 (12:07 +0200)
We currently have two issues with the I/O  interrupt injection logging:
1. All QEMU versions up to 2.6 have a wrong encoding of device numbers
etc for the I/O interrupt type, so the inject VM_EVENT will have wrong
data. Let's fix this by using the interrupt parameters and not the
interrupt type number.
2. We only log in kvm_s390_inject_vm, but not when coming from
kvm_s390_reinject_io_int or from flic. Let's move the logging to the
common __inject_io function.

We also enhance the logging for delivery to match the data.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
arch/s390/kvm/interrupt.c

index 5a80af7..d72c4a8 100644 (file)
@@ -28,9 +28,6 @@
 #include "gaccess.h"
 #include "trace-s390.h"
 
-#define IOINT_SCHID_MASK 0x0000ffff
-#define IOINT_SSID_MASK 0x00030000
-#define IOINT_CSSID_MASK 0x03fc0000
 #define PFAULT_INIT 0x0600
 #define PFAULT_DONE 0x0680
 #define VIRTIO_PARAM 0x0d00
@@ -821,7 +818,14 @@ static int __must_check __deliver_io(struct kvm_vcpu *vcpu,
                                        struct kvm_s390_interrupt_info,
                                        list);
        if (inti) {
-               VCPU_EVENT(vcpu, 4, "deliver: I/O 0x%llx", inti->type);
+               if (inti->type & KVM_S390_INT_IO_AI_MASK)
+                       VCPU_EVENT(vcpu, 4, "%s", "deliver: I/O (AI)");
+               else
+                       VCPU_EVENT(vcpu, 4, "deliver: I/O %x ss %x schid %04x",
+                       inti->io.subchannel_id >> 8,
+                       inti->io.subchannel_id >> 1 & 0x3,
+                       inti->io.subchannel_nr);
+
                vcpu->stat.deliver_io_int++;
                trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id,
                                inti->type,
@@ -1415,6 +1419,13 @@ static int __inject_io(struct kvm *kvm, struct kvm_s390_interrupt_info *inti)
        }
        fi->counters[FIRQ_CNTR_IO] += 1;
 
+       if (inti->type & KVM_S390_INT_IO_AI_MASK)
+               VM_EVENT(kvm, 4, "%s", "inject: I/O (AI)");
+       else
+               VM_EVENT(kvm, 4, "inject: I/O %x ss %x schid %04x",
+                       inti->io.subchannel_id >> 8,
+                       inti->io.subchannel_id >> 1 & 0x3,
+                       inti->io.subchannel_nr);
        isc = int_word_to_isc(inti->io.io_int_word);
        list = &fi->lists[FIRQ_LIST_IO_ISC_0 + isc];
        list_add_tail(&inti->list, list);
@@ -1531,13 +1542,6 @@ int kvm_s390_inject_vm(struct kvm *kvm,
                inti->mchk.mcic = s390int->parm64;
                break;
        case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX:
-               if (inti->type & KVM_S390_INT_IO_AI_MASK)
-                       VM_EVENT(kvm, 5, "%s", "inject: I/O (AI)");
-               else
-                       VM_EVENT(kvm, 5, "inject: I/O css %x ss %x schid %04x",
-                                s390int->type & IOINT_CSSID_MASK,
-                                s390int->type & IOINT_SSID_MASK,
-                                s390int->type & IOINT_SCHID_MASK);
                inti->io.subchannel_id = s390int->parm >> 16;
                inti->io.subchannel_nr = s390int->parm & 0x0000ffffu;
                inti->io.io_int_parm = s390int->parm64 >> 32;