accel/accel-irq: add generic begin_route_changes
A generic accel_irqchip_begin_route_change() fn has been introduced for usage in the MSHV accelerator. It replaces the respective kvm_ fn. Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> Link: https://lore.kernel.org/r/20260417105618.3621-6-magnuskulke@linux.microsoft.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Magnus Kulke committed
Apr 17, 2026 at 12:55 UTC
49b2dcbd2422b4039ef4e566b212950dc5e7d211
7 files changed
+30
-14
accel/accel-irq.c
+21
@@ -10,6 +10,7 @@
10
*/
11
12
#include "qemu/osdep.h"
13
+#include "qemu/error-report.h"
14
#include "hw/pci/msi.h"
15
16
#include "system/kvm.h"
@@ -104,3 +105,23 @@ int accel_irqchip_remove_irqfd_notifier_gsi(EventNotifier *n, int virq)
105
}
106
return -ENOSYS;
107
}
108
+
109
+inline AccelRouteChange accel_irqchip_begin_route_changes(void)
110
+{
111
+#ifdef CONFIG_MSHV_IS_POSSIBLE
112
+ if (mshv_msi_via_irqfd_enabled()) {
113
+ return (AccelRouteChange) {
114
+ .accel = ACCEL(mshv_state),
115
+ .changes = 0,
116
+ };
117
+ }
118
+#endif
119
+ if (kvm_enabled()) {
120
+ return (AccelRouteChange) {
121
+ .accel = ACCEL(kvm_state),
122
+ .changes = 0,
123
+ };
124
+ }
125
+ error_report("can't initiate route change, no accel irqchip available");
126
+ abort();
127
+}
hw/misc/ivshmem-pci.c
+2
-2
@@ -26,7 +26,7 @@
26
#include "hw/core/qdev-properties-system.h"
27
#include "hw/pci/msi.h"
28
#include "hw/pci/msix.h"
29
-#include "system/kvm.h"
29
+#include "system/accel-irq.h"
30
#include "migration/blocker.h"
31
#include "migration/vmstate.h"
32
#include "qemu/error-report.h"
@@ -430,7 +430,7 @@ static void ivshmem_add_kvm_msi_virq(IVShmemState *s, int vector,
430
IVSHMEM_DPRINTF("ivshmem_add_kvm_msi_virq vector:%d\n", vector);
431
assert(!s->msi_vectors[vector].pdev);
432
433
- c = kvm_irqchip_begin_route_changes(kvm_state);
433
+ c = accel_irqchip_begin_route_changes();
434
ret = kvm_irqchip_add_msi_route(&c, vector, pdev);
435
if (ret < 0) {
436
error_setg(errp, "kvm_irqchip_add_msi_route failed");
hw/vfio/pci.c
+3
-2
@@ -38,6 +38,7 @@
38
#include "qemu/module.h"
39
#include "qemu/range.h"
40
#include "qemu/units.h"
41
+#include "system/accel-irq.h"
42
#include "system/kvm.h"
43
#include "system/runstate.h"
44
#include "pci.h"
@@ -688,7 +689,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
689
if (vdev->defer_kvm_irq_routing) {
690
vfio_pci_add_kvm_msi_virq(vdev, vector, nr, true);
691
} else {
691
- vfio_route_change = kvm_irqchip_begin_route_changes(kvm_state);
692
+ vfio_route_change = accel_irqchip_begin_route_changes();
693
vfio_pci_add_kvm_msi_virq(vdev, vector, nr, true);
694
kvm_irqchip_commit_route_changes(&vfio_route_change);
695
vfio_connect_kvm_msi_virq(vector, nr);
@@ -789,7 +790,7 @@ void vfio_pci_prepare_kvm_msi_virq_batch(VFIOPCIDevice *vdev)
790
{
791
assert(!vdev->defer_kvm_irq_routing);
792
vdev->defer_kvm_irq_routing = true;
792
- vfio_route_change = kvm_irqchip_begin_route_changes(kvm_state);
793
+ vfio_route_change = accel_irqchip_begin_route_changes();
794
}
795
796
void vfio_pci_commit_kvm_msi_virq_batch(VFIOPCIDevice *vdev)
hw/virtio/virtio-pci.c
+1
-1
@@ -869,7 +869,7 @@ static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,
869
int ret;
870
871
if (irqfd->users == 0) {
872
- AccelRouteChange c = kvm_irqchip_begin_route_changes(kvm_state);
872
+ AccelRouteChange c = accel_irqchip_begin_route_changes();
873
ret = accel_irqchip_add_msi_route(&c, vector, &proxy->pci_dev);
874
if (ret < 0) {
875
return ret;
include/system/accel-irq.h
+1
@@ -25,6 +25,7 @@ static inline bool accel_irqchip_is_split(void)
25
return mshv_msi_via_irqfd_enabled() || kvm_irqchip_is_split();
26
}
27
28
+AccelRouteChange accel_irqchip_begin_route_changes(void);
29
int accel_irqchip_add_msi_route(AccelRouteChange *c, int vector,
30
PCIDevice *dev);
31
int accel_irqchip_update_msi_route(int vector, MSIMessage msg, PCIDevice *dev);
include/system/kvm.h
-8
@@ -476,14 +476,6 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
476
PCIDevice *dev);
477
void kvm_irqchip_commit_routes(KVMState *s);
478
479
-static inline AccelRouteChange kvm_irqchip_begin_route_changes(KVMState *s)
480
-{
481
- return (AccelRouteChange) {
482
- .accel = ACCEL(s),
483
- .changes = 0,
484
- };
485
-}
486
-
479
static inline void kvm_irqchip_commit_route_changes(AccelRouteChange *c)
480
{
481
if (c->changes) {
target/i386/kvm/kvm.c
+2
-1
@@ -32,6 +32,7 @@
32
#include "vmsr_energy.h"
33
#include "system/system.h"
34
#include "system/hw_accel.h"
35
+#include "system/accel-irq.h"
36
#include "system/kvm_int.h"
37
#include "system/runstate.h"
38
#include "system/ramblock.h"
@@ -6678,7 +6679,7 @@ void kvm_arch_init_irq_routing(KVMState *s)
6679
kvm_gsi_routing_allowed = true;
6680
6681
if (kvm_irqchip_is_split()) {
6681
- AccelRouteChange c = kvm_irqchip_begin_route_changes(s);
6682
+ AccelRouteChange c = accel_irqchip_begin_route_changes();
6683
int i;
6684
6685
/* If the ioapic is in QEMU and the lapics are in KVM, reserve