We can't rely on build switches to tell us if a save image includes a given field. We also need to save status since it's visible to the guest. Draw another line in the sand for broken save versions. The version number should always be updated when new values are saved and load should make an attempt to set reasonable defaults for lower version save images.
Signed-off-by: Alex Williamson <[email protected]> --- qemu/hw/virtio-net.c | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c index 358c382..6ce2ff5 100644 --- a/qemu/hw/virtio-net.c +++ b/qemu/hw/virtio-net.c @@ -21,6 +21,8 @@ #define TAP_VNET_HDR +#define VIRTIO_NET_VM_VERSION 3 + typedef struct VirtIONet { VirtIODevice vdev; @@ -368,6 +370,11 @@ static void virtio_net_tx_timer(void *opaque) virtio_net_flush_tx(n, n->tx_vq); } +/* + * Anything added here should cause a bump in VIRTIO_NET_VM_VERSION + * and appropriate conditionalized load with sane defaults for older + * images should be added to virtio_net_load(). + */ static void virtio_net_save(QEMUFile *f, void *opaque) { VirtIONet *n = opaque; @@ -380,14 +387,18 @@ static void virtio_net_save(QEMUFile *f, void *opaque) #ifdef TAP_VNET_HDR qemu_put_be32(f, tap_has_vnet_hdr(n->vc->vlan->first_client)); +#else + qemu_put_be32(f, 0); #endif + + qemu_put_be16(f, n->status); } static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) { VirtIONet *n = opaque; - if (version_id != 2) + if (version_id < 3 || version_id > VIRTIO_NET_VM_VERSION) return -EINVAL; virtio_load(&n->vdev, f); @@ -399,8 +410,12 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) #ifdef TAP_VNET_HDR if (qemu_get_be32(f)) tap_using_vnet_hdr(n->vc->vlan->first_client, 1); +#else + qemu_get_be32(f); #endif + n->status = qemu_get_be16(f); + if (n->tx_timer_active) { qemu_mod_timer(n->tx_timer, qemu_get_clock(vm_clock) + TX_TIMER_INTERVAL); @@ -439,7 +454,7 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) n->tx_timer_active = 0; n->mergeable_rx_bufs = 0; - register_savevm("virtio-net", virtio_net_id++, 2, + register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, virtio_net_save, virtio_net_load, n); return (PCIDevice *)n; -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
