This patch saves the virtio-net device's MAC address to compare with
later during the stop-and-copy phase.
Also introduce VirtIONetMigration, a per-device migration scratch
structure used to store early snapshots of VirtIONet state for later
delta comparison.
Signed-off-by: Jonah Palmer <jonah.palmer@oracle.com>
---
hw/net/virtio-net.c | 15 +++++++++++++++
include/hw/virtio/virtio-net.h | 9 +++++++++
2 files changed, 24 insertions(+)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index ca4385df1a..4f14bba510 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3869,6 +3869,7 @@ static int virtio_net_early_pre_save(void *opaque)
VirtIONet *n = opaque;
VirtIODevice *vdev = VIRTIO_DEVICE(n);
VirtIODevMigration *vdev_mig = vdev->migration;
+ VirtIONetMigration *vnet_mig = n->migration;
vdev_mig->status_early = vdev->status;
@@ -3880,6 +3881,10 @@ static int virtio_net_early_pre_save(void *opaque)
} else {
vdev_mig->config_early = NULL;
}
+
+ /* VirtIONet MAC info snapshot */
+ memcpy(vnet_mig->mac_early, n->mac, ETH_ALEN);
+
return 0;
}
@@ -4108,6 +4113,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
} else {
vdev->migration = g_new0(VirtIODevMigration, 1);
vdev->migration->early_load = false;
+ n->migration = g_new0(VirtIONetMigration, 1);
vmstate_register_any(VMSTATE_IF(n), &vmstate_virtio_net_early, n);
virtio_delta_vmsd_register(vdev);
@@ -4165,6 +4171,9 @@ static void virtio_net_device_unrealize(DeviceState *dev)
g_free(vdev->migration);
vdev->migration = NULL;
+ g_free(n->migration);
+ n->migration = NULL;
+
vmstate_unregister(VMSTATE_IF(n), &vmstate_virtio_net_early, n);
virtio_delta_vmsd_unregister(vdev);
}
@@ -4257,6 +4266,7 @@ static bool dev_unplug_pending(void *opaque)
static bool virtio_net_has_delta(VirtIONet *n, VirtIODevice *vdev)
{
VirtIODevMigration *vdev_mig = vdev->migration;
+ VirtIONetMigration *vnet_mig = n->migration;
/* Has the VirtIODevice's status changed? */
if (vdev->status != vdev_mig->status_early) {
@@ -4272,6 +4282,11 @@ static bool virtio_net_has_delta(VirtIONet *n, VirtIODevice *vdev)
return true;
}
+ /* Has the VirtIONet's MAC info changed? */
+ if (memcmp(n->mac, vnet_mig->mac_early, ETH_ALEN) != 0) {
+ return true;
+ }
+
/*
* Always return true for now until we're able to detect all possible
* changes to a VirtIONet device.
diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h
index ddb141fefc..280155366c 100644
--- a/include/hw/virtio/virtio-net.h
+++ b/include/hw/virtio/virtio-net.h
@@ -167,8 +167,17 @@ typedef struct VirtIONetQueue {
struct VirtIONet *n;
} VirtIONetQueue;
+/**
+ * struct VirtIONetMigration - VirtIONet migration structure
+ * @mac_early: MAC address early migration snapshot.
+ */
+typedef struct VirtIONetMigration {
+ uint8_t mac_early[ETH_ALEN];
+} VirtIONetMigration;
+
struct VirtIONet {
VirtIODevice parent_obj;
+ VirtIONetMigration *migration;
uint8_t mac[ETH_ALEN];
uint16_t status;
VirtIONetQueue *vqs;
--
2.51.0