* [PULL 0/4] Migration patches for 2025-03-14
@ 2025-03-14 14:48 Fabiano Rosas
2025-03-14 14:48 ` [PULL 1/4] migration: cpr_is_incoming Fabiano Rosas
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Fabiano Rosas @ 2025-03-14 14:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu
The following changes since commit 0462a32b4f63b2448b4a196381138afd50719dc4:
Merge tag 'for-upstream' of https://repo.or.cz/qemu/kevin into staging (2025-03-14 09:31:13 +0800)
are available in the Git repository at:
https://gitlab.com/farosas/qemu.git tags/migration-20250314-pull-request
for you to fetch changes up to 8ffe0623a1f40803feb4280fce13549baa4b0b47:
hw/qxl: fix cpr (2025-03-14 09:29:20 -0300)
----------------------------------------------------------------
Migration pull request
Fixes for cpr-transfer (live update functionality).
----------------------------------------------------------------
Steve Sistare (4):
migration: cpr_is_incoming
pflash: fix cpr
hw/loader: fix roms during cpr
hw/qxl: fix cpr
hw/block/block.c | 5 +++++
hw/core/loader.c | 5 ++++-
hw/display/qxl.c | 27 ++++++++++++++++++++++++---
include/migration/cpr.h | 1 +
migration/cpr.c | 5 +++++
5 files changed, 39 insertions(+), 4 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PULL 1/4] migration: cpr_is_incoming
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
@ 2025-03-14 14:48 ` Fabiano Rosas
2025-03-14 14:48 ` [PULL 2/4] pflash: fix cpr Fabiano Rosas
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Fabiano Rosas @ 2025-03-14 14:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Steve Sistare
From: Steve Sistare <steven.sistare@oracle.com>
Define the cpr_is_incoming helper, to be used in several cpr fix patches.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <1741380954-341079-2-git-send-email-steven.sistare@oracle.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
include/migration/cpr.h | 1 +
migration/cpr.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/migration/cpr.h b/include/migration/cpr.h
index 3a6deb7933..7561fc75ad 100644
--- a/include/migration/cpr.h
+++ b/include/migration/cpr.h
@@ -21,6 +21,7 @@ int cpr_find_fd(const char *name, int id);
MigMode cpr_get_incoming_mode(void);
void cpr_set_incoming_mode(MigMode mode);
+bool cpr_is_incoming(void);
int cpr_state_save(MigrationChannel *channel, Error **errp);
int cpr_state_load(MigrationChannel *channel, Error **errp);
diff --git a/migration/cpr.c b/migration/cpr.c
index 180faab247..42c46563e5 100644
--- a/migration/cpr.c
+++ b/migration/cpr.c
@@ -128,6 +128,11 @@ void cpr_set_incoming_mode(MigMode mode)
incoming_mode = mode;
}
+bool cpr_is_incoming(void)
+{
+ return incoming_mode != MIG_MODE_NONE;
+}
+
int cpr_state_save(MigrationChannel *channel, Error **errp)
{
int ret;
--
2.35.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PULL 2/4] pflash: fix cpr
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
2025-03-14 14:48 ` [PULL 1/4] migration: cpr_is_incoming Fabiano Rosas
@ 2025-03-14 14:48 ` Fabiano Rosas
2025-03-14 14:48 ` [PULL 3/4] hw/loader: fix roms during cpr Fabiano Rosas
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Fabiano Rosas @ 2025-03-14 14:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Steve Sistare
From: Steve Sistare <steven.sistare@oracle.com>
During normal migration, new QEMU creates and initializes memory regions,
then loads the preserved contents of the region from vmstate.
During CPR, memory regions are preserved in place, then the realize
method initializes the regions contents, losing the old contents. To
fix, skip the re-init during CPR.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <1741380954-341079-3-git-send-email-steven.sistare@oracle.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
hw/block/block.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/hw/block/block.c b/hw/block/block.c
index 1d405e02bf..2e10611d95 100644
--- a/hw/block/block.c
+++ b/hw/block/block.c
@@ -12,6 +12,7 @@
#include "system/blockdev.h"
#include "system/block-backend.h"
#include "hw/block/block.h"
+#include "migration/cpr.h"
#include "qapi/error.h"
#include "qapi/qapi-types-block.h"
@@ -66,6 +67,10 @@ bool blk_check_size_and_read_all(BlockBackend *blk, DeviceState *dev,
int ret;
g_autofree char *dev_id = NULL;
+ if (cpr_is_incoming()) {
+ return true;
+ }
+
blk_len = blk_getlength(blk);
if (blk_len < 0) {
error_setg_errno(errp, -blk_len,
--
2.35.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PULL 3/4] hw/loader: fix roms during cpr
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
2025-03-14 14:48 ` [PULL 1/4] migration: cpr_is_incoming Fabiano Rosas
2025-03-14 14:48 ` [PULL 2/4] pflash: fix cpr Fabiano Rosas
@ 2025-03-14 14:48 ` Fabiano Rosas
2025-03-14 14:48 ` [PULL 4/4] hw/qxl: fix cpr Fabiano Rosas
2025-03-16 10:10 ` [PULL 0/4] Migration patches for 2025-03-14 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Fabiano Rosas @ 2025-03-14 14:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Steve Sistare
From: Steve Sistare <steven.sistare@oracle.com>
During normal migration, new QEMU creates and initializes memory regions,
then loads the preserved contents of the region from vmstate.
During CPR, memory regions are preserved in place, then the realize
method initializes the regions contents, losing the old contents. To
fix, skip the re-init during CPR.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <1741380954-341079-4-git-send-email-steven.sistare@oracle.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
hw/core/loader.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/hw/core/loader.c b/hw/core/loader.c
index 332b879a0b..ce6ff1b52e 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -51,6 +51,7 @@
#include "trace.h"
#include "hw/hw.h"
#include "disas/disas.h"
+#include "migration/cpr.h"
#include "migration/vmstate.h"
#include "monitor/monitor.h"
#include "system/reset.h"
@@ -1029,7 +1030,9 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name, bool ro)
vmstate_register_ram_global(rom->mr);
data = memory_region_get_ram_ptr(rom->mr);
- memcpy(data, rom->data, rom->datasize);
+ if (!cpr_is_incoming()) {
+ memcpy(data, rom->data, rom->datasize);
+ }
return data;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PULL 4/4] hw/qxl: fix cpr
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
` (2 preceding siblings ...)
2025-03-14 14:48 ` [PULL 3/4] hw/loader: fix roms during cpr Fabiano Rosas
@ 2025-03-14 14:48 ` Fabiano Rosas
2025-03-16 10:10 ` [PULL 0/4] Migration patches for 2025-03-14 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Fabiano Rosas @ 2025-03-14 14:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Steve Sistare, andrey.drobyshev
From: Steve Sistare <steven.sistare@oracle.com>
During normal migration, new QEMU creates and initializes memory regions,
then loads the preserved contents of the region from vmstate.
During CPR, memory regions are preserved in place, then the realize
method initializes the regions contents, losing the old contents. To
fix, skip writes to the qxl memory regions during CPR load.
Reported-by: andrey.drobyshev@virtuozzo.com
Tested-by: andrey.drobyshev@virtuozzo.com
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <1741380954-341079-5-git-send-email-steven.sistare@oracle.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
hw/display/qxl.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index 2efdc77e61..da14da5209 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -30,6 +30,7 @@
#include "qemu/module.h"
#include "hw/qdev-properties.h"
#include "system/runstate.h"
+#include "migration/cpr.h"
#include "migration/vmstate.h"
#include "trace.h"
@@ -333,6 +334,10 @@ static void init_qxl_rom(PCIQXLDevice *d)
uint32_t fb;
int i, n;
+ if (cpr_is_incoming()) {
+ goto skip_init;
+ }
+
memset(rom, 0, d->rom_size);
rom->magic = cpu_to_le32(QXL_ROM_MAGIC);
@@ -390,6 +395,7 @@ static void init_qxl_rom(PCIQXLDevice *d)
sizeof(rom->client_monitors_config));
}
+skip_init:
d->shadow_rom = *rom;
d->rom = rom;
d->modes = modes;
@@ -403,6 +409,9 @@ static void init_qxl_ram(PCIQXLDevice *d)
buf = d->vga.vram_ptr;
d->ram = (QXLRam *)(buf + le32_to_cpu(d->shadow_rom.ram_header_offset));
+ if (cpr_is_incoming()) {
+ return;
+ }
d->ram->magic = cpu_to_le32(QXL_RAM_MAGIC);
d->ram->int_pending = cpu_to_le32(0);
d->ram->int_mask = cpu_to_le32(0);
@@ -539,6 +548,10 @@ static void interface_set_compression_level(QXLInstance *sin, int level)
trace_qxl_interface_set_compression_level(qxl->id, level);
qxl->shadow_rom.compression_level = cpu_to_le32(level);
+ if (cpr_is_incoming()) {
+ assert(qxl->rom->compression_level == cpu_to_le32(level));
+ return;
+ }
qxl->rom->compression_level = cpu_to_le32(level);
qxl_rom_set_dirty(qxl);
}
@@ -997,7 +1010,8 @@ static void interface_set_client_capabilities(QXLInstance *sin,
}
if (runstate_check(RUN_STATE_INMIGRATE) ||
- runstate_check(RUN_STATE_POSTMIGRATE)) {
+ runstate_check(RUN_STATE_POSTMIGRATE) ||
+ cpr_is_incoming()) {
return;
}
@@ -1200,6 +1214,10 @@ static void qxl_reset_state(PCIQXLDevice *d)
{
QXLRom *rom = d->rom;
+ if (cpr_is_incoming()) {
+ return;
+ }
+
qxl_check_state(d);
d->shadow_rom.update_id = cpu_to_le32(0);
*rom = d->shadow_rom;
@@ -1370,8 +1388,11 @@ static int qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
memslot.virt_start = virt_start + (guest_start - pci_start);
memslot.virt_end = virt_start + (guest_end - pci_start);
memslot.addr_delta = memslot.virt_start - delta;
- memslot.generation = d->rom->slot_generation = 0;
- qxl_rom_set_dirty(d);
+ if (!cpr_is_incoming()) {
+ d->rom->slot_generation = 0;
+ qxl_rom_set_dirty(d);
+ }
+ memslot.generation = d->rom->slot_generation;
qemu_spice_add_memslot(&d->ssd, &memslot, async);
d->guest_slots[slot_id].mr = mr;
--
2.35.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PULL 0/4] Migration patches for 2025-03-14
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
` (3 preceding siblings ...)
2025-03-14 14:48 ` [PULL 4/4] hw/qxl: fix cpr Fabiano Rosas
@ 2025-03-16 10:10 ` Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2025-03-16 10:10 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel, Peter Xu
[-- Attachment #1: Type: text/plain, Size: 116 bytes --]
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/10.0 for any user-visible changes.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-03-17 12:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-14 14:48 [PULL 0/4] Migration patches for 2025-03-14 Fabiano Rosas
2025-03-14 14:48 ` [PULL 1/4] migration: cpr_is_incoming Fabiano Rosas
2025-03-14 14:48 ` [PULL 2/4] pflash: fix cpr Fabiano Rosas
2025-03-14 14:48 ` [PULL 3/4] hw/loader: fix roms during cpr Fabiano Rosas
2025-03-14 14:48 ` [PULL 4/4] hw/qxl: fix cpr Fabiano Rosas
2025-03-16 10:10 ` [PULL 0/4] Migration patches for 2025-03-14 Stefan Hajnoczi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).