mirror of
https://github.com/qemu/qemu.git
synced 2026-02-04 05:35:39 +00:00
To make it easier to follow the code, rename the functions that start the migration thread and migration coroutine to contain the word "start". This will give new contributors the chance of seeing the word start and reaching the actual migration code, instead of twists and turns of qio_channel_add_watch and qio_task_run_in_thread. Remove all other instances of "start" and use wording more suitable to what the current migration stage is. The transport code such as fd_start_migration_outgoing becomes fd_connect_outgoing, the early setup code such as qemu_start_incoming_migration becomes qemu_setup_incoming_migration and so on. Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Prasad Pandit <pjp@fedoraproject.org> Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-18-farosas@suse.de Signed-off-by: Fabiano Rosas <farosas@suse.de>
89 lines
2.7 KiB
C
89 lines
2.7 KiB
C
/*
|
|
* QEMU live migration
|
|
*
|
|
* Copyright IBM, Corp. 2008
|
|
* Copyright Dell MessageOne 2008
|
|
* Copyright Red Hat, Inc. 2015-2016
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
* Charles Duffy <charles_duffy@messageone.com>
|
|
* Daniel P. Berrange <berrange@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
* Contributions after 2012-01-13 are licensed under the terms of the
|
|
* GNU GPL, version 2 or (at your option) any later version.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qapi/type-helpers.h"
|
|
#include "qemu/error-report.h"
|
|
#include "channel.h"
|
|
#include "exec.h"
|
|
#include "migration.h"
|
|
#include "io/channel-command.h"
|
|
#include "trace.h"
|
|
#include "qemu/cutils.h"
|
|
|
|
#ifdef WIN32
|
|
const char *exec_get_cmd_path(void)
|
|
{
|
|
g_autofree char *detected_path = g_new(char, MAX_PATH);
|
|
if (GetSystemDirectoryA(detected_path, MAX_PATH) == 0) {
|
|
warn_report("Could not detect cmd.exe path, using default.");
|
|
return "C:\\Windows\\System32\\cmd.exe";
|
|
}
|
|
pstrcat(detected_path, MAX_PATH, "\\cmd.exe");
|
|
return g_steal_pointer(&detected_path);
|
|
}
|
|
#endif
|
|
|
|
void exec_connect_outgoing(MigrationState *s, strList *command, Error **errp)
|
|
{
|
|
QIOChannel *ioc = NULL;
|
|
g_auto(GStrv) argv = strv_from_str_list(command);
|
|
const char * const *args = (const char * const *) argv;
|
|
g_autofree char *new_command = g_strjoinv(" ", (char **)argv);
|
|
|
|
trace_migration_exec_outgoing(new_command);
|
|
ioc = QIO_CHANNEL(qio_channel_command_new_spawn(args, O_RDWR, errp));
|
|
if (!ioc) {
|
|
return;
|
|
}
|
|
|
|
qio_channel_set_name(ioc, "migration-exec-outgoing");
|
|
migration_channel_connect_outgoing(s, ioc);
|
|
object_unref(OBJECT(ioc));
|
|
}
|
|
|
|
static gboolean exec_accept_incoming_migration(QIOChannel *ioc,
|
|
GIOCondition condition,
|
|
gpointer opaque)
|
|
{
|
|
migration_channel_process_incoming(ioc);
|
|
object_unref(OBJECT(ioc));
|
|
return G_SOURCE_REMOVE;
|
|
}
|
|
|
|
void exec_connect_incoming(strList *command, Error **errp)
|
|
{
|
|
QIOChannel *ioc;
|
|
g_auto(GStrv) argv = strv_from_str_list(command);
|
|
const char * const *args = (const char * const *) argv;
|
|
g_autofree char *new_command = g_strjoinv(" ", (char **)argv);
|
|
|
|
trace_migration_exec_incoming(new_command);
|
|
ioc = QIO_CHANNEL(qio_channel_command_new_spawn(args, O_RDWR, errp));
|
|
if (!ioc) {
|
|
return;
|
|
}
|
|
|
|
qio_channel_set_name(ioc, "migration-exec-incoming");
|
|
qio_channel_add_watch_full(ioc, G_IO_IN,
|
|
exec_accept_incoming_migration,
|
|
NULL, NULL,
|
|
g_main_context_get_thread_default());
|
|
}
|