Skip to contentSkip to conversation

qemu: virtio save/load bindings

PATCH In review Michael S. Tsirkin 4 participants 7 messages May 25, 2009 – Jun 3, 2009

Subsystems (2)
lore
Share & tools
lore

Michael S. Tsirkin

author maintainer
#0 lore raw

PATCH 1/1 qemu: virtio save/load bindings

Implement bindings for virtio save/load. Use them in virtio pci.

---

Is anyone working to fill in load/save bindings so that saving virtio devices works? Here's a trivial patch to do this (this one is on top of my MSI-X patchset).
Comments?

 hw/virtio-pci.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/virtio.c     |   31 ++++++++++++++-----------------
 hw/virtio.h     |    4 ++++
 3 files changed, 66 insertions(+), 18 deletions(-)
hw/virtio-pci.c +48 -1
index 294f4c7..589fbb1 100644
@@ -105,6 +105,48 @@ static void virtio_pci_notify(void *opaque, uint16_t vector)
         qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
 }
 
+static void virtio_pci_save_config(void * opaque, QEMUFile *f)
+{
+    VirtIOPCIProxy *proxy = opaque;
+    pci_device_save(&proxy->pci_dev, f);
+    msix_save(&proxy->pci_dev, f);
+    if (msix_present(&proxy->pci_dev))
+        qemu_put_be16(f, proxy->vdev->config_vector);
+}
+
+static void virtio_pci_save_queue(void * opaque, int n, QEMUFile *f)
+{
+    VirtIOPCIProxy *proxy = opaque;
+    if (msix_present(&proxy->pci_dev))
+        qemu_put_be16(f, virtio_queue_vector(proxy->vdev, n));
+}
+
+static int virtio_pci_load_config(void * opaque, QEMUFile *f)
+{
+    VirtIOPCIProxy *proxy = opaque;
+    int ret;
+    ret = pci_device_load(&proxy->pci_dev, f);
+    if (ret)
+        return ret;
+    ret = msix_load(&proxy->pci_dev, f);
+    if (ret)
+        return ret;
+    if (msix_present(&proxy->pci_dev))
+        qemu_get_be16s(f, &proxy->vdev->config_vector);
+    return 0;
+}
+
+static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
+{
+    VirtIOPCIProxy *proxy = opaque;
+    uint16_t vector;
+    if (!msix_present(&proxy->pci_dev))
+        return 0;
+    qemu_get_be16s(f, &vector);
+    virtio_queue_set_vector(proxy->vdev, n, vector);
+    return 0;
+}
+
 static void virtio_pci_reset(void *opaque)
 {
     VirtIOPCIProxy *proxy = opaque;
@@ -317,7 +359,12 @@ static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
 }
 
 static const VirtIOBindings virtio_pci_bindings = {
-    .notify = virtio_pci_notify
+    .notify = virtio_pci_notify,
+    .save_config = virtio_pci_save_config,
+    .load_config = virtio_pci_load_config,
+    .save_config = virtio_pci_save_config,
+    .save_queue = virtio_pci_save_queue,
+    .load_queue = virtio_pci_load_queue,
 };
 
 static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,
hw/virtio.c +14 -17
index 63ffcff..b773dff 100644
@@ -568,9 +568,8 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     int i;
 
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);
+    if (vdev->binding->save_config)
+        vdev->binding->save_config(vdev->binding_opaque, f);
 
     qemu_put_8s(f, &vdev->status);
     qemu_put_8s(f, &vdev->isr);
@@ -596,19 +595,20 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
         qemu_put_be32(f, vdev->vq[i].vring.num);
         qemu_put_be64(f, vdev->vq[i].pa);
         qemu_put_be16s(f, &vdev->vq[i].last_avail_idx);
-        if (vdev->nvectors)
-            qemu_put_be16s(f, &vdev->vq[i].vector);
+        if (vdev->binding->save_queue)
+            vdev->binding->save_queue(vdev->binding_opaque, i, f);
     }
 }
 
 int virtio_load(VirtIODevice *vdev, QEMUFile *f)
 {
-    int num, i;
+    int num, i, ret;
 
-    /* FIXME: load/save binding.  */
-    //pci_device_load(&vdev->pci_dev, f);
-    //r = msix_load(&vdev->pci_dev, f);
-    //pci_resize_io_region(&vdev->pci_dev, 1, msix_bar_size(&vdev->pci_dev));
+    if (vdev->binding->load_config) {
+        ret = vdev->binding->load_config(vdev->binding_opaque, f);
+        if (ret)
+            return ret;
+    }
 
     qemu_get_8s(f, &vdev->status);
     qemu_get_8s(f, &vdev->isr);
@@ -617,10 +617,6 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
     vdev->config_len = qemu_get_be32(f);
     qemu_get_buffer(f, vdev->config, vdev->config_len);
 
-    if (vdev->nvectors) {
-        qemu_get_be16s(f, &vdev->config_vector);
-        //msix_vector_use(&vdev->pci_dev, vdev->config_vector);
-    }
     num = qemu_get_be32(f);
 
     for (i = 0; i < num; i++) {
@@ -631,9 +627,10 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
         if (vdev->vq[i].pa) {
             virtqueue_init(&vdev->vq[i]);
         }
-        if (vdev->nvectors) {
-            qemu_get_be16s(f, &vdev->vq[i].vector);
-            //msix_vector_use(&vdev->pci_dev, vdev->config_vector);
+        if (vdev->binding->load_queue) {
+            ret = vdev->binding->load_queue(vdev->binding_opaque, i, f);
+            if (ret)
+                return ret;
         }
     }
 
hw/virtio.h +4 -0
index 04a3c3d..ce05517 100644
@@ -72,6 +72,10 @@ typedef struct VirtQueueElement
 
 typedef struct {
     void (*notify)(void * opaque, uint16_t vector);
+    void (*save_config)(void * opaque, QEMUFile *f);
+    void (*save_queue)(void * opaque, int n, QEMUFile *f);
+    int (*load_config)(void * opaque, QEMUFile *f);
+    int (*load_queue)(void * opaque, int n, QEMUFile *f);
 } VirtIOBindings;
 
 #define VIRTIO_PCI_QUEUE_MAX 16
Signature · 1 line
1.6.3.1.56.g79e1.dirty
#1 lore raw
Quoted 21 lines · Michael S. Tsirkin

Implement bindings for virtio save/load. Use them in virtio pci.

---

Is anyone working to fill in load/save bindings so that saving virtio devices works? Here's a trivial patch to do this (this one is on top of my MSI-X patchset).
Comments?

 hw/virtio-pci.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/virtio.c     |   31 ++++++++++++++-----------------
 hw/virtio.h     |    4 ++++
 3 files changed, 66 insertions(+), 18 deletions(-)

static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,

hw/virtio.c +0 -0
index 63ffcff..b773dff 100644

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 571

Quoted 7 lines
hw/virtio.c +0 -3
@@ -568,9 +568,8 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     int i;
 
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);
 

qdev regressed save/restore? What else is broken right now from the qdev commit?

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

Regards,

Anthony Liguori

#2 lore raw
In reply to Michael S. Tsirkin
Quoted 21 lines · Michael S. Tsirkin

Implement bindings for virtio save/load. Use them in virtio pci.

---

Is anyone working to fill in load/save bindings so that saving virtio devices works? Here's a trivial patch to do this (this one is on top of my MSI-X patchset).
Comments?

 hw/virtio-pci.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/virtio.c     |   31 ++++++++++++++-----------------
 hw/virtio.h     |    4 ++++
 3 files changed, 66 insertions(+), 18 deletions(-)

static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,

hw/virtio.c +0 -0
index 63ffcff..b773dff 100644

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 571

Quoted 7 lines
hw/virtio.c +0 -3
@@ -568,9 +568,8 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     int i;
 
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);
 

qdev regressed save/restore? What else is broken right now from the qdev commit?

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

Regards,

Anthony Liguori

#3 lore raw
Quoted 10 lines

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 573

Quoted 3 lines
hw/virtio.c +0 -3
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);

qdev regressed save/restore? What else is broken right now from the qdev commit?

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

Sorry, this one apparently slipped past. I#'d intended to fix it, but apparently never ported that bit of the patch.

Paul

#4 lore raw
In reply to Anthony Liguori
Quoted 10 lines

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 573

Quoted 3 lines
hw/virtio.c +0 -3
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);

qdev regressed save/restore? What else is broken right now from the qdev commit?

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

Sorry, this one apparently slipped past. I#'d intended to fix it, but apparently never ported that bit of the patch.

Paul

#5 lore raw
In reply to Anthony Liguori
Quoted 35 lines · Anthony Liguori
Quoted 23 lines · Michael S. Tsirkin

Implement bindings for virtio save/load. Use them in virtio pci.

---

Is anyone working to fill in load/save bindings so that saving virtio devices works? Here's a trivial patch to do this (this one is on top of my
MSI-X patchset).
Comments?

 hw/virtio-pci.c |   49 
++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/virtio.c     |   31 ++++++++++++++-----------------
 hw/virtio.h     |    4 ++++
 3 files changed, 66 insertions(+), 18 deletions(-)

static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,

hw/virtio.c +0 -0
index 63ffcff..b773dff 100644

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 571

Quoted 7 lines
hw/virtio.c +0 -3
@@ -568,9 +568,8 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     int i;
 
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);
 

qdev regressed save/restore? What else is broken right now from the qdev commit?

Quoted 4 lines

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

virtio is still broken. Anthony, are you planning to commit this patch?

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
#6 lore raw
In reply to Anthony Liguori
Quoted 26 lines · Anthony Liguori
Quoted 25 lines · Michael S. Tsirkin

Implement bindings for virtio save/load. Use them in virtio pci.

---

Is anyone working to fill in load/save bindings so that saving virtio devices works? Here's a trivial patch to do this (this one is on top of my MSI-X patchset).
Comments?

 hw/virtio-pci.c |   49 
++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/virtio.c     |   31 ++++++++++++++-----------------
 hw/virtio.h     |    4 ++++
 3 files changed, 66 insertions(+), 18 deletions(-)

static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,

hw/virtio.c +0 -0
index 63ffcff..b773dff 100644
@@ -568,9 +568,8 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     int i;
 
Quoted 9 lines

hw/virtio.c void virtio_save(VirtIODevice *vdev, QEMUFile *f) · line 573

Quoted 4 lines
hw/virtio.c +0 -3
-    /* FIXME: load/save binding.  */
-    //pci_device_save(&vdev->pci_dev, f);
-    //msix_save(&vdev->pci_dev, f);
 

qdev regressed save/restore? What else is broken right now from the qdev commit?

I'm beginning to think committing in the state it was in was a mistake. Paul, can you put together a TODO so that we know all of the things that have regressed so we can get things back into shape?

virtio is still broken. Anthony, are you planning to commit this patch?

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.