From 77060db6b083715ec28115248c1b0effe429281e Mon Sep 17 00:00:00 2001 From: Asias He Date: Thu, 27 Oct 2011 21:14:33 +0800 Subject: [PATCH] kvm tools: Fix MSI-X table size set up We at most have VIRTIO_PCI_MAX_VQ entries for virt queue, VIRTIO_PCI_MAX_CONFIG entries for config. To quote the PCI spec: System software reads this field to determine the MSI-X Table Size N, which is encoded as N-1. For example, a returned value of "00000000011" indicates a table size of 4. So, we should set table size to VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG - 1 not VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG Acked-by: Sasha Levin Signed-off-by: Asias He Signed-off-by: Pekka Enberg --- tools/kvm/include/kvm/virtio-pci.h | 5 +++-- tools/kvm/virtio/pci.c | 13 ++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/kvm/include/kvm/virtio-pci.h b/tools/kvm/include/kvm/virtio-pci.h index d6d98df01ad4..81196e53b89d 100644 --- a/tools/kvm/include/kvm/virtio-pci.h +++ b/tools/kvm/include/kvm/virtio-pci.h @@ -5,7 +5,8 @@ #include -#define VIRTIO_PCI_MAX_VQ 3 +#define VIRTIO_PCI_MAX_VQ 3 +#define VIRTIO_PCI_MAX_CONFIG 1 struct kvm; @@ -44,7 +45,7 @@ struct virtio_pci { u32 msix_io_block; u32 msix_pba_block; u64 msix_pba; - struct msix_table msix_table[VIRTIO_PCI_MAX_VQ + 1]; + struct msix_table msix_table[VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG]; /* virtio queue */ u16 queue_selector; diff --git a/tools/kvm/virtio/pci.c b/tools/kvm/virtio/pci.c index fe3f74698273..b8d1ec1b33cd 100644 --- a/tools/kvm/virtio/pci.c +++ b/tools/kvm/virtio/pci.c @@ -287,7 +287,18 @@ int virtio_pci__init(struct kvm *kvm, struct virtio_pci *vpci, void *dev, vpci->pci_hdr.msix.cap = PCI_CAP_ID_MSIX; vpci->pci_hdr.msix.next = 0; - vpci->pci_hdr.msix.ctrl = (VIRTIO_PCI_MAX_VQ + 1); + /* + * We at most have VIRTIO_PCI_MAX_VQ entries for virt queue, + * VIRTIO_PCI_MAX_CONFIG entries for config. + * + * To quote the PCI spec: + * + * System software reads this field to determine the + * MSI-X Table Size N, which is encoded as N-1. + * For example, a returned value of "00000000011" + * indicates a table size of 4. + */ + vpci->pci_hdr.msix.ctrl = (VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG - 1); /* * Both table and PBA could be mapped on the same BAR, but for now -- 2.39.5