diff mbox

[1/2] return available ioeventfds count in kvm_has_many_ioeventfds()

Message ID 20120313103539.8714.53454.stgit@dhcp-8-167.nay.redhat.com
State Not Applicable
Headers show

Commit Message

Amos Kong March 13, 2012, 10:35 a.m. UTC
Older kernels have a 6 device limit on the KVM io bus.
This patch makes kvm_has_many_ioeventfds() return available
ioeventfd count. ioeventfd will be disabled if there is
no 7 available ioeventfds.

Signed-off-by: Amos Kong <akong@redhat.com>
---
 hw/virtio-pci.c |    2 +-
 kvm-all.c       |    9 +++------
 2 files changed, 4 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index a0fb7c1..d63f303 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -678,7 +678,7 @@  void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev)
     pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
                      &proxy->bar);
 
-    if (!kvm_has_many_ioeventfds()) {
+    if (kvm_has_many_ioeventfds() != 7) {
         proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
     }
 
diff --git a/kvm-all.c b/kvm-all.c
index 3c6b4f0..d12694b 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -78,7 +78,6 @@  struct KVMState
     int pit_in_kernel;
     int pit_state2;
     int xsave, xcrs;
-    int many_ioeventfds;
     int irqchip_inject_ioctl;
 #ifdef KVM_CAP_IRQ_ROUTING
     struct kvm_irq_routing *irq_routes;
@@ -510,8 +509,8 @@  static int kvm_check_many_ioeventfds(void)
         }
     }
 
-    /* Decide whether many devices are supported or not */
-    ret = i == ARRAY_SIZE(ioeventfds);
+    /* If i equals to 7, many devices are supported */
+    ret = i;
 
     while (i-- > 0) {
         kvm_set_ioeventfd_pio_word(ioeventfds[i], 0, i, false);
@@ -1078,8 +1077,6 @@  int kvm_init(void)
     kvm_state = s;
     memory_listener_register(&kvm_memory_listener, NULL);
 
-    s->many_ioeventfds = kvm_check_many_ioeventfds();
-
     cpu_interrupt_handler = kvm_handle_interrupt;
 
     return 0;
@@ -1407,7 +1404,7 @@  int kvm_has_many_ioeventfds(void)
     if (!kvm_enabled()) {
         return 0;
     }
-    return kvm_state->many_ioeventfds;
+    return kvm_check_many_ioeventfds();
 }
 
 int kvm_has_gsi_routing(void)