qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

migration: Route more error paths

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 their own error paths need fixing.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20170925112917.21340-7-dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Commit message fix up as Peter's review

+23 -16
+1 -3
hw/display/virtio-gpu.c
··· 1050 1050 } 1051 1051 qemu_put_be32(f, 0); /* end of list */ 1052 1052 1053 - vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL); 1054 - 1055 - return 0; 1053 + return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL); 1056 1054 } 1057 1055 1058 1056 static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
+7 -6
hw/virtio/virtio.c
··· 1897 1897 } 1898 1898 }; 1899 1899 1900 - void virtio_save(VirtIODevice *vdev, QEMUFile *f) 1900 + int virtio_save(VirtIODevice *vdev, QEMUFile *f) 1901 1901 { 1902 1902 BusState *qbus = qdev_get_parent_bus(DEVICE(vdev)); 1903 1903 VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); ··· 1947 1947 } 1948 1948 1949 1949 if (vdc->vmsd) { 1950 - vmstate_save_state(f, vdc->vmsd, vdev, NULL); 1950 + int ret = vmstate_save_state(f, vdc->vmsd, vdev, NULL); 1951 + if (ret) { 1952 + return ret; 1953 + } 1951 1954 } 1952 1955 1953 1956 /* Subsections */ 1954 - vmstate_save_state(f, &vmstate_virtio, vdev, NULL); 1957 + return vmstate_save_state(f, &vmstate_virtio, vdev, NULL); 1955 1958 } 1956 1959 1957 1960 /* A wrapper for use as a VMState .put function */ 1958 1961 static int virtio_device_put(QEMUFile *f, void *opaque, size_t size, 1959 1962 VMStateField *field, QJSON *vmdesc) 1960 1963 { 1961 - virtio_save(VIRTIO_DEVICE(opaque), f); 1962 - 1963 - return 0; 1964 + return virtio_save(VIRTIO_DEVICE(opaque), f); 1964 1965 } 1965 1966 1966 1967 /* A wrapper for use as a VMState .get function */
+1 -1
include/hw/virtio/virtio.h
··· 188 188 void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq); 189 189 void virtio_notify(VirtIODevice *vdev, VirtQueue *vq); 190 190 191 - void virtio_save(VirtIODevice *vdev, QEMUFile *f); 191 + int virtio_save(VirtIODevice *vdev, QEMUFile *f); 192 192 193 193 extern const VMStateInfo virtio_vmstate_info; 194 194
+8 -3
migration/vmstate-types.c
··· 550 550 { 551 551 const VMStateDescription *vmsd = field->vmsd; 552 552 void *tmp = g_malloc(size); 553 + int ret; 553 554 554 555 /* Writes the parent field which is at the start of the tmp */ 555 556 *(void **)tmp = pv; 556 - vmstate_save_state(f, vmsd, tmp, vmdesc); 557 + ret = vmstate_save_state(f, vmsd, tmp, vmdesc); 557 558 g_free(tmp); 558 559 559 - return 0; 560 + return ret; 560 561 } 561 562 562 563 const VMStateInfo vmstate_info_tmp = { ··· 657 658 /* offset of the QTAILQ entry in a QTAILQ element*/ 658 659 size_t entry_offset = field->start; 659 660 void *elm; 661 + int ret; 660 662 661 663 trace_put_qtailq(vmsd->name, vmsd->version_id); 662 664 663 665 QTAILQ_RAW_FOREACH(elm, pv, entry_offset) { 664 666 qemu_put_byte(f, true); 665 - vmstate_save_state(f, vmsd, elm, vmdesc); 667 + ret = vmstate_save_state(f, vmsd, elm, vmdesc); 668 + if (ret) { 669 + return ret; 670 + } 666 671 } 667 672 qemu_put_byte(f, false); 668 673
+6 -3
tests/test-vmstate.c
··· 70 70 QEMUFile *f = open_test_file(true); 71 71 72 72 /* Save file with vmstate */ 73 - vmstate_save_state(f, desc, obj, NULL); 73 + int ret = vmstate_save_state(f, desc, obj, NULL); 74 + g_assert(!ret); 74 75 qemu_put_byte(f, QEMU_VM_EOF); 75 76 g_assert(!qemu_file_get_error(f)); 76 77 qemu_fclose(f); ··· 381 382 QEMUFile *fsave = open_test_file(true); 382 383 TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6, 383 384 .skip_c_e = false }; 384 - vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); 385 + int ret = vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); 386 + g_assert(!ret); 385 387 g_assert(!qemu_file_get_error(fsave)); 386 388 387 389 uint8_t expected[] = { ··· 402 404 QEMUFile *fsave = open_test_file(true); 403 405 TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6, 404 406 .skip_c_e = true }; 405 - vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); 407 + int ret = vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL); 408 + g_assert(!ret); 406 409 g_assert(!qemu_file_get_error(fsave)); 407 410 408 411 uint8_t expected[] = {