From dd68c78e38f16fe4342fbb6977e6a41349c468fd Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: <860bcb286a4f0cfcc02e2d5c16c2c94f85fddf12.1444668695.git.jen@redhat.com> References: <860bcb286a4f0cfcc02e2d5c16c2c94f85fddf12.1444668695.git.jen@redhat.com> From: Igor Mammedov 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 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 RH-Acked-by: Eduardo Habkost RH-Acked-by: Andrew Jones 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 Signed-off-by: Igor Mammedov Acked-by: Eduardo Habkost Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin Signed-off-by: Igor Mammedov (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 --- 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