[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 01/18] migration: Fix non-multiple of page size migra
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PULL 01/18] migration: Fix non-multiple of page size migration |
Date: |
Thu, 18 May 2017 19:24:45 +0200 |
From: "Dr. David Alan Gilbert" <address@hidden>
Unfortunately it's legal to create a VM with a RAM size that's
not a multiple of the underlying host page or huge page size.
Recently I'd changed things to always send host sized pages,
and that breaks if we have say a 1025MB guest on 2MB hugepages.
Unfortunately we can't just make that illegal since it would break
migration from/to existing oddly configured VMs.
Symptom: qemu-system-x86_64: Illegal RAM offset 40100000
as it transmits the fraction of the hugepage after the end
of the RAMBlock (may also cause a crash on the source
- possibly due to clearing bits after the bitmap)
Reported-by: Yumei Huang <address@hidden>
Red Hat bug: https://bugzilla.redhat.com/show_bug.cgi?id=1449037
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
migration/ram.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/migration/ram.c b/migration/ram.c
index f59fdd4..59459ef 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1312,6 +1312,8 @@ static int ram_save_target_page(RAMState *rs,
PageSearchStatus *pss,
* a host page in which case the remainder of the hostpage is sent.
* Only dirty target pages are sent. Note that the host page size may
* be a huge page for this block.
+ * The saving stops at the boundary of the used_length of the block
+ * if the RAMBlock isn't a multiple of the host page size.
*
* Returns the number of pages written or negative on error
*
@@ -1335,7 +1337,8 @@ static int ram_save_host_page(RAMState *rs,
PageSearchStatus *pss,
pages += tmppages;
pss->page++;
- } while (pss->page & (pagesize_bits - 1));
+ } while ((pss->page & (pagesize_bits - 1)) &&
+ offset_in_ramblock(pss->block, pss->page << TARGET_PAGE_BITS));
/* The offset we leave with is the last one we looked at */
pss->page--;
--
2.9.3
- [Qemu-devel] [PULL 00/18] Migration pull request, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 01/18] migration: Fix non-multiple of page size migration,
Juan Quintela <=
- [Qemu-devel] [PULL 02/18] postcopy: Require RAMBlocks that are whole pages, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 03/18] hmp: Use visitor api for hmp_migrate_set_parameter(), Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 04/18] migration: Create block capability, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 05/18] migration: Remove use of old MigrationParams, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 06/18] migration: Remove old MigrationParams, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 07/18] block migration: Allow compile time disable, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 08/18] migration: Create migration/xbzrle.h, Juan Quintela, 2017/05/18
- [Qemu-devel] [PULL 09/18] migration: Split migration/channel.c for channel operations, Juan Quintela, 2017/05/18
- Re: [Qemu-devel] [PULL 00/18] Migration pull request, Stefan Hajnoczi, 2017/05/19