qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 1/4] kvm: let split be optional for kvm_arch_irqchip


From: Peter Xu
Subject: [Qemu-devel] [PATCH 1/4] kvm: let split be optional for kvm_arch_irqchip_create
Date: Wed, 19 Dec 2018 16:50:35 +0800

This patch allows the kvm_arch_irqchip_create() to return 0 if the
split irqchip is specified but not forced by the user.  Also, modify
kvm_irqchip_create() similiarly.

This patch should have no functional change for existing code since
currently if split is specified it must be forced by the user so we'll
always have machine_kernel_irqchip_required() returns true. However it
could potentially be used in follow up patches when we want to turn
split kernel irqchip as default for QEMU 4.0 which could trigger the
case that kernel_irqchip_required=N while kernel_irqchip_split=Y. When
with that, we'll first try with split irqchip, and falls back to
normal kernel irqchip when split capability is not provided by the
kernel.

This brings us benefit that we can even run a default QEMU 4.0 on old
kernels that does not support split irqchip (<4.4) but at the same
time enable split irqchip for new kernels (>=4.4) as default.

Signed-off-by: Peter Xu <address@hidden>
---
 accel/kvm/kvm-all.c | 3 ++-
 target/i386/kvm.c   | 6 +++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 4880a05399..b008364041 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -1468,7 +1468,8 @@ static void kvm_irqchip_create(MachineState *machine, 
KVMState *s)
      * in-kernel irqchip for us */
     ret = kvm_arch_irqchip_create(machine, s);
     if (ret == 0) {
-        if (machine_kernel_irqchip_split(machine)) {
+        if (machine_kernel_irqchip_required(machine) &&
+            machine_kernel_irqchip_split(machine)) {
             perror("Split IRQ chip mode not supported.");
             exit(1);
         } else {
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 739cf8c8ea..8f919f8f9f 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -3685,9 +3685,9 @@ int kvm_arch_irqchip_create(MachineState *ms, KVMState *s)
     if (machine_kernel_irqchip_split(ms)) {
         ret = kvm_vm_enable_cap(s, KVM_CAP_SPLIT_IRQCHIP, 0, 24);
         if (ret) {
-            error_report("Could not enable split irqchip mode: %s",
-                         strerror(-ret));
-            exit(1);
+            assert(ret < 0);
+            /* If split not required, return 0 instead to retry */
+            return machine_kernel_irqchip_required(ms) ? ret : 0;
         } else {
             DPRINTF("Enabled KVM_CAP_SPLIT_IRQCHIP\n");
             kvm_split_irqchip = true;
-- 
2.17.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]