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

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