From nobody Mon Apr 29 06:56:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505844277977979.0769637734027; Tue, 19 Sep 2017 11:04:37 -0700 (PDT) Received: from localhost ([::1]:44655 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMsu-0000Gv-Ru for importer@patchew.org; Tue, 19 Sep 2017 14:04:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMpP-0005se-IK for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duMpL-0008KI-0J for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60747) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1duMpK-0008D0-KQ for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:54 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D48E4128B; Tue, 19 Sep 2017 18:00:51 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-120.ams2.redhat.com [10.36.117.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id F10DA5D983; Tue, 19 Sep 2017 18:00:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D48E4128B Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dgilbert@redhat.com From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com, peterx@redhat.com Date: Tue, 19 Sep 2017 19:00:34 +0100 Message-Id: <20170919180038.26056-2-dgilbert@redhat.com> In-Reply-To: <20170919180038.26056-1-dgilbert@redhat.com> References: <20170919180038.26056-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 19 Sep 2017 18:00:52 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/5] migration: pre_save return int X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, cohuck@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" Modify the pre_save method on VMStateDescription to return an int rather than void so that it potentially can fail. Changed zillions of devices to make them return 0; the only case I've made it return non-0 is hw/intc/s390_flic_kvm.c that already had an error_report/return case. Note: If you add an error exit in your pre_save you must emit an error_report to say why. Signed-off-by: Dr. David Alan Gilbert --- docs/devel/migration.txt | 2 +- hw/arm/pxa2xx.c | 4 +++- hw/arm/strongarm.c | 4 +++- hw/audio/wm8750.c | 4 +++- hw/block/fdc.c | 4 +++- hw/block/m25p80.c | 4 +++- hw/block/nand.c | 4 +++- hw/block/onenand.c | 4 +++- hw/char/serial.c | 4 +++- hw/display/qxl.c | 4 +++- hw/i2c/core.c | 4 +++- hw/i386/kvm/clock.c | 4 +++- hw/ide/core.c | 4 +++- hw/ide/pci.c | 4 +++- hw/input/ps2.c | 8 ++++++-- hw/input/tsc210x.c | 4 +++- hw/intc/apic_common.c | 4 +++- hw/intc/arm_gic_common.c | 4 +++- hw/intc/arm_gicv3_common.c | 4 +++- hw/intc/arm_gicv3_its_common.c | 4 +++- hw/intc/i8259_common.c | 4 +++- hw/intc/ioapic_common.c | 4 +++- hw/intc/s390_flic_kvm.c | 6 ++++-- hw/intc/xics.c | 8 ++++++-- hw/net/e1000.c | 4 +++- hw/net/e1000e.c | 4 +++- hw/net/rtl8139.c | 4 +++- hw/net/virtio-net.c | 16 ++++++++++++---- hw/net/vmxnet3.c | 4 +++- hw/pci-host/piix.c | 4 +++- hw/ppc/ppc.c | 4 +++- hw/ppc/spapr_iommu.c | 4 +++- hw/ppc/spapr_pci.c | 6 ++++-- hw/s390x/css.c | 10 +++++++--- hw/s390x/virtio-ccw.c | 4 +++- hw/scsi/lsi53c895a.c | 4 +++- hw/scsi/vmw_pvscsi.c | 4 +++- hw/timer/cadence_ttc.c | 4 +++- hw/timer/hpet.c | 4 +++- hw/timer/i8254_common.c | 4 +++- hw/timer/mc146818rtc.c | 4 +++- hw/timer/pl031.c | 4 +++- hw/timer/twl92230.c | 4 +++- hw/usb/dev-smartcard-reader.c | 4 +++- hw/usb/hcd-ehci.c | 4 +++- hw/usb/redirect.c | 4 +++- hw/virtio/vhost-vsock.c | 4 +++- include/migration/vmstate.h | 2 +- migration/colo-comm.c | 4 +++- migration/global_state.c | 4 +++- migration/savevm.c | 4 +++- replay/replay-snapshot.c | 4 +++- slirp/slirp.c | 8 ++++++-- target/arm/machine.c | 4 +++- target/i386/machine.c | 7 +++++-- target/ppc/machine.c | 4 +++- target/s390x/machine.c | 4 +++- target/sparc/machine.c | 4 +++- tests/test-vmstate.c | 4 +++- 59 files changed, 199 insertions(+), 70 deletions(-) diff --git a/docs/devel/migration.txt b/docs/devel/migration.txt index 1b940a829b..4030703726 100644 --- a/docs/devel/migration.txt +++ b/docs/devel/migration.txt @@ -202,7 +202,7 @@ The functions to do that are inside a vmstate definitio= n, and are called: =20 This function is called after we load the state of one device. =20 -- void (*pre_save)(void *opaque); +- int (*pre_save)(void *opaque); =20 This function is called before we save the state of one device. =20 diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c index b0ac3cfd64..3648f01d05 100644 --- a/hw/arm/pxa2xx.c +++ b/hw/arm/pxa2xx.c @@ -1143,13 +1143,15 @@ static void pxa2xx_rtc_init(Object *obj) sysbus_init_mmio(dev, &s->iomem); } =20 -static void pxa2xx_rtc_pre_save(void *opaque) +static int pxa2xx_rtc_pre_save(void *opaque) { PXA2xxRTCState *s =3D (PXA2xxRTCState *) opaque; =20 pxa2xx_rtc_hzupdate(s); pxa2xx_rtc_piupdate(s); pxa2xx_rtc_swupdate(s); + + return 0; } =20 static int pxa2xx_rtc_post_load(void *opaque, int version_id) diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c index 884242b2dc..37d7e36b35 100644 --- a/hw/arm/strongarm.c +++ b/hw/arm/strongarm.c @@ -406,11 +406,13 @@ static void strongarm_rtc_init(Object *obj) sysbus_init_mmio(dev, &s->iomem); } =20 -static void strongarm_rtc_pre_save(void *opaque) +static int strongarm_rtc_pre_save(void *opaque) { StrongARMRTCState *s =3D opaque; =20 strongarm_rtc_hzupdate(s); + + return 0; } =20 static int strongarm_rtc_post_load(void *opaque, int version_id) diff --git a/hw/audio/wm8750.c b/hw/audio/wm8750.c index f8b5bebfc2..fff49f8bb5 100644 --- a/hw/audio/wm8750.c +++ b/hw/audio/wm8750.c @@ -567,11 +567,13 @@ static int wm8750_rx(I2CSlave *i2c) return 0x00; } =20 -static void wm8750_pre_save(void *opaque) +static int wm8750_pre_save(void *opaque) { WM8750State *s =3D opaque; =20 s->rate_vmstate =3D s->rate - wm_rate_table; + + return 0; } =20 static int wm8750_post_load(void *opaque, int version_id) diff --git a/hw/block/fdc.c b/hw/block/fdc.c index db40e174c9..af9ba77270 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -1102,11 +1102,13 @@ static int reconstruct_phase(FDCtrl *fdctrl) } } =20 -static void fdc_pre_save(void *opaque) +static int fdc_pre_save(void *opaque) { FDCtrl *s =3D opaque; =20 s->dor_vmstate =3D s->dor | GET_CUR_DRV(s); + + return 0; } =20 static int fdc_pre_load(void *opaque) diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 190573cefa..a2438b9ed2 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -1251,9 +1251,11 @@ static void m25p80_reset(DeviceState *d) reset_memory(s); } =20 -static void m25p80_pre_save(void *opaque) +static int m25p80_pre_save(void *opaque) { flash_sync_dirty((Flash *)opaque, -1); + + return 0; } =20 static Property m25p80_properties[] =3D { diff --git a/hw/block/nand.c b/hw/block/nand.c index 0d33ac281f..76dcd3f76e 100644 --- a/hw/block/nand.c +++ b/hw/block/nand.c @@ -325,11 +325,13 @@ static void nand_command(NANDFlashState *s) } } =20 -static void nand_pre_save(void *opaque) +static int nand_pre_save(void *opaque) { NANDFlashState *s =3D NAND(opaque); =20 s->ioaddr_vmstate =3D s->ioaddr - s->io; + + return 0; } =20 static int nand_post_load(void *opaque, int version_id) diff --git a/hw/block/onenand.c b/hw/block/onenand.c index b7423607d9..30e40f3914 100644 --- a/hw/block/onenand.c +++ b/hw/block/onenand.c @@ -137,7 +137,7 @@ static void onenand_intr_update(OneNANDState *s) qemu_set_irq(s->intr, ((s->intstatus >> 15) ^ (~s->config[0] >> 6)) & = 1); } =20 -static void onenand_pre_save(void *opaque) +static int onenand_pre_save(void *opaque) { OneNANDState *s =3D opaque; if (s->current =3D=3D s->otp) { @@ -147,6 +147,8 @@ static void onenand_pre_save(void *opaque) } else { s->current_direction =3D 0; } + + return 0; } =20 static int onenand_post_load(void *opaque, int version_id) diff --git a/hw/char/serial.c b/hw/char/serial.c index 9aec6c60d8..376bd2f240 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -630,10 +630,12 @@ static void serial_event(void *opaque, int event) serial_receive_break(s); } =20 -static void serial_pre_save(void *opaque) +static int serial_pre_save(void *opaque) { SerialState *s =3D opaque; s->fcr_vmstate =3D s->fcr; + + return 0; } =20 static int serial_pre_load(void *opaque) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index ae3677fd1e..d92fe05f1a 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -2204,7 +2204,7 @@ static void qxl_realize_secondary(PCIDevice *dev, Err= or **errp) qxl_realize_common(qxl, errp); } =20 -static void qxl_pre_save(void *opaque) +static int qxl_pre_save(void *opaque) { PCIQXLDevice* d =3D opaque; uint8_t *ram_start =3D d->vga.vram_ptr; @@ -2216,6 +2216,8 @@ static void qxl_pre_save(void *opaque) d->last_release_offset =3D (uint8_t *)d->last_release - ram_start; } assert(d->last_release_offset < d->vga.vram_size); + + return 0; } =20 static int qxl_pre_load(void *opaque) diff --git a/hw/i2c/core.c b/hw/i2c/core.c index 2c1234cdff..59068f157e 100644 --- a/hw/i2c/core.c +++ b/hw/i2c/core.c @@ -41,7 +41,7 @@ static const TypeInfo i2c_bus_info =3D { .instance_size =3D sizeof(I2CBus), }; =20 -static void i2c_bus_pre_save(void *opaque) +static int i2c_bus_pre_save(void *opaque) { I2CBus *bus =3D opaque; =20 @@ -53,6 +53,8 @@ static void i2c_bus_pre_save(void *opaque) bus->saved_address =3D I2C_BROADCAST; } } + + return 0; } =20 static const VMStateDescription vmstate_i2c_bus =3D { diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c index 363d1b5743..75ad1ba6f0 100644 --- a/hw/i386/kvm/clock.c +++ b/hw/i386/kvm/clock.c @@ -254,11 +254,13 @@ static const VMStateDescription kvmclock_reliable_get= _clock =3D { * final pages of memory (which happens between vm_stop() * and pre_save()) takes max_downtime. */ -static void kvmclock_pre_save(void *opaque) +static int kvmclock_pre_save(void *opaque) { KVMClockState *s =3D opaque; =20 kvm_update_clock(s); + + return 0; } =20 static const VMStateDescription kvmclock_vmsd =3D { diff --git a/hw/ide/core.c b/hw/ide/core.c index bea39536b0..588f375daf 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -2696,7 +2696,7 @@ static int ide_drive_pio_post_load(void *opaque, int = version_id) return 0; } =20 -static void ide_drive_pio_pre_save(void *opaque) +static int ide_drive_pio_pre_save(void *opaque) { IDEState *s =3D opaque; int idx; @@ -2712,6 +2712,8 @@ static void ide_drive_pio_pre_save(void *opaque) } else { s->end_transfer_fn_idx =3D idx; } + + return 0; } =20 static bool ide_drive_pio_state_needed(void *opaque) diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 3cfb510afe..552e4ad179 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -303,7 +303,7 @@ static bool ide_bmdma_status_needed(void *opaque) return ((bm->status & abused_bits) !=3D 0); } =20 -static void ide_bmdma_pre_save(void *opaque) +static int ide_bmdma_pre_save(void *opaque) { BMDMAState *bm =3D opaque; uint8_t abused_bits =3D BM_MIGRATION_COMPAT_STATUS_BITS; @@ -317,6 +317,8 @@ static void ide_bmdma_pre_save(void *opaque) bm->migration_retry_nsector =3D bm->bus->retry_nsector; bm->migration_compat_status =3D (bm->status & ~abused_bits) | (bm->bus->error_status & abused_bits= ); + + return 0; } =20 /* This function accesses bm->bus->error_status which is loaded only after diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 77906d5f46..dff3f1e024 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -1216,12 +1216,14 @@ static int ps2_kbd_post_load(void* opaque, int vers= ion_id) return 0; } =20 -static void ps2_kbd_pre_save(void *opaque) +static int ps2_kbd_pre_save(void *opaque) { PS2KbdState *s =3D (PS2KbdState *)opaque; PS2State *ps2 =3D &s->common; =20 ps2_common_post_load(ps2); + + return 0; } =20 static const VMStateDescription vmstate_ps2_keyboard =3D { @@ -1254,12 +1256,14 @@ static int ps2_mouse_post_load(void *opaque, int ve= rsion_id) return 0; } =20 -static void ps2_mouse_pre_save(void *opaque) +static int ps2_mouse_pre_save(void *opaque) { PS2MouseState *s =3D (PS2MouseState *)opaque; PS2State *ps2 =3D &s->common; =20 ps2_common_post_load(ps2); + + return 0; } =20 static const VMStateDescription vmstate_ps2_mouse =3D { diff --git a/hw/input/tsc210x.c b/hw/input/tsc210x.c index b068343771..75ac8c2ab5 100644 --- a/hw/input/tsc210x.c +++ b/hw/input/tsc210x.c @@ -976,10 +976,12 @@ static void tsc210x_i2s_set_rate(TSC210xState *s, int= in, int out) s->i2s_rx_rate =3D in; } =20 -static void tsc210x_pre_save(void *opaque) +static int tsc210x_pre_save(void *opaque) { TSC210xState *s =3D (TSC210xState *) opaque; s->now =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + + return 0; } =20 static int tsc210x_post_load(void *opaque, int version_id) diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c index e1ac33042f..78903ea909 100644 --- a/hw/intc/apic_common.c +++ b/hw/intc/apic_common.c @@ -360,7 +360,7 @@ static int apic_pre_load(void *opaque) return 0; } =20 -static void apic_dispatch_pre_save(void *opaque) +static int apic_dispatch_pre_save(void *opaque) { APICCommonState *s =3D APIC_COMMON(opaque); APICCommonClass *info =3D APIC_COMMON_GET_CLASS(s); @@ -368,6 +368,8 @@ static void apic_dispatch_pre_save(void *opaque) if (info->pre_save) { info->pre_save(s); } + + return 0; } =20 static int apic_dispatch_post_load(void *opaque, int version_id) diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c index 70f1134823..aee50a20e0 100644 --- a/hw/intc/arm_gic_common.c +++ b/hw/intc/arm_gic_common.c @@ -23,7 +23,7 @@ #include "gic_internal.h" #include "hw/arm/linux-boot-if.h" =20 -static void gic_pre_save(void *opaque) +static int gic_pre_save(void *opaque) { GICState *s =3D (GICState *)opaque; ARMGICCommonClass *c =3D ARM_GIC_COMMON_GET_CLASS(s); @@ -31,6 +31,8 @@ static void gic_pre_save(void *opaque) if (c->pre_save) { c->pre_save(s); } + + return 0; } =20 static int gic_post_load(void *opaque, int version_id) diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c index 410915a2ac..7b54d52376 100644 --- a/hw/intc/arm_gicv3_common.c +++ b/hw/intc/arm_gicv3_common.c @@ -28,7 +28,7 @@ #include "gicv3_internal.h" #include "hw/arm/linux-boot-if.h" =20 -static void gicv3_pre_save(void *opaque) +static int gicv3_pre_save(void *opaque) { GICv3State *s =3D (GICv3State *)opaque; ARMGICv3CommonClass *c =3D ARM_GICV3_COMMON_GET_CLASS(s); @@ -36,6 +36,8 @@ static void gicv3_pre_save(void *opaque) if (c->pre_save) { c->pre_save(s); } + + return 0; } =20 static int gicv3_post_load(void *opaque, int version_id) diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c index 68b20fccd1..f2cce597a9 100644 --- a/hw/intc/arm_gicv3_its_common.c +++ b/hw/intc/arm_gicv3_its_common.c @@ -23,7 +23,7 @@ #include "hw/intc/arm_gicv3_its_common.h" #include "qemu/log.h" =20 -static void gicv3_its_pre_save(void *opaque) +static int gicv3_its_pre_save(void *opaque) { GICv3ITSState *s =3D (GICv3ITSState *)opaque; GICv3ITSCommonClass *c =3D ARM_GICV3_ITS_COMMON_GET_CLASS(s); @@ -31,6 +31,8 @@ static void gicv3_its_pre_save(void *opaque) if (c->pre_save) { c->pre_save(s); } + + return 0; } =20 static int gicv3_its_post_load(void *opaque, int version_id) diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c index c2fd563b5b..18427b459a 100644 --- a/hw/intc/i8259_common.c +++ b/hw/intc/i8259_common.c @@ -46,7 +46,7 @@ void pic_reset_common(PICCommonState *s) /* Note: ELCR is not reset */ } =20 -static void pic_dispatch_pre_save(void *opaque) +static int pic_dispatch_pre_save(void *opaque) { PICCommonState *s =3D opaque; PICCommonClass *info =3D PIC_COMMON_GET_CLASS(s); @@ -54,6 +54,8 @@ static void pic_dispatch_pre_save(void *opaque) if (info->pre_save) { info->pre_save(s); } + + return 0; } =20 static int pic_dispatch_post_load(void *opaque, int version_id) diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c index 97c4f9c2df..3b3d0a7680 100644 --- a/hw/intc/ioapic_common.c +++ b/hw/intc/ioapic_common.c @@ -102,7 +102,7 @@ void ioapic_reset_common(DeviceState *dev) } } =20 -static void ioapic_dispatch_pre_save(void *opaque) +static int ioapic_dispatch_pre_save(void *opaque) { IOAPICCommonState *s =3D IOAPIC_COMMON(opaque); IOAPICCommonClass *info =3D IOAPIC_COMMON_GET_CLASS(s); @@ -110,6 +110,8 @@ static void ioapic_dispatch_pre_save(void *opaque) if (info->pre_save) { info->pre_save(s); } + + return 0; } =20 static int ioapic_dispatch_post_load(void *opaque, int version_id) diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c index 7ead17ac3e..d208cb81c4 100644 --- a/hw/intc/s390_flic_kvm.c +++ b/hw/intc/s390_flic_kvm.c @@ -420,7 +420,7 @@ typedef struct KVMS390FLICStateMigTmp { uint8_t nimm; } KVMS390FLICStateMigTmp; =20 -static void kvm_flic_ais_pre_save(void *opaque) +static int kvm_flic_ais_pre_save(void *opaque) { KVMS390FLICStateMigTmp *tmp =3D opaque; KVMS390FLICState *flic =3D tmp->parent; @@ -433,11 +433,13 @@ static void kvm_flic_ais_pre_save(void *opaque) =20 if (ioctl(flic->fd, KVM_GET_DEVICE_ATTR, &attr)) { error_report("Failed to retrieve kvm flic ais states"); - return; + return -EINVAL; } =20 tmp->simm =3D ais.simm; tmp->nimm =3D ais.nimm; + + return 0; } =20 static int kvm_flic_ais_post_load(void *opaque, int version_id) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index a84ba51ad8..4d6a25ade6 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -241,7 +241,7 @@ static void icp_irq(ICSState *ics, int server, int nr, = uint8_t priority) } } =20 -static void icp_dispatch_pre_save(void *opaque) +static int icp_dispatch_pre_save(void *opaque) { ICPState *icp =3D opaque; ICPStateClass *info =3D ICP_GET_CLASS(icp); @@ -249,6 +249,8 @@ static void icp_dispatch_pre_save(void *opaque) if (info->pre_save) { info->pre_save(icp); } + + return 0; } =20 static int icp_dispatch_post_load(void *opaque, int version_id) @@ -533,7 +535,7 @@ static void ics_simple_reset(void *dev) } } =20 -static void ics_simple_dispatch_pre_save(void *opaque) +static int ics_simple_dispatch_pre_save(void *opaque) { ICSState *ics =3D opaque; ICSStateClass *info =3D ICS_BASE_GET_CLASS(ics); @@ -541,6 +543,8 @@ static void ics_simple_dispatch_pre_save(void *opaque) if (info->pre_save) { info->pre_save(ics); } + + return 0; } =20 static int ics_simple_dispatch_post_load(void *opaque, int version_id) diff --git a/hw/net/e1000.c b/hw/net/e1000.c index eebe3a9c13..cae95185a5 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -1343,7 +1343,7 @@ static bool is_version_1(void *opaque, int version_id) return version_id =3D=3D 1; } =20 -static void e1000_pre_save(void *opaque) +static int e1000_pre_save(void *opaque) { E1000State *s =3D opaque; NetClientState *nc =3D qemu_get_queue(s->nic); @@ -1361,6 +1361,8 @@ static void e1000_pre_save(void *opaque) if (nc->link_down && have_autoneg(s)) { s->phy_reg[PHY_STATUS] |=3D MII_SR_AUTONEG_COMPLETE; } + + return 0; } =20 static int e1000_post_load(void *opaque, int version_id) diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c index 6c42b4478c..744f0f3b91 100644 --- a/hw/net/e1000e.c +++ b/hw/net/e1000e.c @@ -523,13 +523,15 @@ static void e1000e_qdev_reset(DeviceState *dev) e1000e_core_reset(&s->core); } =20 -static void e1000e_pre_save(void *opaque) +static int e1000e_pre_save(void *opaque) { E1000EState *s =3D opaque; =20 trace_e1000e_cb_pre_save(); =20 e1000e_core_pre_save(&s->core); + + return 0; } =20 static int e1000e_post_load(void *opaque, int version_id) diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index 3be24bbee7..d6c8188ae1 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -3162,7 +3162,7 @@ static const VMStateDescription vmstate_rtl8139_hotpl= ug_ready =3D{ } }; =20 -static void rtl8139_pre_save(void *opaque) +static int rtl8139_pre_save(void *opaque) { RTL8139State* s =3D opaque; int64_t current_time =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); @@ -3170,6 +3170,8 @@ static void rtl8139_pre_save(void *opaque) /* for migration to older versions */ s->TCTR =3D (current_time - s->TCTR_base) / PCI_PERIOD; s->rtl8139_mmio_io_addr_dummy =3D 0; + + return 0; } =20 static const VMStateDescription vmstate_rtl8139 =3D { diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 148071a396..150fd0748e 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -1712,7 +1712,7 @@ struct VirtIONetMigTmp { * pointer and count and also validate the count. */ =20 -static void virtio_net_tx_waiting_pre_save(void *opaque) +static int virtio_net_tx_waiting_pre_save(void *opaque) { struct VirtIONetMigTmp *tmp =3D opaque; =20 @@ -1721,6 +1721,8 @@ static void virtio_net_tx_waiting_pre_save(void *opaq= ue) if (tmp->parent->curr_queues =3D=3D 0) { tmp->curr_queues_1 =3D 0; } + + return 0; } =20 static int virtio_net_tx_waiting_pre_load(void *opaque) @@ -1768,11 +1770,13 @@ static int virtio_net_ufo_post_load(void *opaque, i= nt version_id) return 0; } =20 -static void virtio_net_ufo_pre_save(void *opaque) +static int virtio_net_ufo_pre_save(void *opaque) { struct VirtIONetMigTmp *tmp =3D opaque; =20 tmp->has_ufo =3D tmp->parent->has_ufo; + + return 0; } =20 static const VMStateDescription vmstate_virtio_net_has_ufo =3D { @@ -1800,11 +1804,13 @@ static int virtio_net_vnet_post_load(void *opaque, = int version_id) return 0; } =20 -static void virtio_net_vnet_pre_save(void *opaque) +static int virtio_net_vnet_pre_save(void *opaque) { struct VirtIONetMigTmp *tmp =3D opaque; =20 tmp->has_vnet_hdr =3D tmp->parent->has_vnet_hdr; + + return 0; } =20 static const VMStateDescription vmstate_virtio_net_has_vnet =3D { @@ -2079,13 +2085,15 @@ static void virtio_net_instance_init(Object *obj) DEVICE(n), NULL); } =20 -static void virtio_net_pre_save(void *opaque) +static int virtio_net_pre_save(void *opaque) { VirtIONet *n =3D opaque; =20 /* At this point, backend must be stopped, otherwise * it might keep writing to memory. */ assert(!n->vhost_started); + + return 0; } =20 static const VMStateDescription vmstate_virtio_net =3D { diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c index a19a7a31dd..b43b58be2b 100644 --- a/hw/net/vmxnet3.c +++ b/hw/net/vmxnet3.c @@ -2388,11 +2388,13 @@ static int vmxnet3_mcast_list_pre_load(void *opaque) } =20 =20 -static void vmxnet3_pre_save(void *opaque) +static int vmxnet3_pre_save(void *opaque) { VMXNET3State *s =3D opaque; =20 s->mcast_list_buff_size =3D s->mcast_list_len * sizeof(MACAddr); + + return 0; } =20 static const VMStateDescription vmxstate_vmxnet3_mcast_list =3D { diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index 894e131c00..dec345fd24 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -579,7 +579,7 @@ static int piix3_post_load(void *opaque, int version_id) return 0; } =20 -static void piix3_pre_save(void *opaque) +static int piix3_pre_save(void *opaque) { int i; PIIX3State *piix3 =3D opaque; @@ -588,6 +588,8 @@ static void piix3_pre_save(void *opaque) piix3->pci_irq_levels_vmstate[i] =3D pci_bus_get_irq_level(piix3->dev.bus, i); } + + return 0; } =20 static bool piix3_rcr_needed(void *opaque) diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index f76886f4d3..05da316e0b 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -937,11 +937,13 @@ void cpu_ppc_clock_vm_state_change(void *opaque, int = running, * final pages of memory (which happens between vm_stop() * and pre_save()) takes max_downtime. */ -static void timebase_pre_save(void *opaque) +static int timebase_pre_save(void *opaque) { PPCTimebase *tb =3D opaque; =20 timebase_save(tb); + + return 0; } =20 const VMStateDescription vmstate_ppc_timebase =3D { diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index fa8b969840..5ccd785d5a 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -140,7 +140,7 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMem= oryRegion *iommu, return ret; } =20 -static void spapr_tce_table_pre_save(void *opaque) +static int spapr_tce_table_pre_save(void *opaque) { sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); =20 @@ -149,6 +149,8 @@ static void spapr_tce_table_pre_save(void *opaque) =20 trace_spapr_iommu_pre_save(tcet->liobn, tcet->mig_nb_table, tcet->bus_offset, tcet->page_shift); + + return 0; } =20 static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index d7880f257a..a00f67b0f8 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1860,7 +1860,7 @@ static const VMStateDescription vmstate_spapr_pci_msi= =3D { }, }; =20 -static void spapr_pci_pre_save(void *opaque) +static int spapr_pci_pre_save(void *opaque) { sPAPRPHBState *sphb =3D opaque; GHashTableIter iter; @@ -1885,7 +1885,7 @@ static void spapr_pci_pre_save(void *opaque) sphb->msi_devs =3D NULL; sphb->msi_devs_num =3D g_hash_table_size(sphb->msi); if (!sphb->msi_devs_num) { - return; + return 0; } sphb->msi_devs =3D g_malloc(sphb->msi_devs_num * sizeof(spapr_pci_msi_= mig)); =20 @@ -1894,6 +1894,8 @@ static void spapr_pci_pre_save(void *opaque) sphb->msi_devs[i].key =3D *(uint32_t *) key; sphb->msi_devs[i].value =3D *(spapr_pci_msi *) value; } + + return 0; } =20 static int spapr_pci_post_load(void *opaque, int version_id) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 901dc6a0f3..ad23eaf6e6 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -196,7 +196,7 @@ static const VMStateDescription vmstate_schdev_orb =3D { }; =20 static int subch_dev_post_load(void *opaque, int version_id); -static void subch_dev_pre_save(void *opaque); +static int subch_dev_pre_save(void *opaque); =20 const char err_hint_devno[] =3D "Devno mismatch, tried to load wrong secti= on!" " Likely reason: some sequences of plug and unplug can break" @@ -249,7 +249,7 @@ static int post_load_ind_addr(void *opaque, int version= _id) return 0; } =20 -static void pre_save_ind_addr(void *opaque) +static int pre_save_ind_addr(void *opaque) { IndAddrPtrTmp *ptmp =3D opaque; IndAddr *ind_addr =3D *(ptmp->parent); @@ -261,6 +261,8 @@ static void pre_save_ind_addr(void *opaque) ptmp->len =3D 0; ptmp->addr =3D 0L; } + + return 0; } =20 const VMStateDescription vmstate_ind_addr_tmp =3D { @@ -358,12 +360,14 @@ static ChannelSubSys channel_subsys =3D { QTAILQ_HEAD_INITIALIZER(channel_subsys.indicator_addresses), }; =20 -static void subch_dev_pre_save(void *opaque) +static int subch_dev_pre_save(void *opaque) { SubchDev *s =3D opaque; =20 /* Prepare remote_schid for save */ s->migrated_schid =3D s->schid; + + return 0; } =20 static int subch_dev_post_load(void *opaque, int version_id) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index b1976fdd19..7553ec1253 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -62,13 +62,15 @@ typedef struct VirtioCcwDeviceTmp { uint16_t config_vector; } VirtioCcwDeviceTmp; =20 -static void virtio_ccw_dev_tmp_pre_save(void *opaque) +static int virtio_ccw_dev_tmp_pre_save(void *opaque) { VirtioCcwDeviceTmp *tmp =3D opaque; VirtioCcwDevice *dev =3D tmp->parent; VirtIODevice *vdev =3D virtio_bus_get_device(&dev->bus); =20 tmp->config_vector =3D vdev->config_vector; + + return 0; } =20 static int virtio_ccw_dev_tmp_post_load(void *opaque, int version_id) diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c index 3e56ab267c..a67ee074d9 100644 --- a/hw/scsi/lsi53c895a.c +++ b/hw/scsi/lsi53c895a.c @@ -2083,7 +2083,7 @@ static void lsi_scsi_reset(DeviceState *dev) lsi_soft_reset(s); } =20 -static void lsi_pre_save(void *opaque) +static int lsi_pre_save(void *opaque) { LSIState *s =3D opaque; =20 @@ -2092,6 +2092,8 @@ static void lsi_pre_save(void *opaque) assert(s->current->dma_len =3D=3D 0); } assert(QTAILQ_EMPTY(&s->queue)); + + return 0; } =20 static const VMStateDescription vmstate_lsi_scsi =3D { diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c index 77d8b6f9e2..b18d35248e 100644 --- a/hw/scsi/vmw_pvscsi.c +++ b/hw/scsi/vmw_pvscsi.c @@ -1167,7 +1167,7 @@ pvscsi_reset(DeviceState *dev) pvscsi_reset_adapter(s); } =20 -static void +static int pvscsi_pre_save(void *opaque) { PVSCSIState *s =3D (PVSCSIState *) opaque; @@ -1176,6 +1176,8 @@ pvscsi_pre_save(void *opaque) =20 assert(QTAILQ_EMPTY(&s->pending_queue)); assert(QTAILQ_EMPTY(&s->completion_queue)); + + return 0; } =20 static int diff --git a/hw/timer/cadence_ttc.c b/hw/timer/cadence_ttc.c index 03f5b9c206..5e65fdb5a0 100644 --- a/hw/timer/cadence_ttc.c +++ b/hw/timer/cadence_ttc.c @@ -421,9 +421,11 @@ static void cadence_ttc_init(Object *obj) sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem); } =20 -static void cadence_timer_pre_save(void *opaque) +static int cadence_timer_pre_save(void *opaque) { cadence_timer_sync((CadenceTimerState *)opaque); + + return 0; } =20 static int cadence_timer_post_load(void *opaque, int version_id) diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c index a2c18b30c3..577371bc6d 100644 --- a/hw/timer/hpet.c +++ b/hw/timer/hpet.c @@ -216,12 +216,14 @@ static void update_irq(struct HPETTimer *timer, int s= et) } } =20 -static void hpet_pre_save(void *opaque) +static int hpet_pre_save(void *opaque) { HPETState *s =3D opaque; =20 /* save current counter value */ s->hpet_counter =3D hpet_get_ticks(s); + + return 0; } =20 static int hpet_pre_load(void *opaque) diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c index ee064aa819..b623c96198 100644 --- a/hw/timer/i8254_common.c +++ b/hw/timer/i8254_common.c @@ -237,7 +237,7 @@ static int pit_load_old(QEMUFile *f, void *opaque, int = version_id) return 0; } =20 -static void pit_dispatch_pre_save(void *opaque) +static int pit_dispatch_pre_save(void *opaque) { PITCommonState *s =3D opaque; PITCommonClass *c =3D PIT_COMMON_GET_CLASS(s); @@ -245,6 +245,8 @@ static void pit_dispatch_pre_save(void *opaque) if (c->pre_save) { c->pre_save(s); } + + return 0; } =20 static int pit_dispatch_post_load(void *opaque, int version_id) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 82843ed03f..7764be25ec 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -795,11 +795,13 @@ static void rtc_set_date_from_host(ISADevice *dev) rtc_set_cmos(s, &tm); } =20 -static void rtc_pre_save(void *opaque) +static int rtc_pre_save(void *opaque) { RTCState *s =3D opaque; =20 rtc_update_time(s); + + return 0; } =20 static int rtc_post_load(void *opaque, int version_id) diff --git a/hw/timer/pl031.c b/hw/timer/pl031.c index dbbeb9b16b..d3aacce80d 100644 --- a/hw/timer/pl031.c +++ b/hw/timer/pl031.c @@ -211,7 +211,7 @@ static void pl031_init(Object *obj) s->timer =3D timer_new_ns(rtc_clock, pl031_interrupt, s); } =20 -static void pl031_pre_save(void *opaque) +static int pl031_pre_save(void *opaque) { PL031State *s =3D opaque; =20 @@ -219,6 +219,8 @@ static void pl031_pre_save(void *opaque) * store the base time relative to the QEMU_CLOCK_VIRTUAL for backward= s-compatibility. */ int64_t delta =3D qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEM= U_CLOCK_VIRTUAL); s->tick_offset_vmstate =3D s->tick_offset + delta / NANOSECONDS_PER_SE= COND; + + return 0; } =20 static int pl031_post_load(void *opaque, int version_id) diff --git a/hw/timer/twl92230.c b/hw/timer/twl92230.c index c0aa8ae3de..eb58c378e0 100644 --- a/hw/timer/twl92230.c +++ b/hw/timer/twl92230.c @@ -791,11 +791,13 @@ static const VMStateDescription vmstate_menelaus_tm = =3D { } }; =20 -static void menelaus_pre_save(void *opaque) +static int menelaus_pre_save(void *opaque) { MenelausState *s =3D opaque; /* Should be <=3D 1000 */ s->rtc_next_vmstate =3D s->rtc.next - qemu_clock_get_ms(rtc_clock); + + return 0; } =20 static int menelaus_post_load(void *opaque, int version_id) diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c index bef1f03c42..0c77d2a41d 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -1374,7 +1374,7 @@ static int ccid_post_load(void *opaque, int version_i= d) return 0; } =20 -static void ccid_pre_save(void *opaque) +static int ccid_pre_save(void *opaque) { USBCCIDState *s =3D opaque; =20 @@ -1386,6 +1386,8 @@ static void ccid_pre_save(void *opaque) */ s->migration_state =3D MIGRATION_MIGRATED; } + + return 0; } =20 static VMStateDescription bulk_in_vmstate =3D { diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index 604912cb3e..c2bf237e6c 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2380,7 +2380,7 @@ static USBBusOps ehci_bus_ops_standalone =3D { .wakeup_endpoint =3D ehci_wakeup_endpoint, }; =20 -static void usb_ehci_pre_save(void *opaque) +static int usb_ehci_pre_save(void *opaque) { EHCIState *ehci =3D opaque; uint32_t new_frindex; @@ -2389,6 +2389,8 @@ static void usb_ehci_pre_save(void *opaque) new_frindex =3D ehci->frindex & ~7; ehci->last_run_ns -=3D (ehci->frindex - new_frindex) * UFRAME_TIMER_NS; ehci->frindex =3D new_frindex; + + return 0; } =20 static int usb_ehci_post_load(void *opaque, int version_id) diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 5e42730449..ec174309db 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -2111,11 +2111,13 @@ static void usbredir_buffered_bulk_packet(void *pri= v, uint64_t id, * Migration code */ =20 -static void usbredir_pre_save(void *priv) +static int usbredir_pre_save(void *priv) { USBRedirDevice *dev =3D priv; =20 usbredir_fill_already_in_flight(dev); + + return 0; } =20 static int usbredir_post_load(void *priv, int version_id) diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c index 49e0022533..5ec1c6a2a2 100644 --- a/hw/virtio/vhost-vsock.c +++ b/hw/virtio/vhost-vsock.c @@ -254,13 +254,15 @@ static void vhost_vsock_post_load_timer_cb(void *opaq= ue) vhost_vsock_send_transport_reset(vsock); } =20 -static void vhost_vsock_pre_save(void *opaque) +static int vhost_vsock_pre_save(void *opaque) { VHostVSock *vsock =3D opaque; =20 /* At this point, backend must be stopped, otherwise * it might keep writing to memory. */ assert(!vsock->vhost_dev.started); + + return 0; } =20 static int vhost_vsock_post_load(void *opaque, int version_id) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 85e43da568..da46b1a36d 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -179,7 +179,7 @@ struct VMStateDescription { LoadStateHandler *load_state_old; int (*pre_load)(void *opaque); int (*post_load)(void *opaque, int version_id); - void (*pre_save)(void *opaque); + int (*pre_save)(void *opaque); bool (*needed)(void *opaque); VMStateField *fields; const VMStateDescription **subsections; diff --git a/migration/colo-comm.c b/migration/colo-comm.c index b61aa19a38..df26e4dfe7 100644 --- a/migration/colo-comm.c +++ b/migration/colo-comm.c @@ -34,11 +34,13 @@ COLOMode get_colo_mode(void) } } =20 -static void colo_info_pre_save(void *opaque) +static int colo_info_pre_save(void *opaque) { COLOInfo *s =3D opaque; =20 s->colo_requested =3D migrate_colo_enabled(); + + return 0; } =20 static bool colo_info_need(void *opaque) diff --git a/migration/global_state.c b/migration/global_state.c index dfdaf63910..8e8ab5c51e 100644 --- a/migration/global_state.c +++ b/migration/global_state.c @@ -101,12 +101,14 @@ static int global_state_post_load(void *opaque, int v= ersion_id) return 0; } =20 -static void global_state_pre_save(void *opaque) +static int global_state_pre_save(void *opaque) { GlobalState *s =3D opaque; =20 trace_migrate_global_state_pre_save((char *)s->runstate); s->size =3D strlen((char *)s->runstate) + 1; + + return 0; } =20 static const VMStateDescription vmstate_globalstate =3D { diff --git a/migration/savevm.c b/migration/savevm.c index 7a55023d1a..8d18a57ca0 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -295,7 +295,7 @@ static SaveState savevm_state =3D { .global_section_id =3D 0, }; =20 -static void configuration_pre_save(void *opaque) +static int configuration_pre_save(void *opaque) { SaveState *state =3D opaque; const char *current_name =3D MACHINE_GET_CLASS(current_machine)->name; @@ -303,6 +303,8 @@ static void configuration_pre_save(void *opaque) state->len =3D strlen(current_name); state->name =3D current_name; state->target_page_bits =3D qemu_target_page_bits(); + + return 0; } =20 static int configuration_pre_load(void *opaque) diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c index a4ded2956d..b2e10769a6 100644 --- a/replay/replay-snapshot.c +++ b/replay/replay-snapshot.c @@ -21,10 +21,12 @@ #include "migration/vmstate.h" #include "migration/snapshot.h" =20 -static void replay_pre_save(void *opaque) +static int replay_pre_save(void *opaque) { ReplayState *state =3D opaque; state->file_offset =3D ftell(replay_file); + + return 0; } =20 static int replay_post_load(void *opaque, int version_id) diff --git a/slirp/slirp.c b/slirp/slirp.c index 1d6756821c..1cb6b07004 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -1203,11 +1203,13 @@ struct sbuf_tmp { uint32_t roff, woff; }; =20 -static void sbuf_tmp_pre_save(void *opaque) +static int sbuf_tmp_pre_save(void *opaque) { struct sbuf_tmp *tmp =3D opaque; tmp->woff =3D tmp->parent->sb_wptr - tmp->parent->sb_data; tmp->roff =3D tmp->parent->sb_rptr - tmp->parent->sb_data; + + return 0; } =20 static int sbuf_tmp_post_load(void *opaque, int version) @@ -1303,7 +1305,7 @@ typedef struct SS_FamilyTmpStruct { #define SS_FAMILY_MIG_IPV6 10 /* Linux */ #define SS_FAMILY_MIG_OTHER 0xffff =20 -static void ss_family_pre_save(void *opaque) +static int ss_family_pre_save(void *opaque) { SS_FamilyTmpStruct *tss =3D opaque; =20 @@ -1314,6 +1316,8 @@ static void ss_family_pre_save(void *opaque) } else if (tss->parent->ss.ss_family =3D=3D AF_INET6) { tss->portable_family =3D SS_FAMILY_MIG_IPV6; } + + return 0; } =20 static int ss_family_post_load(void *opaque, int version_id) diff --git a/target/arm/machine.c b/target/arm/machine.c index e5fe083da4..29df7ac87d 100644 --- a/target/arm/machine.c +++ b/target/arm/machine.c @@ -394,7 +394,7 @@ static const VMStateInfo vmstate_powered_off =3D { .put =3D put_power, }; =20 -static void cpu_pre_save(void *opaque) +static int cpu_pre_save(void *opaque) { ARMCPU *cpu =3D opaque; =20 @@ -415,6 +415,8 @@ static void cpu_pre_save(void *opaque) cpu->cpreg_array_len * sizeof(uint64_t)); memcpy(cpu->cpreg_vmstate_values, cpu->cpreg_values, cpu->cpreg_array_len * sizeof(uint64_t)); + + return 0; } =20 static int cpu_post_load(void *opaque, int version_id) diff --git a/target/i386/machine.c b/target/i386/machine.c index eab33725a3..3bc11b74b7 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -160,13 +160,15 @@ static floatx80 cpu_set_fp80(uint64_t mant, uint16_t = upper) return temp.d; } =20 -static void fpreg_pre_save(void *opaque) +static int fpreg_pre_save(void *opaque) { x86_FPReg_tmp *tmp =3D opaque; =20 /* we save the real CPU data (in case of MMX usage only 'mant' contains the MMX register */ cpu_get_fp80(&tmp->tmp_mant, &tmp->tmp_exp, tmp->parent->d); + + return 0; } =20 static int fpreg_post_load(void *opaque, int version) @@ -196,7 +198,7 @@ static const VMStateDescription vmstate_fpreg =3D { } }; =20 -static void cpu_pre_save(void *opaque) +static int cpu_pre_save(void *opaque) { X86CPU *cpu =3D opaque; CPUX86State *env =3D &cpu->env; @@ -228,6 +230,7 @@ static void cpu_pre_save(void *opaque) env->segs[R_SS].flags &=3D ~(env->segs[R_SS].flags & DESC_DPL_MASK= ); } =20 + return 0; } =20 static int cpu_post_load(void *opaque, int version_id) diff --git a/target/ppc/machine.c b/target/ppc/machine.c index e36b7100cb..384caee800 100644 --- a/target/ppc/machine.c +++ b/target/ppc/machine.c @@ -146,7 +146,7 @@ static bool cpu_pre_2_8_migration(void *opaque, int ver= sion_id) return cpu->pre_2_8_migration; } =20 -static void cpu_pre_save(void *opaque) +static int cpu_pre_save(void *opaque) { PowerPCCPU *cpu =3D opaque; CPUPPCState *env =3D &cpu->env; @@ -195,6 +195,8 @@ static void cpu_pre_save(void *opaque) cpu->mig_insns_flags2 =3D env->insns_flags2 & insns_compat_mask2; cpu->mig_nb_BATs =3D env->nb_BATs; } + + return 0; } =20 /* diff --git a/target/s390x/machine.c b/target/s390x/machine.c index 097a147dbb..e1b7015d20 100644 --- a/target/s390x/machine.c +++ b/target/s390x/machine.c @@ -37,13 +37,15 @@ static int cpu_post_load(void *opaque, int version_id) return 0; } =20 -static void cpu_pre_save(void *opaque) +static int cpu_pre_save(void *opaque) { S390CPU *cpu =3D opaque; =20 if (kvm_enabled()) { kvm_s390_vcpu_interrupt_pre_save(cpu); } + + return 0; } =20 static inline bool fpu_needed(void *opaque) diff --git a/target/sparc/machine.c b/target/sparc/machine.c index 6bd6b8ee3e..8ff9dea297 100644 --- a/target/sparc/machine.c +++ b/target/sparc/machine.c @@ -88,7 +88,7 @@ static const VMStateInfo vmstate_psr =3D { .put =3D put_psr, }; =20 -static void cpu_pre_save(void *opaque) +static int cpu_pre_save(void *opaque) { SPARCCPU *cpu =3D opaque; CPUSPARCState *env =3D &cpu->env; @@ -97,6 +97,8 @@ static void cpu_pre_save(void *opaque) * window as the outs of the first window */ cpu_set_cwp(env, env->cwp); + + return 0; } =20 /* 32-bit SPARC retains migration compatibility with older versions diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c index ee292c7bee..e643ac662b 100644 --- a/tests/test-vmstate.c +++ b/tests/test-vmstate.c @@ -765,11 +765,13 @@ typedef struct TmpTestStruct { int64_t diff; } TmpTestStruct; =20 -static void tmp_child_pre_save(void *opaque) +static int tmp_child_pre_save(void *opaque) { struct TmpTestStruct *tts =3D opaque; =20 tts->diff =3D tts->parent->b - tts->parent->a; + + return 0; } =20 static int tmp_child_post_load(void *opaque, int version_id) --=20 2.13.5 From nobody Mon Apr 29 06:56:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505844175994416.1884647369451; Tue, 19 Sep 2017 11:02:55 -0700 (PDT) Received: from localhost ([::1]:44648 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMrG-0007BR-OU for importer@patchew.org; Tue, 19 Sep 2017 14:02:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36925) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMpN-0005qo-52 for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duMpK-0008Jq-Te for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41382) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1duMpK-0008HR-MD for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:54 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 90E63806A3; Tue, 19 Sep 2017 18:00:53 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-120.ams2.redhat.com [10.36.117.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F9045D980; Tue, 19 Sep 2017 18:00:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 90E63806A3 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dgilbert@redhat.com From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com, peterx@redhat.com Date: Tue, 19 Sep 2017 19:00:35 +0100 Message-Id: <20170919180038.26056-3-dgilbert@redhat.com> In-Reply-To: <20170919180038.26056-1-dgilbert@redhat.com> References: <20170919180038.26056-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 19 Sep 2017 18:00:53 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/5] migration: check pre_save return in vmstate_save_state X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, cohuck@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" Check the return value of pre_save state and fail vmstate_save_state if the pre_save failed. Signed-off-by: Dr. David Alan Gilbert --- include/migration/vmstate.h | 4 ++-- migration/trace-events | 1 + migration/vmstate.c | 18 +++++++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index da46b1a36d..88b55df5ae 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -994,8 +994,8 @@ extern const VMStateInfo vmstate_info_qtailq; =20 int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, int version_id); -void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, - void *opaque, QJSON *vmdesc); +int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, + void *opaque, QJSON *vmdesc); =20 bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque); =20 diff --git a/migration/trace-events b/migration/trace-events index d2910a6e7b..6f29fcc686 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -40,6 +40,7 @@ savevm_state_iterate(void) "" savevm_state_cleanup(void) "" savevm_state_complete_precopy(void) "" vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s" +vmstate_save_state_pre_save_res(const char *name, int res) "%s/%d" vmstate_save_state_loop(const char *name, const char *field, int n_elems) = "%s/%s[%d]" vmstate_save_state_top(const char *idstr) "%s" vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s" diff --git a/migration/vmstate.c b/migration/vmstate.c index 3226e8eb45..abff9466b7 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -308,15 +308,21 @@ bool vmstate_save_needed(const VMStateDescription *vm= sd, void *opaque) } =20 =20 -void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, +int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, QJSON *vmdesc) { + int ret =3D 0; VMStateField *field =3D vmsd->fields; =20 trace_vmstate_save_state_top(vmsd->name); =20 if (vmsd->pre_save) { - vmsd->pre_save(opaque); + ret =3D vmsd->pre_save(opaque); + trace_vmstate_save_state_pre_save_res(vmsd->name, ret); + if (ret) { + error_report("pre-save failed: %s", vmsd->name); + return ret; + } } =20 if (vmdesc) { @@ -353,7 +359,11 @@ void vmstate_save_state(QEMUFile *f, const VMStateDesc= ription *vmsd, assert(field->flags & VMS_ARRAY_OF_POINTER); vmstate_info_nullptr.put(f, curr_elem, size, NULL, NUL= L); } else if (field->flags & VMS_STRUCT) { - vmstate_save_state(f, field->vmsd, curr_elem, vmdesc_l= oop); + int ret =3D vmstate_save_state(f, field->vmsd, curr_el= em, + vmdesc_loop); + if (ret) { + return ret; + } } else { field->info->put(f, curr_elem, size, field, vmdesc_loo= p); } @@ -381,6 +391,8 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescr= iption *vmsd, } =20 vmstate_subsection_save(f, vmsd, opaque, vmdesc); + + return 0; } =20 static const VMStateDescription * --=20 2.13.5 From nobody Mon Apr 29 06:56:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505844326601452.53939809847384; Tue, 19 Sep 2017 11:05:26 -0700 (PDT) Received: from localhost ([::1]:44658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMtg-0000uS-PH for importer@patchew.org; Tue, 19 Sep 2017 14:05:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36949) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMpP-0005sR-A9 for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duMpO-0008Tx-Cl for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54534) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1duMpO-0008Rw-2a for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:58 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17EF57E459; Tue, 19 Sep 2017 18:00:57 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-120.ams2.redhat.com [10.36.117.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id D91A55D980; Tue, 19 Sep 2017 18:00:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 17EF57E459 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dgilbert@redhat.com From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com, peterx@redhat.com Date: Tue, 19 Sep 2017 19:00:36 +0100 Message-Id: <20170919180038.26056-4-dgilbert@redhat.com> In-Reply-To: <20170919180038.26056-1-dgilbert@redhat.com> References: <20170919180038.26056-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 19 Sep 2017 18:00:57 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/5] migration: wire vmstate_save_state errors up to vmstate_subsection_save X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, cohuck@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" Route the errors from vmstate_subsection_save up through vmstate_subsection_save (and back down, all rather recursive). Signed-off-by: Dr. David Alan Gilbert --- migration/vmstate.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index abff9466b7..4146992373 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -21,8 +21,8 @@ #include "trace.h" #include "qjson.h" =20 -static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription = *vmsd, - void *opaque, QJSON *vmdesc); +static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *= vmsd, + void *opaque, QJSON *vmdesc); static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *= vmsd, void *opaque); =20 @@ -390,9 +390,7 @@ int vmstate_save_state(QEMUFile *f, const VMStateDescri= ption *vmsd, json_end_array(vmdesc); } =20 - vmstate_subsection_save(f, vmsd, opaque, vmdesc); - - return 0; + return vmstate_subsection_save(f, vmsd, opaque, vmdesc); } =20 static const VMStateDescription * @@ -458,11 +456,12 @@ static int vmstate_subsection_load(QEMUFile *f, const= VMStateDescription *vmsd, return 0; } =20 -static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription = *vmsd, - void *opaque, QJSON *vmdesc) +static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *= vmsd, + void *opaque, QJSON *vmdesc) { const VMStateDescription **sub =3D vmsd->subsections; bool subsection_found =3D false; + int ret =3D 0; =20 trace_vmstate_subsection_save_top(vmsd->name); while (sub && *sub && (*sub)->needed) { @@ -486,7 +485,10 @@ static void vmstate_subsection_save(QEMUFile *f, const= VMStateDescription *vmsd, qemu_put_byte(f, len); qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len); qemu_put_be32(f, vmsdsub->version_id); - vmstate_save_state(f, vmsdsub, opaque, vmdesc); + ret =3D vmstate_save_state(f, vmsdsub, opaque, vmdesc); + if (ret) { + return ret; + } =20 if (vmdesc) { json_end_object(vmdesc); @@ -498,4 +500,6 @@ static void vmstate_subsection_save(QEMUFile *f, const = VMStateDescription *vmsd, if (vmdesc && subsection_found) { json_end_array(vmdesc); } + + return ret; } --=20 2.13.5 From nobody Mon Apr 29 06:56:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505844574899763.7424105365652; Tue, 19 Sep 2017 11:09:34 -0700 (PDT) Received: from localhost ([::1]:44684 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMxi-00043y-3c for importer@patchew.org; Tue, 19 Sep 2017 14:09:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMpQ-0005tn-Pp for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duMpP-00006i-Vl for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53124) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1duMpP-0008WK-QX for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:00:59 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BBCCFC0587E4; Tue, 19 Sep 2017 18:00:58 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-120.ams2.redhat.com [10.36.117.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6630B4F6B1; Tue, 19 Sep 2017 18:00:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com BBCCFC0587E4 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dgilbert@redhat.com From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com, peterx@redhat.com Date: Tue, 19 Sep 2017 19:00:37 +0100 Message-Id: <20170919180038.26056-5-dgilbert@redhat.com> In-Reply-To: <20170919180038.26056-1-dgilbert@redhat.com> References: <20170919180038.26056-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 19 Sep 2017 18:00:58 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/5] migration: Route errors up through vmstate_save X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, cohuck@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" Route the errors from vsmtate_save_state back up through vmstate_save and out to the normal device state path. That's the normal error path done. Signed-off-by: Dr. David Alan Gilbert --- migration/savevm.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index 8d18a57ca0..c22a2fd758 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -751,14 +751,14 @@ static void vmstate_save_old_style(QEMUFile *f, SaveS= tateEntry *se, QJSON *vmdes } } =20 -static void vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc) +static int vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc) { trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)"); if (!se->vmsd) { vmstate_save_old_style(f, se, vmdesc); - return; + return 0; } - vmstate_save_state(f, se->vmsd, se->opaque, vmdesc); + return vmstate_save_state(f, se->vmsd, se->opaque, vmdesc); } =20 /* @@ -1147,7 +1147,11 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, = bool iterable_only, json_prop_int(vmdesc, "instance_id", se->instance_id); =20 save_section_header(f, se, QEMU_VM_SECTION_FULL); - vmstate_save(f, se, vmdesc); + ret =3D vmstate_save(f, se, vmdesc); + if (ret) { + qemu_file_set_error(f, ret); + return ret; + } trace_savevm_section_end(se->idstr, se->section_id, 0); save_section_footer(f, se); =20 @@ -1289,6 +1293,8 @@ static int qemu_save_device_state(QEMUFile *f) cpu_synchronize_all_states(); =20 QTAILQ_FOREACH(se, &savevm_state.handlers, entry) { + int ret; + if (se->is_ram) { continue; } @@ -1301,7 +1307,10 @@ static int qemu_save_device_state(QEMUFile *f) =20 save_section_header(f, se, QEMU_VM_SECTION_FULL); =20 - vmstate_save(f, se, NULL); + ret =3D vmstate_save(f, se, NULL); + if (ret) { + return ret; + } =20 save_section_footer(f, se); } --=20 2.13.5 From nobody Mon Apr 29 06:56:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505844421315359.21316583134205; Tue, 19 Sep 2017 11:07:01 -0700 (PDT) Received: from localhost ([::1]:44672 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMvE-00027v-EQ for importer@patchew.org; Tue, 19 Sep 2017 14:07:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37018) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duMpS-0005vw-TG for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duMpR-0000C4-LX for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:03 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54736) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1duMpR-00009Y-Cl for qemu-devel@nongnu.org; Tue, 19 Sep 2017 14:01:01 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5C74C7E431; Tue, 19 Sep 2017 18:01:00 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-120.ams2.redhat.com [10.36.117.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0CDB45D97C; Tue, 19 Sep 2017 18:00:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5C74C7E431 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dgilbert@redhat.com From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com, peterx@redhat.com Date: Tue, 19 Sep 2017 19:00:38 +0100 Message-Id: <20170919180038.26056-6-dgilbert@redhat.com> In-Reply-To: <20170919180038.26056-1-dgilbert@redhat.com> References: <20170919180038.26056-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 19 Sep 2017 18:01:00 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 5/5] migration: Route more error paths X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, cohuck@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" vmstate_save is called in a few places, and vmstate_save_state is called in lots of places. Route error returns from the easier cases back up; there are lots of more complex cases where there own error paths need fixing. Signed-off-by: Dr. David Alan Gilbert --- hw/display/virtio-gpu.c | 4 +--- hw/virtio/virtio.c | 13 +++++++------ include/hw/virtio/virtio.h | 2 +- migration/vmstate-types.c | 11 ++++++++--- tests/test-vmstate.c | 6 +++--- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 622ee300f9..c9494e8a79 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -996,9 +996,7 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, s= ize_t size, } qemu_put_be32(f, 0); /* end of list */ =20 - vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL); - - return 0; + return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL); } =20 static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size, diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 464947f76d..860333788b 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -1899,7 +1899,7 @@ static const VMStateDescription vmstate_virtio =3D { } }; =20 -void virtio_save(VirtIODevice *vdev, QEMUFile *f) +int virtio_save(VirtIODevice *vdev, QEMUFile *f) { BusState *qbus =3D qdev_get_parent_bus(DEVICE(vdev)); VirtioBusClass *k =3D VIRTIO_BUS_GET_CLASS(qbus); @@ -1949,20 +1949,21 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f) } =20 if (vdc->vmsd) { - vmstate_save_state(f, vdc->vmsd, vdev, NULL); + int ret =3D vmstate_save_state(f, vdc->vmsd, vdev, NULL); + if (ret) { + return ret; + } } =20 /* Subsections */ - vmstate_save_state(f, &vmstate_virtio, vdev, NULL); + return vmstate_save_state(f, &vmstate_virtio, vdev, NULL); } =20 /* A wrapper for use as a VMState .put function */ static int virtio_device_put(QEMUFile *f, void *opaque, size_t size, VMStateField *field, QJSON *vmdesc) { - virtio_save(VIRTIO_DEVICE(opaque), f); - - return 0; + return virtio_save(VIRTIO_DEVICE(opaque), f); } =20 /* A wrapper for use as a VMState .get function */ diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 80c45c321e..5abada6966 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -188,7 +188,7 @@ void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned = int *in_bytes, void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq); void virtio_notify(VirtIODevice *vdev, VirtQueue *vq); =20 -void virtio_save(VirtIODevice *vdev, QEMUFile *f); +int virtio_save(VirtIODevice *vdev, QEMUFile *f); =20 extern const VMStateInfo virtio_vmstate_info; =20 diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c index c056c98bdb..48184c380d 100644 --- a/migration/vmstate-types.c +++ b/migration/vmstate-types.c @@ -550,13 +550,14 @@ static int put_tmp(QEMUFile *f, void *pv, size_t size= , VMStateField *field, { const VMStateDescription *vmsd =3D field->vmsd; void *tmp =3D g_malloc(size); + int ret; =20 /* Writes the parent field which is at the start of the tmp */ *(void **)tmp =3D pv; - vmstate_save_state(f, vmsd, tmp, vmdesc); + ret =3D vmstate_save_state(f, vmsd, tmp, vmdesc); g_free(tmp); =20 - return 0; + return ret; } =20 const VMStateInfo vmstate_info_tmp =3D { @@ -657,12 +658,16 @@ static int put_qtailq(QEMUFile *f, void *pv, size_t u= nused_size, /* offset of the QTAILQ entry in a QTAILQ element*/ size_t entry_offset =3D field->start; void *elm; + int ret; =20 trace_put_qtailq(vmsd->name, vmsd->version_id); =20 QTAILQ_RAW_FOREACH(elm, pv, entry_offset) { qemu_put_byte(f, true); - vmstate_save_state(f, vmsd, elm, vmdesc); + ret =3D vmstate_save_state(f, vmsd, elm, vmdesc); + if (ret) { + return ret; + } } qemu_put_byte(f, false); =20 diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c index e643ac662b..ab3e430c2c 100644 --- a/tests/test-vmstate.c +++ b/tests/test-vmstate.c @@ -70,7 +70,7 @@ static void save_vmstate(const VMStateDescription *desc, = void *obj) QEMUFile *f =3D open_test_file(true); =20 /* Save file with vmstate */ - vmstate_save_state(f, desc, obj, NULL); + g_assert(!vmstate_save_state(f, desc, obj, NULL)); qemu_put_byte(f, QEMU_VM_EOF); g_assert(!qemu_file_get_error(f)); qemu_fclose(f); @@ -381,7 +381,7 @@ static void test_save_noskip(void) QEMUFile *fsave =3D open_test_file(true); TestStruct obj =3D { .a =3D 1, .b =3D 2, .c =3D 3, .d =3D 4, .e =3D 5,= .f =3D 6, .skip_c_e =3D false }; - vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); + g_assert(!vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL)); g_assert(!qemu_file_get_error(fsave)); =20 uint8_t expected[] =3D { @@ -402,7 +402,7 @@ static void test_save_skip(void) QEMUFile *fsave =3D open_test_file(true); TestStruct obj =3D { .a =3D 1, .b =3D 2, .c =3D 3, .d =3D 4, .e =3D 5,= .f =3D 6, .skip_c_e =3D true }; - vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); + g_assert(!vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL)); g_assert(!qemu_file_get_error(fsave)); =20 uint8_t expected[] =3D { --=20 2.13.5