Encapsulate the ugly check if MSI-X assignment is supported in a separate helper function. Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> --- hw/device-assignment.c | 5 +---- target-i386/kvm.c | 7 +++++++ target-i386/kvm_i386.h | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 1d0af34..80ac2fc 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1283,10 +1283,7 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev) } /* Expose MSI-X capability */ pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSIX, 0); - /* Would really like to test kvm_check_extension(, KVM_CAP_DEVICE_MSIX), - * but the kernel doesn't expose it. Instead do a dummy call to - * KVM_ASSIGN_SET_MSIX_NR to see if it exists. */ - if (pos != 0 && kvm_assign_set_msix_nr(kvm_state, NULL) == -EFAULT) { + if (pos != 0 && kvm_device_msix_supported(kvm_state)) { int bar_nr; uint32_t msix_table_entry; diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 04d1c7d..677a791 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -2154,6 +2154,13 @@ int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id) KVM_DEV_IRQ_HOST_MSI); } +bool kvm_device_msix_supported(KVMState *s) +{ + /* The kernel lacks a corresponding KVM_CAP, so we probe by calling + * KVM_ASSIGN_SET_MSIX_NR with an invalid parameter. */ + return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, NULL) == -EFAULT; +} + int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id) { return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_MSIX | diff --git a/target-i386/kvm_i386.h b/target-i386/kvm_i386.h index e827f5b..6f66b6d 100644 --- a/target-i386/kvm_i386.h +++ b/target-i386/kvm_i386.h @@ -27,6 +27,7 @@ int kvm_device_intx_deassign(KVMState *s, uint32_t dev_id, bool use_host_msi); int kvm_device_msi_assign(KVMState *s, uint32_t dev_id, int virq); int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id); +bool kvm_device_msix_supported(KVMState *s); int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id); #endif -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html