Message ID | f8f0ebb7-0c79-8570-3210-dc45c3effda8@univention.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Mar 20, 2017 at 01:02:10PM +0100, Philipp Hahn wrote: > Hello Marcelo, cc:qemu, > > Sorry for re-using this old thread, but I have a problem loading some > saved state from qemu-kvm-1.1.2, which fails for piix4_pm. > > You following patch was committed as > <http://git.qemu-project.org/?p=qemu.git;a=commitdiff;h=b0b873a07872f7ab7f66f259c73fb9dd42aa66a9>: > > Am 15.11.2012 um 01:11 schrieb Marcelo Tosatti: > > Migrate 16 bytes for en/sts fields (which is the correct size), > > increase version to 3, and document how to support incoming > > migration from qemu-kvm 1.2. > > I my case qemu-kvm-1.1.2/hw/acpi_piix4.c:284 > | VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE), > only saves 4 bytes, not 16 bytes. Hi Philipp, IIRC qemu-1.1.2 saved 16 bytes, which is the correct size, not 4 bytes. So while merging from qemu-kvm -> qemu, it was decided to maintain backwards compability with qemu, and not qemu-kvm. Is there any way to differentiate between the two (qemu vs qemu-kvm, perhaps via some other field not in the VMState of ACPI PIIX4), so your patch can be integrated upstream?
Hello Marcelo, Am 21.03.2017 um 00:20 schrieb Marcelo Tosatti: > On Mon, Mar 20, 2017 at 01:02:10PM +0100, Philipp Hahn wrote: >> Hello Marcelo, cc:qemu, >> >> Sorry for re-using this old thread, but I have a problem loading some >> saved state from qemu-kvm-1.1.2, which fails for piix4_pm. >> >> You following patch was committed as >> <http://git.qemu-project.org/?p=qemu.git;a=commitdiff;h=b0b873a07872f7ab7f66f259c73fb9dd42aa66a9>: >> >> Am 15.11.2012 um 01:11 schrieb Marcelo Tosatti: >>> Migrate 16 bytes for en/sts fields (which is the correct size), >>> increase version to 3, and document how to support incoming >>> migration from qemu-kvm 1.2. >> >> I my case qemu-kvm-1.1.2/hw/acpi_piix4.c:284 >> | VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE), >> only saves 4 bytes, not 16 bytes. > > IIRC qemu-1.1.2 saved 16 bytes, which is the correct size, not 4 bytes. I found 23910d3f669d46073b403876e30a7314599633af in qemu, which changed "gpe" to be an array[4] instead of single "struct gpe_regs" without changing the version number. So the incompatibility was introduced there. > So while merging from qemu-kvm -> qemu, it was decided to maintain > backwards compability with qemu, and not qemu-kvm. > > Is there any way to differentiate between the two (qemu vs qemu-kvm, > perhaps via some other field not in the VMState of ACPI PIIX4), so > your patch can be integrated upstream? I had a look and haven't found any reliable indicator to distinguish between "qemu" and "qemu-kvm" yet. I'll have another look if my time permits, but as I know "qemu-kvm" was used in my case, I will hard code that knowledge for now in my private build. Thank you four sharing your knowledge. Philipp
From 1313efdc0ac664169c5c271f832264efe6659743 Mon Sep 17 00:00:00 2001 Message-Id: <1313efdc0ac664169c5c271f832264efe6659743.1490011194.git.hahn@univention.de> From: Philipp Hahn <hahn@univention.de> Date: Fri, 17 Mar 2017 12:51:01 +0100 Subject: [PATCH 1/2] 0006-Bug-38877-debug-loadvm-offset Organization: Univention GmbH, Bremen, Germany To: qemu-devel@nongnu.org debug: Print offset on section error: 30143@1489751176.344102:qemu_loadvm_state_section 48@0x364da2 Gbp: Topic debug Signed-off-by: Philipp Hahn <hahn@univention.de> --- include/migration/qemu-file.h | 1 + migration/qemu-file.c | 5 +++++ migration/savevm.c | 2 +- migration/trace-events | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h index abedd46..a570836 100644 --- a/include/migration/qemu-file.h +++ b/include/migration/qemu-file.h @@ -126,6 +126,7 @@ int qemu_get_fd(QEMUFile *f); int qemu_fclose(QEMUFile *f); int64_t qemu_ftell(QEMUFile *f); int64_t qemu_ftell_fast(QEMUFile *f); +int64_t qemu_ftell_internal(QEMUFile *f); void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size); void qemu_put_byte(QEMUFile *f, int v); /* diff --git a/migration/qemu-file.c b/migration/qemu-file.c index e9fae31..862b8c7 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c @@ -543,6 +543,11 @@ int64_t qemu_ftell(QEMUFile *f) return f->pos; } +int64_t qemu_ftell_internal(QEMUFile *f) +{ + return f->pos - f->buf_size + f->buf_index; +} + int qemu_file_rate_limit(QEMUFile *f) { if (qemu_file_get_error(f)) { diff --git a/migration/savevm.c b/migration/savevm.c index 0363372..da2a98b 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1882,7 +1882,7 @@ static int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis) while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) { ret = 0; - trace_qemu_loadvm_state_section(section_type); + trace_qemu_loadvm_state_section(section_type, qemu_ftell_internal(f) - 1); switch (section_type) { case QEMU_VM_SECTION_START: case QEMU_VM_SECTION_FULL: diff --git a/migration/trace-events b/migration/trace-events index 94134f7..49f8458 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -1,7 +1,7 @@ # See docs/tracing.txt for syntax documentation. # migration/savevm.c -qemu_loadvm_state_section(unsigned int section_type) "%d" +qemu_loadvm_state_section(unsigned int section_type, uint64_t offset) "%d@0x%" PRIx64 qemu_loadvm_state_section_command(int ret) "%d" qemu_loadvm_state_section_partend(uint32_t section_id) "%u" qemu_loadvm_state_main(void) "" -- 2.1.4