26ba25
From c39a8362df8c09b9c66bb9c5295dc26373244fed Mon Sep 17 00:00:00 2001
26ba25
From: David Hildenbrand <david@redhat.com>
26ba25
Date: Mon, 26 Nov 2018 09:57:34 +0000
26ba25
Subject: [PATCH 35/35] pc-dimm: turn alignment assert into check
26ba25
26ba25
RH-Author: David Hildenbrand <david@redhat.com>
26ba25
Message-id: <20181126095734.30666-1-david@redhat.com>
26ba25
Patchwork-id: 83163
26ba25
O-Subject: [RHEL-8.0 qemu-kvm PATCH] pc-dimm: turn alignment assert into check
26ba25
Bugzilla: 1630116
26ba25
RH-Acked-by: Pankaj Gupta <pagupta@redhat.com>
26ba25
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
26ba25
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
26ba25
26ba25
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1630116
26ba25
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=19276337
26ba25
Upstream: 4d8938a05db15dea2c86c4ab9c5f872f160d2188
26ba25
Branch: rhel8/master-2.12.0
26ba25
26ba25
The start of the address space indicates which maximum alignment is
26ba25
supported by our machine (e.g. ppc, x86 1GB). This is helpful to
26ba25
catch fragmenting guest physical memory in strange fashions.
26ba25
26ba25
Right now we can crash QEMU by e.g. (there might be easier examples)
26ba25
26ba25
qemu-system-x86_64 -m 256M,maxmem=20G,slots=2 \
26ba25
 -object memory-backend-file,id=mem0,size=8192M,mem-path=/dev/zero,align=8192M \
26ba25
 -device pc-dimm,id=dimm1,memdev=mem0
26ba25
26ba25
Backport conflicts:
26ba25
    hw/mem/memory-device.c: The memory device refactoring is part of 3.0,
26ba25
                            so fix it in previous pc-dimm code.
26ba25
Note: The upstream patch missed a "x" (0% .. vs. 0x% ..), which was
26ba25
      fixed in 7c63ba2055a0 ("memory-device: fix alignment error message"),
26ba25
      however as this is not a clean cherry pick, I'm fixing it right
26ba25
      away (like in the RHEL7.6 backport).
26ba25
26ba25
Signed-off-by: David Hildenbrand <david@redhat.com>
26ba25
Message-Id: <20180607154705.6316-2-david@redhat.com>
26ba25
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
26ba25
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
26ba25
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
26ba25
(cherry picked from commit 4d8938a05db15dea2c86c4ab9c5f872f160d2188)
26ba25
Signed-off-by: David Hildenbrand <david@redhat.com>
26ba25
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
26ba25
---
26ba25
 hw/mem/pc-dimm.c | 9 +++++++--
26ba25
 1 file changed, 7 insertions(+), 2 deletions(-)
26ba25
26ba25
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
26ba25
index 51350d9..a9d7c51 100644
26ba25
--- a/hw/mem/pc-dimm.c
26ba25
+++ b/hw/mem/pc-dimm.c
26ba25
@@ -298,14 +298,19 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
26ba25
     uint64_t new_addr, ret = 0;
26ba25
     uint64_t address_space_end = address_space_start + address_space_size;
26ba25
 
26ba25
-    g_assert(QEMU_ALIGN_UP(address_space_start, align) == address_space_start);
26ba25
-
26ba25
     if (!address_space_size) {
26ba25
         error_setg(errp, "memory hotplug is not enabled, "
26ba25
                          "please add maxmem option");
26ba25
         goto out;
26ba25
     }
26ba25
 
26ba25
+    /* address_space_start indicates the maximum alignment we expect */
26ba25
+    if (QEMU_ALIGN_UP(address_space_start, align) != address_space_start) {
26ba25
+        error_setg(errp, "the alignment (0x%" PRIx64 ") is not supported",
26ba25
+                   align);
26ba25
+        goto out;
26ba25
+    }
26ba25
+
26ba25
     if (hint && QEMU_ALIGN_UP(*hint, align) != *hint) {
26ba25
         error_setg(errp, "address must be aligned to 0x%" PRIx64 " bytes",
26ba25
                    align);
26ba25
-- 
26ba25
1.8.3.1
26ba25