From b6bff10a7af29ddbf863f1bc7956acc8b156f7d5 Mon Sep 17 00:00:00 2001 From: xiangzixuan Date: Thu, 18 Dec 2025 15:53:52 +0800 Subject: [PATCH] ub: check kvm_usi_via_irqfd when set kvm interrupt check if kvm_usi_via_irqfd enabled before set kvm interrupt Signed-off-by: xiangzixuan --- accel/kvm/kvm-all.c | 2 ++ hw/ub/ub_ummu.c | 5 +++++ hw/vfio/ub.c | 7 ++++++- include/sysemu/kvm.h | 11 +++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 386d5b3a53d..3107ca1a647 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -112,6 +112,7 @@ bool kvm_readonly_mem_allowed; bool kvm_vm_attributes_allowed; bool kvm_msi_use_devid; bool kvm_csv3_allowed; +bool kvm_usi_via_irqfd_allowed; static bool kvm_has_guest_debug; static int kvm_sstep_flags; static bool kvm_immediate_exit; @@ -2421,6 +2422,7 @@ static void kvm_irqchip_create(KVMState *s) */ kvm_async_interrupts_allowed = true; kvm_halt_in_kernel_allowed = true; + kvm_usi_via_irqfd_allowed = true; kvm_init_irq_routing(s); diff --git a/hw/ub/ub_ummu.c b/hw/ub/ub_ummu.c index 5eff0c1f6ed..24999cf559b 100644 --- a/hw/ub/ub_ummu.c +++ b/hw/ub/ub_ummu.c @@ -919,6 +919,11 @@ static void ummu_glb_int_enable(UMMUState *u, UMMUUSIVectorType type) USIMessage msg; uint32_t interrupt_id = UMMU_INTERRUPT_ID; + if (!kvm_usi_via_irqfd_enabled()) { + qemu_log("kvm usi via irqfd disabled.\n"); + return; + } + if (type == UMMU_USI_VECTOR_EVETQ) { msg = ummu_get_eventq_usi_message(u); } else { diff --git a/hw/vfio/ub.c b/hw/vfio/ub.c index 1f0d511bc0d..568000858aa 100644 --- a/hw/vfio/ub.c +++ b/hw/vfio/ub.c @@ -521,6 +521,11 @@ static int vfio_usi_vector_do_use(UBDevice *udev, uint16_t nr, USIMessage *msg, int ret; Error *err = NULL; + if (!kvm_usi_via_irqfd_enabled()) { + qemu_log("kvm usi via irqfd disabled.\n"); + return 0; + } + vector = &vdev->usi_vectors[nr]; if (!vector->use) { vfio_vector_init(vdev, nr); @@ -1283,4 +1288,4 @@ static void register_vfio_ub_dev_types(void) type_register_static(&vfio_ub_dev_info); } -type_init(register_vfio_ub_dev_types) \ No newline at end of file +type_init(register_vfio_ub_dev_types) diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 4669c070d63..5f0a48891ab 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -40,6 +40,7 @@ extern bool kvm_async_interrupts_allowed; extern bool kvm_halt_in_kernel_allowed; extern bool kvm_resamplefds_allowed; extern bool kvm_msi_via_irqfd_allowed; +extern bool kvm_usi_via_irqfd_allowed; extern bool kvm_gsi_routing_allowed; extern bool kvm_gsi_direct_mapping; extern bool kvm_readonly_mem_allowed; @@ -109,6 +110,15 @@ extern bool kvm_csv3_allowed; */ #define kvm_resamplefds_enabled() (kvm_resamplefds_allowed) +/** + * kvm_usi_via_irqfd_enabled: + * + * Returns: true if we can route a USI (UB Signaled Interrupt) + * to a KVM CPU via an irqfd. This requires that the kernel supports + * this and that we're running in a configuration that permits it. + */ +#define kvm_usi_via_irqfd_enabled() (kvm_usi_via_irqfd_allowed) + /** * kvm_msi_via_irqfd_enabled: * @@ -174,6 +184,7 @@ extern bool kvm_csv3_allowed; #define kvm_irqfds_enabled() (false) #define kvm_resamplefds_enabled() (false) #define kvm_msi_via_irqfd_enabled() (false) +#define kvm_usi_via_irqfd_enabled() (false) #define kvm_gsi_routing_allowed() (false) #define kvm_gsi_direct_mapping() (false) #define kvm_readonly_mem_enabled() (false) -- Gitee