diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 386d5b3a53dd53d566110432ff97e92c2f155e7e..3107ca1a64708caa9b3e8a235bc8509474b11980 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 5eff0c1f6ed4b6f64814454046c8877af960844a..24999cf559b4946a0408762653a873fc5d310f53 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 1f0d511bc0d9241612402b857da6986e6479d62f..568000858aa550ad61634a0e5ae8c0e3846a705b 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 4669c070d634fb7ab897c0bea6b2604ab756e2b3..5f0a48891abe8415cbe94cf39c870d820a87fd9e 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)