@samitouri / QOSamiQemu / commits / afa63fc0e3

accel/kvm: return early from kvm_irqchip_create if kvm does not support irqchip

During refactoring of kvm_irqchip_create(), the refactored code was returning early from do_kvm_irqchip_create() function if the required essential capabilities were not present in KVM. This was not translating to an early return from kvm_irqchip_create() as was the case before refactoring. This is because, do_kvm_irqchip_create() did not have a means to notify the caller of the lack of required kvm capabilities. Fix this by making do_notify_irqchip_create() return EOPNOTSUPP error when capabilities are absent and then the caller can check the return code and return early. Due to this regression during refactoring, all KVM guests on ppc64le hang immediately during startup and this completely breaks all functionality on that platform. Fixes: 98884e0cc1 ("accel/kvm: add changes required to support KVM VM file descriptor change") Message-ID: <20260413090010.60339-1-anisinha@redhat.com> Reported-by: Misbah Anjum N <misanjum@linux.ibm.com> Reported-by: Gautam Menghani <gautam@linux.ibm.com> Tested-by: Misbah Anjum N <misanjum@linux.ibm.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Ani Sinha <anisinha@redhat.com> Message-id: 20260414045911.63662-1-anisinha@redhat.com Suggested-by: Fabiano Rosas <farosas@suse.de> Suggested-by: Harsh Prateek Bora <harshpb@linux.ibm.com> Tested-by: Misbah Anjum N <misanjum@linux.ibm.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Ani Sinha <anisinha@redhat.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Ani Sinha committed Apr 14, 2026 at 10:29 UTC afa63fc0e3497b222812eae97e6e5c35cfc9c851
1 file changed +8 -3
accel/kvm/kvm-all.c
+8 -3
@@ -2575,7 +2575,7 @@ void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi)
2575 g_hash_table_insert(s->gsimap, irq, GINT_TO_POINTER(gsi));
2576 }
2577
2578 -static void do_kvm_irqchip_create(KVMState *s)
2578 +static int do_kvm_irqchip_create(KVMState *s)
2579 {
2580 int ret;
2581 if (kvm_check_extension(s, KVM_CAP_IRQCHIP)) {
@@ -2587,7 +2587,7 @@ static void do_kvm_irqchip_create(KVMState *s)
2587 exit(1);
2588 }
2589 } else {
2590 - return;
2590 + return -EOPNOTSUPP;
2591 }
2592
2593 if (kvm_check_extension(s, KVM_CAP_IRQFD) <= 0) {
@@ -2610,13 +2610,17 @@ static void do_kvm_irqchip_create(KVMState *s)
2610 fprintf(stderr, "Create kernel irqchip failed: %s\n", strerror(-ret));
2611 exit(1);
2612 }
2613 +
2614 + return 0;
2615 }
2616
2617 static void kvm_irqchip_create(KVMState *s)
2618 {
2619 assert(s->kernel_irqchip_split != ON_OFF_AUTO_AUTO);
2620
2619 - do_kvm_irqchip_create(s);
2621 + if (do_kvm_irqchip_create(s) < 0) {
2622 + return;
2623 + }
2624 kvm_kernel_irqchip = true;
2625 /* If we have an in-kernel IRQ chip then we must have asynchronous
2626 * interrupt delivery (though the reverse is not necessarily true)
@@ -2835,6 +2839,7 @@ static int kvm_reset_vmfd(MachineState *ms)
2839 }
2840
2841 if (s->kernel_irqchip_allowed) {
2842 + /* ignore return from this function */
2843 do_kvm_irqchip_create(s);
2844 }
2845