76daa3
From c4a89076814a915d3db4680df7138930d8d12ffb Mon Sep 17 00:00:00 2001
76daa3
From: Peter Xu <peterx@redhat.com>
76daa3
Date: Tue, 6 Jun 2017 06:57:31 +0200
76daa3
Subject: [PATCH 08/17] kvm: irqchip: skip update msi when disabled
76daa3
76daa3
RH-Author: Peter Xu <peterx@redhat.com>
76daa3
Message-id: <1496732251-27935-4-git-send-email-peterx@redhat.com>
76daa3
Patchwork-id: 75490
76daa3
O-Subject: [RHEL7.4 qemu-kvm-rhev PATCH 3/3] kvm: irqchip: skip update msi when disabled
76daa3
Bugzilla: 1448813
76daa3
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
76daa3
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
76daa3
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
76daa3
It's possible that one device kept its irqfd/virq there even when
76daa3
MSI/MSIX was disabled globally for that device. One example is
76daa3
virtio-net-pci (see commit f1d0f15a6 and virtio_pci_vq_vector_mask()).
76daa3
It is used as a fast path to avoid allocate/release irqfd/virq
76daa3
frequently when guest enables/disables MSIX.
76daa3
76daa3
However, this fast path brought a problem to msi_route_list, that the
76daa3
device MSIRouteEntry is still dangling there even if MSIX disabled -
76daa3
then we cannot know which message to fetch, even if we can, the messages
76daa3
are meaningless. In this case, we can just simply ignore this entry.
76daa3
76daa3
It's safe, since when MSIX is enabled again, we'll rebuild them no
76daa3
matter what.
76daa3
76daa3
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1448813
76daa3
76daa3
Signed-off-by: Peter Xu <peterx@redhat.com>
76daa3
Message-Id: <1494309644-18743-4-git-send-email-peterx@redhat.com>
76daa3
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
76daa3
(cherry picked from commit 207aa6d44ce2cbd2444eac9cea0d853a4265303e)
76daa3
Signed-off-by: Peter Xu <peterx@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
76daa3
Conflicts:
76daa3
  target/i386/kvm.c
76daa3
76daa3
The conflict is caused by missing of upstream commit 795c40b8
76daa3
("migration: Create migration/blocker.h"), which removed the include of
76daa3
"migration/migration.h" but introduced "migration/blocker.h".
76daa3
---
76daa3
 target/i386/kvm.c | 12 +++++++++---
76daa3
 1 file changed, 9 insertions(+), 3 deletions(-)
76daa3
76daa3
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
76daa3
index cfd7695..c3fae53 100644
76daa3
--- a/target/i386/kvm.c
76daa3
+++ b/target/i386/kvm.c
76daa3
@@ -43,6 +43,7 @@
76daa3
 #include "standard-headers/asm-x86/hyperv.h"
76daa3
 #include "hw/pci/pci.h"
76daa3
 #include "hw/pci/msi.h"
76daa3
+#include "hw/pci/msix.h"
76daa3
 #include "migration/migration.h"
76daa3
 #include "exec/memattrs.h"
76daa3
 #include "trace.h"
76daa3
@@ -3510,12 +3511,17 @@ static void kvm_update_msi_routes_all(void *private, bool global,
76daa3
     int cnt = 0;
76daa3
     MSIRouteEntry *entry;
76daa3
     MSIMessage msg;
76daa3
+    PCIDevice *dev;
76daa3
+
76daa3
     /* TODO: explicit route update */
76daa3
     QLIST_FOREACH(entry, &msi_route_list, list) {
76daa3
         cnt++;
76daa3
-        msg = pci_get_msi_message(entry->dev, entry->vector);
76daa3
-        kvm_irqchip_update_msi_route(kvm_state, entry->virq,
76daa3
-                                     msg, entry->dev);
76daa3
+        dev = entry->dev;
76daa3
+        if (!msix_enabled(dev) && !msi_enabled(dev)) {
76daa3
+            continue;
76daa3
+        }
76daa3
+        msg = pci_get_msi_message(dev, entry->vector);
76daa3
+        kvm_irqchip_update_msi_route(kvm_state, entry->virq, msg, dev);
76daa3
     }
76daa3
     kvm_irqchip_commit_routes(kvm_state);
76daa3
     trace_kvm_x86_update_msi_routes(cnt);
76daa3
-- 
76daa3
1.8.3.1
76daa3