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 <[email protected]>
---
 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


Reply via email to