[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 1/4] ivshmem: Don't update non-existent MSI route
From: |
Ladi Prosek |
Subject: |
[Qemu-devel] [PATCH v3 1/4] ivshmem: Don't update non-existent MSI routes |
Date: |
Fri, 8 Dec 2017 08:45:12 +0100 |
As of commit 660c97eef6f8 ("ivshmem: use kvm irqfd for msi notifications"),
QEMU crashes with:
kvm_irqchip_commit_routes: Assertion `ret == 0' failed.
if the ivshmem device is configured with more vectors than what the server
supports. This is caused by the ivshmem_vector_unmask() being called on
vectors that have not been initialized by ivshmem_add_kvm_msi_virq().
This commit fixes it by adding a simple check to the mask and unmask
callbacks.
Note that the opposite mismatch, if the server supplies more vectors than
what the device is configured for, is already handled and leads to output
like:
Too many eventfd received, device has 1 vectors
To reproduce the assert, run:
ivshmem-server -n 0
and QEMU with:
-device ivshmem-doorbell,chardev=iv
-chardev socket,path=/tmp/ivshmem_socket,id=iv
then load the Windows driver, at the time of writing available at:
https://github.com/virtio-win/kvm-guest-drivers-windows/tree/master/ivshmem
The issue is believed to have been masked by other guest drivers, notably
Linux ones, not enabling MSI-X on the device.
Fixes: 660c97eef6f8 ("ivshmem: use kvm irqfd for msi notifications")
Signed-off-by: Ladi Prosek <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Reviewed-by: Markus Armbruster <address@hidden>
---
hw/misc/ivshmem.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index a5a46827fe..6e46669744 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -317,6 +317,10 @@ static int ivshmem_vector_unmask(PCIDevice *dev, unsigned
vector,
int ret;
IVSHMEM_DPRINTF("vector unmask %p %d\n", dev, vector);
+ if (!v->pdev) {
+ error_report("ivshmem: vector %d route does not exist", vector);
+ return -EINVAL;
+ }
ret = kvm_irqchip_update_msi_route(kvm_state, v->virq, msg, dev);
if (ret < 0) {
@@ -331,12 +335,16 @@ static void ivshmem_vector_mask(PCIDevice *dev, unsigned
vector)
{
IVShmemState *s = IVSHMEM_COMMON(dev);
EventNotifier *n = &s->peers[s->vm_id].eventfds[vector];
+ MSIVector *v = &s->msi_vectors[vector];
int ret;
IVSHMEM_DPRINTF("vector mask %p %d\n", dev, vector);
+ if (!v->pdev) {
+ error_report("ivshmem: vector %d route does not exist", vector);
+ return;
+ }
- ret = kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, n,
- s->msi_vectors[vector].virq);
+ ret = kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, n, v->virq);
if (ret != 0) {
error_report("remove_irqfd_notifier_gsi failed");
}
--
2.13.6
- [Qemu-devel] [PATCH v3 0/4] ivshmem: MSI bug fixes, Ladi Prosek, 2017/12/08
- [Qemu-devel] [PATCH v3 1/4] ivshmem: Don't update non-existent MSI routes,
Ladi Prosek <=
- [Qemu-devel] [PATCH v3 2/4] ivshmem: Always remove irqfd notifiers, Ladi Prosek, 2017/12/08
- [Qemu-devel] [PATCH v3 3/4] ivshmem: Improve MSI irqfd error handling, Ladi Prosek, 2017/12/08
- [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Ladi Prosek, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Markus Armbruster, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Ladi Prosek, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Eric Blake, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Markus Armbruster, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Ladi Prosek, 2017/12/08
- Re: [Qemu-devel] [PATCH v3 4/4] ivshmem: Disable irqfd on device reset, Markus Armbruster, 2017/12/09