Save VirtIONet's status field during early migration and compare it
again during stop-and-copy.

VirtIONet keeps its own status bits here, including VIRTIO_NET_S_LINK_UP
and VIRTIO_NET_S_ANNOUNCE.

Signed-off-by: Jonah Palmer <[email protected]>
---
 hw/net/virtio-net.c            | 6 ++++++
 include/hw/virtio/virtio-net.h | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 2dd130777e..88ce33b1d2 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3872,6 +3872,7 @@ static int virtio_net_early_pre_save(void *opaque)
     VirtIONetMigration *vnet_mig = n->migration;
 
     vdev_mig->status_early = vdev->status;
+    vnet_mig->status_early = n->status;
 
     /* VirtIODevice config buffer snapshot */
     g_free(vdev_mig->config_early);
@@ -4304,6 +4305,11 @@ static bool virtio_net_has_delta(VirtIONet *n, 
VirtIODevice *vdev)
         return true;
     }
 
+    /* Has the VirtIONet's status changed? */
+    if (n->status != vnet_mig->status_early) {
+        return true;
+    }
+
     /* Has the VirtIONet's MAC info changed? */
     if (memcmp(n->mac, vnet_mig->mac_early, ETH_ALEN) != 0) {
         return true;
diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h
index 1e1f1a3995..59345f1811 100644
--- a/include/hw/virtio/virtio-net.h
+++ b/include/hw/virtio/virtio-net.h
@@ -169,6 +169,7 @@ typedef struct VirtIONetQueue {
 
 /**
  * struct VirtIONetMigration - VirtIONet migration structure
+ * @status_early: VirtIONet status snapshot.
  * @mac_early: MAC address early migration snapshot.
  * @mtable_in_use_early: In-use MAC table entries.
  * @mtable_uni_overflow_early: Unicast overflow MAC table entries.
@@ -176,6 +177,7 @@ typedef struct VirtIONetQueue {
  * @mtable_macs_early: MAC table entries.
  */
 typedef struct VirtIONetMigration {
+    uint16_t status_early;
     uint8_t mac_early[ETH_ALEN];
     uint32_t mtable_in_use_early;
     uint8_t mtable_uni_overflow_early;
-- 
2.51.0


Reply via email to