We at most have VIRTIO_PCI_MAX_VQ entries for virt queue, VIRTIO_PCI_MAX_CONFIG entries for config. To quoto 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 Signed-off-by: Asias He <asias.hejun@xxxxxxxxx> --- 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 d6d98df..81196e5 100644 --- a/tools/kvm/include/kvm/virtio-pci.h +++ b/tools/kvm/include/kvm/virtio-pci.h @@ -5,7 +5,8 @@ #include <linux/types.h> -#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 fe3f746..17e570c 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 quoto 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 -- 1.7.7.1 -- 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