yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
76daa3
From 7b3c2e676cd62e947e9b020bba9309a171e94c9e Mon Sep 17 00:00:00 2001
76daa3
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
76daa3
Date: Thu, 9 Feb 2017 13:06:18 +0100
76daa3
Subject: migcompat/e1000e: Work around 7.3 msi/intr_state field
76daa3
76daa3
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
76daa3
Message-id: <20170209130618.20328-1-dgilbert@redhat.com>
76daa3
Patchwork-id: 73730
76daa3
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH 1/1] migcompat/e1000e: Work around 7.3 msi/intr_state field
76daa3
Bugzilla: 1420216
76daa3
RH-Acked-by: Thomas Huth <thuth@redhat.com>
76daa3
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
76daa3
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
76daa3
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
76daa3
76daa3
bz: https://bugzilla.redhat.com/show_bug.cgi?id=1420216
76daa3
brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=12518741
76daa3
upstream: No, fixing downstream inconsistency
76daa3
76daa3
Our 7.3 e1000e model has an 'intr_state' field that's used
76daa3
only in the cleanup of msi & msix.
76daa3
76daa3
e1000e was introducing in 2.7 but was backported to the 2.6 based
76daa3
qemu-kvm-rhev 7.3 by backporting 6f3fbe4 and 103916.
76daa3
76daa3
During the 2.7rc's the migration structure was changed by
76daa3
e0af5a0e8 and 66bf7d but we never pulled those into 7.3 which
76daa3
removed the 'intr_state' field.
76daa3
76daa3
For compatibility add the field back (guarded by a property on 7.3)
76daa3
and populate the values based on the source MSI state.
76daa3
Since the flags were only used for cleanup I don't think
76daa3
we need to pay attention to the value we receive.
76daa3
76daa3
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
(cherry picked from commit 4ed53cd6a385c6dca4a088cf406d03165d17c28d)
76daa3
(cherry picked from commit ee177ab97e10a60746ec59032d83aa5bd1a26445)
76daa3
---
76daa3
 hw/net/e1000e.c     | 21 +++++++++++++++++++++
76daa3
 include/hw/compat.h |  4 ++++
76daa3
 2 files changed, 25 insertions(+)
76daa3
76daa3
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
76daa3
index e849f79..f36f211 100644
76daa3
--- a/hw/net/e1000e.c
76daa3
+++ b/hw/net/e1000e.c
76daa3
@@ -73,6 +73,11 @@ typedef struct E1000EState {
76daa3
 
76daa3
     E1000ECore core;
76daa3
 
76daa3
+    /* 7.3 had the intr_state field that was in the original e1000e code
76daa3
+     * but that was removed prior to 2.7's release
76daa3
+     */
76daa3
+    bool redhat_7_3_intr_state_enable;
76daa3
+    uint32_t redhat_7_3_intr_state;
76daa3
 } E1000EState;
76daa3
 
76daa3
 #define E1000E_MMIO_IDX     0
76daa3
@@ -88,6 +93,10 @@ typedef struct E1000EState {
76daa3
 #define E1000E_MSIX_TABLE   (0x0000)
76daa3
 #define E1000E_MSIX_PBA     (0x2000)
76daa3
 
76daa3
+/* Values as in RHEL 7.3 build and original upstream */
76daa3
+#define RH_E1000E_USE_MSI     BIT(0)
76daa3
+#define RH_E1000E_USE_MSIX    BIT(1)
76daa3
+
76daa3
 static uint64_t
76daa3
 e1000e_mmio_read(void *opaque, hwaddr addr, unsigned size)
76daa3
 {
76daa3
@@ -299,6 +308,8 @@ e1000e_init_msix(E1000EState *s)
76daa3
     } else {
76daa3
         if (!e1000e_use_msix_vectors(s, E1000E_MSIX_VEC_NUM)) {
76daa3
             msix_uninit(d, &s->msix, &s->msix);
76daa3
+        } else {
76daa3
+            s->redhat_7_3_intr_state |= RH_E1000E_USE_MSIX;
76daa3
         }
76daa3
     }
76daa3
 }
76daa3
@@ -465,6 +476,8 @@ static void e1000e_pci_realize(PCIDevice *pci_dev, Error **errp)
76daa3
     ret = msi_init(PCI_DEVICE(s), 0xD0, 1, true, false, NULL);
76daa3
     if (ret) {
76daa3
         trace_e1000e_msi_init_fail(ret);
76daa3
+    } else {
76daa3
+        s->redhat_7_3_intr_state |= RH_E1000E_USE_MSI;
76daa3
     }
76daa3
 
76daa3
     if (e1000e_add_pm_capability(pci_dev, e1000e_pmrb_offset,
76daa3
@@ -586,6 +599,11 @@ static const VMStateDescription e1000e_vmstate_intr_timer = {
76daa3
     VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0,                           \
76daa3
                          e1000e_vmstate_intr_timer, E1000IntrDelayTimer)
76daa3
 
76daa3
+static bool rhel_7_3_check(void *opaque, int version_id)
76daa3
+{
76daa3
+    return ((E1000EState *)opaque)->redhat_7_3_intr_state_enable;
76daa3
+}
76daa3
+
76daa3
 static const VMStateDescription e1000e_vmstate = {
76daa3
     .name = "e1000e",
76daa3
     .version_id = 1,
76daa3
@@ -597,6 +615,7 @@ static const VMStateDescription e1000e_vmstate = {
76daa3
         VMSTATE_MSIX(parent_obj, E1000EState),
76daa3
 
76daa3
         VMSTATE_UINT32(ioaddr, E1000EState),
76daa3
+        VMSTATE_UINT32_TEST(redhat_7_3_intr_state, E1000EState, rhel_7_3_check),
76daa3
         VMSTATE_UINT32(core.rxbuf_min_shift, E1000EState),
76daa3
         VMSTATE_UINT8(core.rx_desc_len, E1000EState),
76daa3
         VMSTATE_UINT32_ARRAY(core.rxbuf_sizes, E1000EState,
76daa3
@@ -645,6 +664,8 @@ static PropertyInfo e1000e_prop_disable_vnet,
76daa3
 
76daa3
 static Property e1000e_properties[] = {
76daa3
     DEFINE_NIC_PROPERTIES(E1000EState, conf),
76daa3
+    DEFINE_PROP_BOOL("__redhat_e1000e_7_3_intr_state", E1000EState,
76daa3
+                        redhat_7_3_intr_state_enable, false),
76daa3
     DEFINE_PROP_DEFAULT("disable_vnet_hdr", E1000EState, disable_vnet, false,
76daa3
                         e1000e_prop_disable_vnet, bool),
76daa3
     DEFINE_PROP_DEFAULT("subsys_ven", E1000EState, subsys_ven,
76daa3
diff --git a/include/hw/compat.h b/include/hw/compat.h
76daa3
index 6f64306..66320b5 100644
76daa3
--- a/include/hw/compat.h
76daa3
+++ b/include/hw/compat.h
76daa3
@@ -324,6 +324,10 @@
76daa3
         .driver   = "virtio-pci",\
76daa3
         .property = "x-ignore-backend-features",\
76daa3
         .value    = "on",\
76daa3
+    },{ /* HW_COMPAT_RHEL7_3 */ \
76daa3
+        .driver   = "e1000e",\
76daa3
+        .property = "__redhat_e1000e_7_3_intr_state",\
76daa3
+        .value    = "on",\
76daa3
     },
76daa3
 
76daa3
 #endif /* HW_COMPAT_H */
76daa3
-- 
76daa3
1.8.3.1
76daa3