KVM: s390: fixup I/O interrupt traces
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>
This commit is contained in:
Родитель
1bb78d161f
Коммит
dcc98ea614
|
@ -28,9 +28,6 @@
|
||||||
#include "gaccess.h"
|
#include "gaccess.h"
|
||||||
#include "trace-s390.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_INIT 0x0600
|
||||||
#define PFAULT_DONE 0x0680
|
#define PFAULT_DONE 0x0680
|
||||||
#define VIRTIO_PARAM 0x0d00
|
#define VIRTIO_PARAM 0x0d00
|
||||||
|
@ -821,7 +818,14 @@ static int __must_check __deliver_io(struct kvm_vcpu *vcpu,
|
||||||
struct kvm_s390_interrupt_info,
|
struct kvm_s390_interrupt_info,
|
||||||
list);
|
list);
|
||||||
if (inti) {
|
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++;
|
vcpu->stat.deliver_io_int++;
|
||||||
trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id,
|
trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id,
|
||||||
inti->type,
|
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;
|
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);
|
isc = int_word_to_isc(inti->io.io_int_word);
|
||||||
list = &fi->lists[FIRQ_LIST_IO_ISC_0 + isc];
|
list = &fi->lists[FIRQ_LIST_IO_ISC_0 + isc];
|
||||||
list_add_tail(&inti->list, list);
|
list_add_tail(&inti->list, list);
|
||||||
|
@ -1531,13 +1542,6 @@ int kvm_s390_inject_vm(struct kvm *kvm,
|
||||||
inti->mchk.mcic = s390int->parm64;
|
inti->mchk.mcic = s390int->parm64;
|
||||||
break;
|
break;
|
||||||
case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX:
|
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_id = s390int->parm >> 16;
|
||||||
inti->io.subchannel_nr = s390int->parm & 0x0000ffffu;
|
inti->io.subchannel_nr = s390int->parm & 0x0000ffffu;
|
||||||
inti->io.io_int_parm = s390int->parm64 >> 32;
|
inti->io.io_int_parm = s390int->parm64 >> 32;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче