[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/10] s390x/kvm: inject via flic
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL 10/10] s390x/kvm: inject via flic |
Date: |
Tue, 10 Jun 2014 10:08:24 +0200 |
Try to inject floating interrupts via the flic if it is available.
This allows us to inject the full range of floating interrupts.
Reviewed-by: Jens Freimann <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
hw/intc/s390_flic_kvm.c | 10 ++++++++++
target-s390x/cpu.h | 1 +
target-s390x/kvm.c | 19 ++++++++++++++++++-
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index a734094..b471e7a 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -117,6 +117,16 @@ static int flic_enqueue_irqs(void *buf, uint64_t len,
return rc ? -errno : 0;
}
+int kvm_s390_inject_flic(struct kvm_s390_irq *irq)
+{
+ static KVMS390FLICState *flic;
+
+ if (unlikely(!flic)) {
+ flic = KVM_S390_FLIC(s390_get_flic());
+ }
+ return flic_enqueue_irqs(irq, sizeof(*irq), flic);
+}
+
/**
* __get_all_irqs - store all pending irqs in buffer
* @flic: pointer to flic device state
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
index 9982c35..b13761d 100644
--- a/target-s390x/cpu.h
+++ b/target-s390x/cpu.h
@@ -365,6 +365,7 @@ void kvm_s390_virtio_irq(int config_change, uint64_t token);
void kvm_s390_service_interrupt(uint32_t parm);
void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq);
void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq);
+int kvm_s390_inject_flic(struct kvm_s390_irq *irq);
#else
static inline void kvm_s390_reset_vcpu(S390CPU *cpu)
{
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index a2133ff..a1a4cc2 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -623,7 +623,7 @@ void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct
kvm_s390_irq *irq)
}
}
-void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
+static void __kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
{
struct kvm_s390_interrupt kvmint = {};
int r;
@@ -641,6 +641,23 @@ void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
}
}
+void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
+{
+ static bool use_flic = true;
+ int r;
+
+ if (use_flic) {
+ r = kvm_s390_inject_flic(irq);
+ if (r == -ENOSYS) {
+ use_flic = false;
+ }
+ if (!r) {
+ return;
+ }
+ }
+ __kvm_s390_floating_interrupt(irq);
+}
+
void kvm_s390_virtio_irq(int config_change, uint64_t token)
{
struct kvm_s390_irq irq = {
--
1.7.9.5
- [Qemu-devel] [PULL 00/10] s390 patches, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 02/10] s390x/kvm: make flic play well with old kernels, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 01/10] s390x/css: handle emw correctly for tsch, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 05/10] s390x/kvm: Log unmanageable program interruptions, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 03/10] s390x/kvm: enable/reset cmma via vm attributes, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 04/10] s390x/kvm: Log unmanageable external interruptions, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 06/10] s390/virtio-ccw: migration support, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 07/10] s390x: consolidate floating interrupts, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 08/10] s390x/kvm: add alternative injection interface, Cornelia Huck, 2014/06/10
- [Qemu-devel] [PULL 10/10] s390x/kvm: inject via flic,
Cornelia Huck <=
- [Qemu-devel] [PULL 09/10] s390x: cleanup interrupt injection, Cornelia Huck, 2014/06/10
- Re: [Qemu-devel] [PULL 00/10] s390 patches, Peter Maydell, 2014/06/10