[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC 07/26] migration/postcopy: pass PostcopyPChannelConnectData w
From: |
Maciej S. Szmigiero |
Subject: |
[PATCH RFC 07/26] migration/postcopy: pass PostcopyPChannelConnectData when connecting sending preempt socket |
Date: |
Tue, 16 Apr 2024 16:42:46 +0200 |
From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
This will allow passing additional parameters there in the future.
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
---
migration/postcopy-ram.c | 68 +++++++++++++++++++++++++++++++++++-----
1 file changed, 61 insertions(+), 7 deletions(-)
diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
index e314e1023dc1..94fe872d8251 100644
--- a/migration/postcopy-ram.c
+++ b/migration/postcopy-ram.c
@@ -1617,14 +1617,62 @@ void
postcopy_preempt_new_channel(MigrationIncomingState *mis, QEMUFile *file)
trace_postcopy_preempt_new_channel();
}
+typedef struct {
+ unsigned int ref;
+ MigrationState *s;
+} PostcopyPChannelConnectData;
+
+static PostcopyPChannelConnectData
*pcopy_preempt_connect_data_new(MigrationState *s)
+{
+ PostcopyPChannelConnectData *data;
+
+ data = g_malloc0(sizeof(*data));
+ data->ref = 1;
+ data->s = s;
+
+ return data;
+}
+
+static void pcopy_preempt_connect_data_free(PostcopyPChannelConnectData *data)
+{
+ g_free(data);
+}
+
+static PostcopyPChannelConnectData *
+pcopy_preempt_connect_data_ref(PostcopyPChannelConnectData *data)
+{
+ unsigned int ref_old;
+
+ ref_old = qatomic_fetch_inc(&data->ref);
+ assert(ref_old < UINT_MAX);
+
+ return data;
+}
+
+static void pcopy_preempt_connect_data_unref(gpointer opaque)
+{
+ PostcopyPChannelConnectData *data = opaque;
+ unsigned int ref_old;
+
+ ref_old = qatomic_fetch_dec(&data->ref);
+ assert(ref_old > 0);
+ if (ref_old == 1) {
+ pcopy_preempt_connect_data_free(data);
+ }
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(PostcopyPChannelConnectData,
pcopy_preempt_connect_data_unref)
+
/*
* Setup the postcopy preempt channel with the IOC. If ERROR is specified,
* setup the error instead. This helper will free the ERROR if specified.
*/
static void
-postcopy_preempt_send_channel_done(MigrationState *s,
+postcopy_preempt_send_channel_done(PostcopyPChannelConnectData *data,
QIOChannel *ioc, Error *local_err)
{
+ MigrationState *s = data->s;
+
if (local_err) {
migrate_set_error(s, local_err);
error_free(local_err);
@@ -1645,18 +1693,19 @@ static void
postcopy_preempt_tls_handshake(QIOTask *task, gpointer opaque)
{
g_autoptr(QIOChannel) ioc = QIO_CHANNEL(qio_task_get_source(task));
- MigrationState *s = opaque;
+ PostcopyPChannelConnectData *data = opaque;
Error *local_err = NULL;
qio_task_propagate_error(task, &local_err);
- postcopy_preempt_send_channel_done(s, ioc, local_err);
+ postcopy_preempt_send_channel_done(data, ioc, local_err);
}
static void
postcopy_preempt_send_channel_new(QIOTask *task, gpointer opaque)
{
g_autoptr(QIOChannel) ioc = QIO_CHANNEL(qio_task_get_source(task));
- MigrationState *s = opaque;
+ PostcopyPChannelConnectData *data = opaque;
+ MigrationState *s = data->s;
QIOChannelTLS *tioc;
Error *local_err = NULL;
@@ -1672,14 +1721,15 @@ postcopy_preempt_send_channel_new(QIOTask *task,
gpointer opaque)
trace_postcopy_preempt_tls_handshake();
qio_channel_set_name(QIO_CHANNEL(tioc), "migration-tls-preempt");
qio_channel_tls_handshake(tioc, postcopy_preempt_tls_handshake,
- s, NULL, NULL);
+ pcopy_preempt_connect_data_ref(data),
+ pcopy_preempt_connect_data_unref, NULL);
/* Setup the channel until TLS handshake finished */
return;
}
out:
/* This handles both good and error cases */
- postcopy_preempt_send_channel_done(s, ioc, local_err);
+ postcopy_preempt_send_channel_done(data, ioc, local_err);
}
/*
@@ -1714,8 +1764,12 @@ int postcopy_preempt_establish_channel(MigrationState *s)
void postcopy_preempt_setup(MigrationState *s)
{
+ PostcopyPChannelConnectData *data;
+
+ data = pcopy_preempt_connect_data_new(s);
/* Kick an async task to connect */
- socket_send_channel_create(postcopy_preempt_send_channel_new, s, NULL);
+ socket_send_channel_create(postcopy_preempt_send_channel_new,
+ data, pcopy_preempt_connect_data_unref);
}
static void postcopy_pause_ram_fast_load(MigrationIncomingState *mis)
- [PATCH RFC 00/26] Multifd 🔀 device state transfer support with VFIO consumer, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 03/26] migration: Add send/receive header for main channel, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 01/26] migration: Add x-channel-header pseudo-capability, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 02/26] migration: Add migration channel header send/receive, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 05/26] migration: Add a DestroyNotify parameter to socket_send_channel_create(), Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 04/26] multifd: change multifd_new_send_channel_create() param type, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 06/26] multifd: pass MFDSendChannelConnectData when connecting sending socket, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 07/26] migration/postcopy: pass PostcopyPChannelConnectData when connecting sending preempt socket,
Maciej S. Szmigiero <=
- [PATCH RFC 09/26] migration: Add send/receive header for postcopy preempt channel, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 08/26] migration: Allow passing migration header in migration channel creation, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 10/26] migration: Add send/receive header for multifd channel, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 11/26] migration/options: Mapped-ram is not channel header compatible, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 12/26] migration: Enable x-channel-header pseudo-capability, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 13/26] vfio/migration: Add save_{iterate, complete_precopy}_started trace events, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 14/26] migration/ram: Add load start trace event, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 15/26] migration/multifd: Zero p->flags before starting filling a packet, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 16/26] migration: Add save_live_complete_precopy_async{, wait} handlers, Maciej S. Szmigiero, 2024/04/16
- [PATCH RFC 18/26] migration: Add load_finish handler and associated functions, Maciej S. Szmigiero, 2024/04/16