[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 01/45] Fix virtio migration
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL v2 01/45] Fix virtio migration |
Date: |
Sat, 6 Feb 2016 21:12:11 +0200 |
From: "Dr. David Alan Gilbert" <address@hidden>
I misunderstood the vmstate macro definition when I reworked the
virtio .get/.put.
The VMSTATE_STRUCT_VARRAY_KNOWN, was described as being for "a
variable length array (i.e. _type *_field) but we know the
length". However it actually specified operation for arrays embedded in
the struct (i.e. _type _field[]) since it lacked the VMS_POINTER
flag. This caused offset calculation to be completely off, examining and
potentially sending random data instead of the VirtQueue content.
Replace the otherwise unused VMSTATE_STRUCT_VARRAY_KNOWN with a
VMSTATE_STRUCT_VARRAY_POINTER_KNOWN that includes the VMS_POINTER flag
(so now actually doing what it advertises) and use it in the virtio
migration code.
Fixes and description as per Sascha's suggestions/debug.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Reported-by: Sascha Silbe <address@hidden>
Tested-By: Sascha Silbe <address@hidden>
Reviewed-By: Sascha Silbe <address@hidden>
Fixes: 50e5ae4dc3e4f21e874512f9e87b93b5472d26e0
Fixes: 2cf0148674430b6693c60d42b7eef721bfa9509f
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
Tested-by: Cornelia Huck <address@hidden>
---
include/migration/vmstate.h | 18 +++++++++---------
hw/virtio/virtio.c | 8 ++++----
2 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index a4b81bb..7246f29 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -386,26 +386,26 @@ extern const VMStateInfo vmstate_info_bitmap;
.offset = vmstate_offset_array(_state, _field, _type, _num),\
}
-/* a variable length array (i.e. _type *_field) but we know the
- * length
- */
-#define VMSTATE_STRUCT_VARRAY_KNOWN(_field, _state, _num, _version, _vmsd,
_type) { \
+#define VMSTATE_STRUCT_VARRAY_UINT8(_field, _state, _field_num, _version,
_vmsd, _type) { \
.name = (stringify(_field)), \
- .num = (_num), \
+ .num_offset = vmstate_offset_value(_state, _field_num, uint8_t), \
.version_id = (_version), \
.vmsd = &(_vmsd), \
.size = sizeof(_type), \
- .flags = VMS_STRUCT|VMS_ARRAY, \
+ .flags = VMS_STRUCT|VMS_VARRAY_UINT8, \
.offset = offsetof(_state, _field), \
}
-#define VMSTATE_STRUCT_VARRAY_UINT8(_field, _state, _field_num, _version,
_vmsd, _type) { \
+/* a variable length array (i.e. _type *_field) but we know the
+ * length
+ */
+#define VMSTATE_STRUCT_VARRAY_POINTER_KNOWN(_field, _state, _num, _version,
_vmsd, _type) { \
.name = (stringify(_field)), \
- .num_offset = vmstate_offset_value(_state, _field_num, uint8_t), \
+ .num = (_num), \
.version_id = (_version), \
.vmsd = &(_vmsd), \
.size = sizeof(_type), \
- .flags = VMS_STRUCT|VMS_VARRAY_UINT8, \
+ .flags = VMS_STRUCT|VMS_ARRAY|VMS_POINTER, \
.offset = offsetof(_state, _field), \
}
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 63a7b6d..0603793 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1143,8 +1143,8 @@ static const VMStateDescription vmstate_virtio_virtqueues
= {
.minimum_version_id = 1,
.needed = &virtio_virtqueue_needed,
.fields = (VMStateField[]) {
- VMSTATE_STRUCT_VARRAY_KNOWN(vq, struct VirtIODevice, VIRTIO_QUEUE_MAX,
- 0, vmstate_virtqueue, VirtQueue),
+ VMSTATE_STRUCT_VARRAY_POINTER_KNOWN(vq, struct VirtIODevice,
+ VIRTIO_QUEUE_MAX, 0, vmstate_virtqueue, VirtQueue),
VMSTATE_END_OF_LIST()
}
};
@@ -1165,8 +1165,8 @@ static const VMStateDescription vmstate_virtio_ringsize =
{
.minimum_version_id = 1,
.needed = &virtio_ringsize_needed,
.fields = (VMStateField[]) {
- VMSTATE_STRUCT_VARRAY_KNOWN(vq, struct VirtIODevice, VIRTIO_QUEUE_MAX,
- 0, vmstate_ringsize, VirtQueue),
+ VMSTATE_STRUCT_VARRAY_POINTER_KNOWN(vq, struct VirtIODevice,
+ VIRTIO_QUEUE_MAX, 0, vmstate_ringsize, VirtQueue),
VMSTATE_END_OF_LIST()
}
};
--
MST
- [Qemu-devel] [PULL v2 00/45] pc and misc cleanups and fixes, virtio optimizations, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 01/45] Fix virtio migration,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL v2 02/45] pc: acpi: merge SSDT into DSDT, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 03/45] tests: pc: acpi: drop not needed 'expected SSDT' blobs, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 04/45] tests: pc: acpi: add expected DSDT.bridge blobs and update DSDT blobs, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 05/45] virtio: move VirtQueueElement at the beginning of the structs, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 07/45] virtio: introduce qemu_get/put_virtqueue_element, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 08/45] virtio: introduce virtqueue_alloc_element, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 09/45] virtio: slim down allocation of VirtQueueElements, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 06/45] virtio: move allocation to virtqueue_pop/vring_pop, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 10/45] vring: slim down allocation of VirtQueueElements, Michael S. Tsirkin, 2016/02/06
- [Qemu-devel] [PULL v2 12/45] virtio: cache used_idx in a VirtQueue field, Michael S. Tsirkin, 2016/02/06