Skip to content

Commit

Permalink
Memory: Only call ramblock_ptr when needed in qemu_ram_writeback
Browse files Browse the repository at this point in the history
It is possible that a ramblock doesn't have memory that QEMU can
access, this is the case with the Xen hypervisor.

In order to avoid to trigger an assert, only call ramblock_ptr() when
needed in qemu_ram_writeback(). This should fix migration of Xen
guests that was broken with bd108a4 ("migration: ram: Switch to
ram block writeback").

Signed-off-by: Anthony PERARD <[email protected]>
Reviewed-by: Juan Quintela <[email protected]>
Acked-by: Paolo Bonzini <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
anthonyper-ctx committed Feb 27, 2020
1 parent 32d0b7b commit 5d4c954
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -2116,14 +2116,13 @@ int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp)
*/
void qemu_ram_writeback(RAMBlock *block, ram_addr_t start, ram_addr_t length)
{
void *addr = ramblock_ptr(block, start);

/* The requested range should fit in within the block range */
g_assert((start + length) <= block->used_length);

#ifdef CONFIG_LIBPMEM
/* The lack of support for pmem should not block the sync */
if (ramblock_is_pmem(block)) {
void *addr = ramblock_ptr(block, start);
pmem_persist(addr, length);
return;
}
Expand All @@ -2134,6 +2133,7 @@ void qemu_ram_writeback(RAMBlock *block, ram_addr_t start, ram_addr_t length)
* specified as persistent (or is not one) - use the msync.
* Less optimal but still achieves the same goal
*/
void *addr = ramblock_ptr(block, start);
if (qemu_msync(addr, length, block->fd)) {
warn_report("%s: failed to sync memory range: start: "
RAM_ADDR_FMT " length: " RAM_ADDR_FMT,
Expand Down

0 comments on commit 5d4c954

Please sign in to comment.