[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 21/41] virtio: port to vmstate
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PATCH 21/41] virtio: port to vmstate |
Date: |
Wed, 2 Dec 2009 13:04:19 +0100 |
We need to do the virt queue msix and not msix version because we know
if there is msix at virtio level, not at queue element level
Signed-off-by: Juan Quintela <address@hidden>
---
hw/hw.h | 10 +++++
hw/virtio.c | 121 ++++++++++++++++++++++++++++++++---------------------------
hw/virtio.h | 5 ++
3 files changed, 81 insertions(+), 55 deletions(-)
diff --git a/hw/hw.h b/hw/hw.h
index 5f34991..747a311 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -476,6 +476,16 @@ extern const VMStateInfo vmstate_info_unused_buffer;
.offset = vmstate_offset_array(_state, _field, _type, _num), \
}
+#define VMSTATE_VARRAY_STRUCT_INT32(_field, _state, _field_num, _test, _vmsd,
_type) {\
+ .name = (stringify(_field)), \
+ .field_exists = (_test), \
+ .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
+ .vmsd = &(_vmsd), \
+ .size = sizeof(_type), \
+ .flags = VMS_VARRAY_INT32|VMS_POINTER|VMS_STRUCT, \
+ .offset = vmstate_offset_pointer(_state, _field, _type), \
+}
+
#define VMSTATE_STATIC_BUFFER(_field, _state, _version, _test, _start, _size)
{ \
.name = (stringify(_field)), \
.version_id = (_version), \
diff --git a/hw/virtio.c b/hw/virtio.c
index 5497716..73dae7c 100644
--- a/hw/virtio.c
+++ b/hw/virtio.c
@@ -625,10 +625,19 @@ static bool is_virtio_pci(void *opaque, int version_id)
static bool is_virtio_msix(void *opaque, int version_id)
{
VirtIODevice *vdev = opaque;
+
return (vdev->type == VIRTIO_PCI) &&
virtio_pci_msix_present(vdev->binding_opaque);
}
+static bool is_virtio_not_msix(void *opaque, int version_id)
+{
+ VirtIODevice *vdev = opaque;
+
+ return !((vdev->type == VIRTIO_PCI) &&
+ virtio_pci_msix_present(vdev->binding_opaque));
+}
+
static void virtio_pre_save(void *opaque)
{
VirtIODevice *vdev = opaque;
@@ -641,34 +650,6 @@ static void virtio_pre_save(void *opaque)
vdev->num_pci_queues = i;
}
-void virtio_save(VirtIODevice *vdev, QEMUFile *f)
-{
- int i;
-
- virtio_pre_save(vdev);
-
- if (is_virtio_pci(vdev, 1))
- vmstate_save_state(f, &vmstate_virtio_pci_config,
vdev->binding_opaque);
-
- qemu_put_8s(f, &vdev->status);
- qemu_put_8s(f, &vdev->isr);
- qemu_put_be16s(f, &vdev->queue_sel);
- qemu_put_be32s(f, &vdev->features);
- qemu_put_sbe32s(f, &vdev->config_len);
- qemu_put_buffer(f, vdev->config, vdev->config_len);
-
- qemu_put_sbe32s(f, &vdev->num_pci_queues);
-
- for (i = 0; i < vdev->num_pci_queues; i++) {
- qemu_put_be32s(f, &vdev->vq[i].vring.num);
- qemu_put_be64s(f, &vdev->vq[i].pa);
- qemu_put_be16s(f, &vdev->vq[i].last_avail_idx);
- if (is_virtio_msix(vdev, 1)) {
- qemu_put_be16s(f, &vdev->vq[i].vector);
- }
- }
-}
-
static int virtio_post_load(void *opaque, int version_id)
{
VirtIODevice *vdev = opaque;
@@ -695,38 +676,68 @@ static int virtio_post_load(void *opaque, int version_id)
return 0;
}
-
-int virtio_load(VirtIODevice *vdev, QEMUFile *f)
-{
- int i, ret;
-
- if (is_virtio_pci(vdev, 1)) {
- ret = vmstate_load_state(f, &vmstate_virtio_pci_config,
vdev->binding_opaque,
- vmstate_virtio_pci_config.version_id);
- if (ret)
- return ret;
+static const VMStateDescription vmstate_virtio_pci_queue = {
+ .name = "virtio_pci_queue",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField []) {
+ VMSTATE_UINT32(vring.num, VirtQueue),
+ VMSTATE_UINT64(pa, VirtQueue),
+ VMSTATE_UINT16(last_avail_idx, VirtQueue),
+ VMSTATE_END_OF_LIST()
}
+};
- qemu_get_8s(f, &vdev->status);
- qemu_get_8s(f, &vdev->isr);
- qemu_get_be16s(f, &vdev->queue_sel);
- qemu_get_be32s(f, &vdev->features);
- qemu_get_sbe32s(f, &vdev->config_len);
- qemu_get_buffer(f, vdev->config, vdev->config_len);
+static const VMStateDescription vmstate_virtio_pci_queue_msix = {
+ .name = "virtio_pci_queue_msix",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField []) {
+ VMSTATE_UINT32(vring.num, VirtQueue),
+ VMSTATE_UINT64(pa, VirtQueue),
+ VMSTATE_UINT16(last_avail_idx, VirtQueue),
+ VMSTATE_UINT16(vector, VirtQueue),
+ VMSTATE_END_OF_LIST()
+ }
+};
- qemu_get_sbe32s(f, &vdev->num_pci_queues);
+const VMStateDescription vmstate_virtio = {
+ .name = "virtio",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .post_load = virtio_post_load,
+ .pre_save = virtio_pre_save,
+ .fields = (VMStateField []) {
+ VMSTATE_STRUCT_POINTER_TEST(binding_opaque, VirtIODevice,
is_virtio_pci,
+ vmstate_virtio_pci_config, void *),
+ VMSTATE_UINT8(status, VirtIODevice),
+ VMSTATE_UINT8(isr, VirtIODevice),
+ VMSTATE_UINT16(queue_sel, VirtIODevice),
+ VMSTATE_UINT32(features, VirtIODevice),
+ VMSTATE_INT32(config_len, VirtIODevice),
+ VMSTATE_PARTIAL_VBUFFER(config, VirtIODevice, config_len),
+ VMSTATE_INT32(num_pci_queues, VirtIODevice),
+ VMSTATE_VARRAY_STRUCT_INT32(vq, VirtIODevice, num_pci_queues,
+ is_virtio_msix,
+ vmstate_virtio_pci_queue_msix, VirtQueue),
+ VMSTATE_VARRAY_STRUCT_INT32(vq, VirtIODevice, num_pci_queues,
+ is_virtio_not_msix,
+ vmstate_virtio_pci_queue, VirtQueue),
+ VMSTATE_END_OF_LIST()
+ }
+};
- for (i = 0; i < vdev->num_pci_queues; i++) {
- qemu_get_be32s(f, &vdev->vq[i].vring.num);
- qemu_get_be64s(f, &vdev->vq[i].pa);
- qemu_get_be16s(f, &vdev->vq[i].last_avail_idx);
+void virtio_save(VirtIODevice *vdev, QEMUFile *f)
+{
+ vmstate_save_state(f, &vmstate_virtio, vdev);
+}
- if (is_virtio_msix(vdev, 1)) {
- qemu_get_be16s(f, &vdev->vq[i].vector);
- }
- }
- virtio_post_load(vdev, 1);
- return 0;
+int virtio_load(VirtIODevice *vdev, QEMUFile *f)
+{
+ return vmstate_load_state(f, &vmstate_virtio, vdev,
vmstate_virtio.version_id);
}
void virtio_cleanup(VirtIODevice *vdev)
diff --git a/hw/virtio.h b/hw/virtio.h
index f56f672..ac7b8eb 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -130,6 +130,11 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int
out_bytes);
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
+extern const VMStateDescription vmstate_virtio;
+
+#define VMSTATE_VIRTIO(_field, _state)
\
+ VMSTATE_STRUCT_TEST(_field, _state, NULL, 0, vmstate_virtio, VirtIODevice)
+
void virtio_save(VirtIODevice *vdev, QEMUFile *f);
int virtio_load(VirtIODevice *vdev, QEMUFile *f);
--
1.6.5.2
- [Qemu-devel] [PATCH 15/41] virtio: remove save/load_queue for virtio, (continued)
[Qemu-devel] [PATCH 16/41] virtio: Add num_pci_queues field, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 17/41] virtio: split virtio_post_load() from virtio_load(), Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 18/41] virtio: change config_len type to int32_t, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 21/41] virtio: port to vmstate,
Juan Quintela <=
[Qemu-devel] [PATCH 19/41] virtio: use the right types for VirtQueue elements, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 20/41] virtio: abstract test for save/load values, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 22/41] virtio-net: change tx_timer_active to uint32_t, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 23/41] virtio-net: change mergeable_rx_bufs to uint32_t, Juan Quintela, 2009/12/02
[Qemu-devel] [PATCH 24/41] virtio-net: use type checking version of qemu_put/get-*, Juan Quintela, 2009/12/02