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 <levinsasha928@gmail.com>
Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
#include <linux/types.h>
-#define VIRTIO_PCI_MAX_VQ 3
+#define VIRTIO_PCI_MAX_VQ 3
+#define VIRTIO_PCI_MAX_CONFIG 1
struct kvm;
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;
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