Blame SOURCES/kvm-e1000e-Prevent-MSI-MSI-X-storms.patch

383d26
From 77782045cff9546feaf8863c0e7552343a488c6e Mon Sep 17 00:00:00 2001
383d26
From: Xiao Wang <jasowang@redhat.com>
383d26
Date: Thu, 16 Aug 2018 06:09:03 +0200
383d26
Subject: [PATCH 2/5] e1000e: Prevent MSI/MSI-X storms
383d26
383d26
RH-Author: Xiao Wang <jasowang@redhat.com>
383d26
Message-id: <1534399743-23973-3-git-send-email-jasowang@redhat.com>
383d26
Patchwork-id: 81849
383d26
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 2/2] e1000e: Prevent MSI/MSI-X storms
383d26
Bugzilla: 1596010
383d26
RH-Acked-by: wexu@redhat.com
383d26
RH-Acked-by: Thomas Huth <thuth@redhat.com>
383d26
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
383d26
383d26
From: Jan Kiszka <jan.kiszka@siemens.com>
383d26
383d26
Only signal MSI/MSI-X events on rising edges. So far we re-triggered the
383d26
interrupt sources even if the guest did no consumed the pending one,
383d26
easily causing interrupt storms.
383d26
383d26
Issue was observable with Linux 4.16 e1000e driver when MSI-X was used.
383d26
Vector 2 was causing interrupt storms after the driver activated the
383d26
device.
383d26
383d26
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
383d26
Signed-off-by: Jason Wang <jasowang@redhat.com>
383d26
(cherry picked from commit 4712c158c5276fd3c401152f4bb5c3fccf185946)
383d26
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
383d26
---
383d26
 hw/net/e1000e_core.c | 11 +++++++++++
383d26
 hw/net/e1000e_core.h |  2 ++
383d26
 2 files changed, 13 insertions(+)
383d26
383d26
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
383d26
index 9504891..2a221c2 100644
383d26
--- a/hw/net/e1000e_core.c
383d26
+++ b/hw/net/e1000e_core.c
383d26
@@ -2023,6 +2023,7 @@ e1000e_msix_notify_one(E1000ECore *core, uint32_t cause, uint32_t int_cfg)
383d26
     effective_eiac = core->mac[EIAC] & cause;
383d26
 
383d26
     core->mac[ICR] &= ~effective_eiac;
383d26
+    core->msi_causes_pending &= ~effective_eiac;
383d26
 
383d26
     if (!(core->mac[CTRL_EXT] & E1000_CTRL_EXT_IAME)) {
383d26
         core->mac[IMS] &= ~effective_eiac;
383d26
@@ -2119,6 +2120,13 @@ e1000e_send_msi(E1000ECore *core, bool msix)
383d26
 {
383d26
     uint32_t causes = core->mac[ICR] & core->mac[IMS] & ~E1000_ICR_ASSERTED;
383d26
 
383d26
+    core->msi_causes_pending &= causes;
383d26
+    causes ^= core->msi_causes_pending;
383d26
+    if (causes == 0) {
383d26
+        return;
383d26
+    }
383d26
+    core->msi_causes_pending |= causes;
383d26
+
383d26
     if (msix) {
383d26
         e1000e_msix_notify(core, causes);
383d26
     } else {
383d26
@@ -2156,6 +2164,9 @@ e1000e_update_interrupt_state(E1000ECore *core)
383d26
     core->mac[ICS] = core->mac[ICR];
383d26
 
383d26
     interrupts_pending = (core->mac[IMS] & core->mac[ICR]) ? true : false;
383d26
+    if (!interrupts_pending) {
383d26
+        core->msi_causes_pending = 0;
383d26
+    }
383d26
 
383d26
     trace_e1000e_irq_pending_interrupts(core->mac[ICR] & core->mac[IMS],
383d26
                                         core->mac[ICR], core->mac[IMS]);
383d26
diff --git a/hw/net/e1000e_core.h b/hw/net/e1000e_core.h
383d26
index 7d8ff41..63a1551 100644
383d26
--- a/hw/net/e1000e_core.h
383d26
+++ b/hw/net/e1000e_core.h
383d26
@@ -109,6 +109,8 @@ struct E1000Core {
383d26
     NICState *owner_nic;
383d26
     PCIDevice *owner;
383d26
     void (*owner_start_recv)(PCIDevice *d);
383d26
+
383d26
+    uint32_t msi_causes_pending;
383d26
 };
383d26
 
383d26
 void
383d26
-- 
383d26
1.8.3.1
383d26