From dd68c78e38f16fe4342fbb6977e6a41349c468fd Mon Sep 17 00:00:00 2001
Message-Id: <dd68c78e38f16fe4342fbb6977e6a41349c468fd.1444668695.git.jen@redhat.com>
In-Reply-To: <860bcb286a4f0cfcc02e2d5c16c2c94f85fddf12.1444668695.git.jen@redhat.com>
References: <860bcb286a4f0cfcc02e2d5c16c2c94f85fddf12.1444668695.git.jen@redhat.com>
From: Igor Mammedov <imammedo@redhat.com>
Date: Wed, 30 Sep 2015 14:22:57 -0500
Subject: [CHANGE 02/11] pc: memhp: force gaps between DIMM's GPA
To: rhvirt-patches@redhat.com,
    jen@redhat.com

RH-Author: Igor Mammedov <imammedo@redhat.com>
Message-id: <1443622977-168115-3-git-send-email-imammedo@redhat.com>
Patchwork-id: 68012
O-Subject: [RHEL7.2 qemu-kvm-rhev PATCH 2/2] pc: memhp: force gaps between DIMM's GPA
Bugzilla: 1267533
RH-Acked-by: Radim Krcmar <rkrcmar@redhat.com>
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
RH-Acked-by: Andrew Jones <drjones@redhat.com>

mapping DIMMs non contiguously allows to workaround
virtio bug reported earlier:
http://lists.nongnu.org/archive/html/qemu-devel/2015-08/msg00522.html
in this case guest kernel doesn't allocate buffers
that can cross DIMM boundary keeping each buffer
local to a DIMM.

Suggested-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>

(cherry picked from PCI tree commit
  7bd536baae1ce501d3cbb9f7cc4cddf68e2db62e
  pc: memhp: force gaps between DIMM's GPA
)
upstream commit: aa8580cddf011e8cedcf87f7a0fdea7549fc4704
Trivial conflicts due rhel vs upstream machine types difference:
  hw/i386/pc_piix.c
  hw/i386/pc_piix.c

Signed-off-by: Jeff E. Nelson <jen@redhat.com>
---
 hw/i386/pc.c         | 6 ++++--
 hw/i386/pc_piix.c    | 1 +
 hw/i386/pc_q35.c     | 1 +
 include/hw/i386/pc.h | 1 +
 4 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 8477b5e..a60bcb5 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1686,6 +1686,7 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
     HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     PCDIMMDevice *dimm = PC_DIMM(dev);
     PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
@@ -1701,8 +1702,8 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
         goto out;
     }
 
-    pc_dimm_memory_plug(dev, &pcms->hotplug_memory, mr, align, false,
-                        &local_err);
+    pc_dimm_memory_plug(dev, &pcms->hotplug_memory, mr, align,
+                        pcmc->inter_dimm_gap, &local_err);
     if (local_err) {
         goto out;
     }
@@ -1952,6 +1953,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     PCMachineClass *pcmc = PC_MACHINE_CLASS(oc);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
+    pcmc->inter_dimm_gap = true;
     pcmc->get_hotplug_handler = mc->get_hotplug_handler;
     mc->get_hotplug_handler = pc_get_hotpug_handler;
     mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 61669bf..4efd8c7 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -1082,6 +1082,7 @@ static void pc_compat_rhel710(MachineState *machine)
 
     /* From pc_i440fx_2_4_machine_options */
     pcmc->broken_reserved_end = true;
+    pcmc->inter_dimm_gap = false;
 }
 
 static void pc_init_rhel710(MachineState *machine)
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 1ad706d..c2c2e9f 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -600,6 +600,7 @@ static void pc_q35_compat_rhel710(MachineState *machine)
 
     /* From pc_q35_2_4_machine_options */
     pcmc->broken_reserved_end = true;
+    pcmc->inter_dimm_gap = false;
 }
 
 static void pc_q35_init_rhel710(MachineState *machine)
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index e7361ba..8482c3a 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -56,6 +56,7 @@ struct PCMachineClass {
 
     /*< public >*/
     bool broken_reserved_end;
+    bool inter_dimm_gap;
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                            DeviceState *dev);
 };
-- 
2.4.3

