[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for 9.0 12/12] virtio_net: register incremental migration handler
From: |
Eugenio Pérez |
Subject: |
[PATCH for 9.0 12/12] virtio_net: register incremental migration handlers |
Date: |
Fri, 15 Dec 2023 18:28:30 +0100 |
This way VirtIONet can detect when the incoming migration starts.
While registering in the backend (nc->peer) seems more logical, we need
nic dma address space, and we cannot get it from the backend.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
This could be done in vhost_vdpa or VirtIODevice struct, but future
series will add state restore through CVQ so it's easier to start in
VirtIONet directly. If we need to make this more generic, we can move
to VirtIODevice and expose callbacks from VirtIONet class.
Also, the pointer may not be the best id, but there are not a lot of
things initialized in n.
---
hw/net/virtio-net.c | 48 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 80c56f0cfc..7dd08c98b6 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -38,6 +38,7 @@
#include "qapi/qapi-events-migration.h"
#include "hw/virtio/virtio-access.h"
#include "migration/misc.h"
+#include "migration/register.h"
#include "standard-headers/linux/ethtool.h"
#include "sysemu/sysemu.h"
#include "trace.h"
@@ -3810,9 +3811,52 @@ static void virtio_net_device_unrealize(DeviceState *dev)
virtio_cleanup(vdev);
}
+static int virtio_net_load_setup(QEMUFile *f, void *opaque)
+{
+ VirtIONet *n = opaque;
+ NetClientState *nc = qemu_get_queue(n->nic);
+
+ if (nc->peer && nc->peer->info->load_setup) {
+ return nc->peer->info->load_setup(nc->peer, n->nic);
+ }
+
+ return 0;
+}
+
+static int virtio_net_load_cleanup(void *opaque)
+{
+ VirtIONet *n = opaque;
+ NetClientState *nc = qemu_get_queue(n->nic);
+
+ if (nc->peer && nc->peer->info->load_cleanup) {
+ return nc->peer->info->load_cleanup(nc->peer, n->nic);
+ }
+
+ return 0;
+}
+
+static bool virtio_net_switchover_ack_needed(void *opaque)
+{
+ VirtIONet *n = opaque;
+ NetClientState *nc = qemu_get_queue(n->nic);
+
+ if (nc->peer && nc->peer->info->load_switchover_ack_needed) {
+ return nc->peer->info->load_switchover_ack_needed(nc->peer);
+ }
+
+ return false;
+}
+
+static const SaveVMHandlers savevm_virtio_net_handlers = {
+ .load_setup = virtio_net_load_setup,
+ .load_cleanup = virtio_net_load_cleanup,
+ .switchover_ack_needed = virtio_net_switchover_ack_needed,
+};
+
static void virtio_net_instance_init(Object *obj)
{
VirtIONet *n = VIRTIO_NET(obj);
+ g_autoptr(GString) id = g_string_new(NULL);
/*
* The default config_size is sizeof(struct virtio_net_config).
@@ -3824,6 +3868,10 @@ static void virtio_net_instance_init(Object *obj)
DEVICE(n));
ebpf_rss_init(&n->ebpf_rss);
+
+ g_string_printf(id, "%p", n);
+ register_savevm_live(id->str, VMSTATE_INSTANCE_ID_ANY, 1,
+ &savevm_virtio_net_handlers, n);
}
static int virtio_net_pre_save(void *opaque)
--
2.39.3
- [PATCH for 9.0 08/12] vdpa: add vhost_vdpa_load_setup, (continued)
[PATCH for 9.0 09/12] vdpa: approve switchover after memory map in the migration destination, Eugenio Pérez, 2023/12/15
[PATCH for 9.0 03/12] vdpa: merge _begin_batch into _batch_begin_once, Eugenio Pérez, 2023/12/15
[PATCH for 9.0 10/12] vdpa: add vhost_vdpa_net_load_setup NetClient callback, Eugenio Pérez, 2023/12/15
[PATCH for 9.0 11/12] vdpa: add vhost_vdpa_net_switchover_ack_needed, Eugenio Pérez, 2023/12/15
[PATCH for 9.0 12/12] virtio_net: register incremental migration handlers,
Eugenio Pérez <=
Re: [PATCH for 9.0 00/12] Map memory at destination .load_setup in vDPA-net migration, Lei Yang, 2023/12/24
Re: [PATCH for 9.0 00/12] Map memory at destination .load_setup in vDPA-net migration, Michael S. Tsirkin, 2023/12/25