[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 03/10] exec: Fix for qemu_ram_resize() callback
From: |
Shameer Kolothum |
Subject: |
[PATCH v3 03/10] exec: Fix for qemu_ram_resize() callback |
Date: |
Wed, 11 Mar 2020 17:20:07 +0000 |
From: David Hildenbrand <address@hidden>
Summarizing the issue:
1. Memory regions contain ram blocks with a different size, if the
size is not properly aligned. While memory regions can have an
unaligned size, ram blocks can't. This is true when creating
resizable memory region with an unaligned size.
2. When resizing a ram block/memory region, the size of the memory
region is set to the aligned size. The callback is called with
the aligned size. The unaligned piece is lost.
Because of the above, if ACPI blob length modifications happens
after the initial virt_acpi_build() call, and the changed blob
length is within the PAGE size boundary, then the revised size
is not seen by the firmware on Guest reboot.
Hence make sure callback is called if memory region size is changed,
irrespective of aligned or not.
Signed-off-by: David Hildenbrand <address@hidden>
[Shameer: added commit log]
Signed-off-by: Shameer Kolothum <address@hidden>
---
Please find the discussion here,
https://patchwork.kernel.org/patch/11339591/
---
exec.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/exec.c b/exec.c
index 0cc500d53a..f8974cd303 100644
--- a/exec.c
+++ b/exec.c
@@ -2073,11 +2073,21 @@ static int memory_try_enable_merging(void *addr, size_t
len)
*/
int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp)
{
+ const ram_addr_t unaligned_size = newsize;
+
assert(block);
newsize = HOST_PAGE_ALIGN(newsize);
if (block->used_length == newsize) {
+ /*
+ * We don't have to resize the ram block (which only knows aligned
+ * sizes), however, we have to notify if the unaligned size changed.
+ */
+ if (block->resized && unaligned_size != memory_region_size(block->mr))
{
+ block->resized(block->idstr, unaligned_size, block->host);
+ memory_region_set_size(block->mr, unaligned_size);
+ }
return 0;
}
@@ -2101,9 +2111,9 @@ int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize,
Error **errp)
block->used_length = newsize;
cpu_physical_memory_set_dirty_range(block->offset, block->used_length,
DIRTY_CLIENTS_ALL);
- memory_region_set_size(block->mr, newsize);
+ memory_region_set_size(block->mr, unaligned_size);
if (block->resized) {
- block->resized(block->idstr, newsize, block->host);
+ block->resized(block->idstr, unaligned_size, block->host);
}
return 0;
}
--
2.17.1
- Re: [PATCH v3 02/10] fw_cfg: Migrate ACPI table mr sizes separately, (continued)
Re: [PATCH v3 02/10] fw_cfg: Migrate ACPI table mr sizes separately, Igor Mammedov, 2020/03/23
[PATCH v3 04/10] hw/acpi/nvdimm: Fix for NVDIMM incorrect DSM output buffer length, Shameer Kolothum, 2020/03/11
[PATCH v3 03/10] exec: Fix for qemu_ram_resize() callback,
Shameer Kolothum <=
[PATCH v3 05/10] nvdimm: Use configurable ACPI IO base and size, Shameer Kolothum, 2020/03/11
[PATCH v3 06/10] hw/arm/virt: Add nvdimm hot-plug infrastructure, Shameer Kolothum, 2020/03/11
[PATCH v3 08/10] tests: Update ACPI tables list for upcoming arm/virt test changes, Shameer Kolothum, 2020/03/11
[PATCH v3 07/10] hw/arm/virt: Add nvdimm hotplug support, Shameer Kolothum, 2020/03/11
[PATCH v3 09/10] tests/bios-tables-test: Update arm/virt memhp test, Shameer Kolothum, 2020/03/11