From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Steve Sistare <steven.sistare@oracle.com>
Cc: qemu-devel@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
"Peter Xu" <peterx@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: Re: [PATCH V2] migration: file URI
Date: Thu, 22 Jun 2023 11:12:44 +0100 [thread overview]
Message-ID: <ZJQenKR1aMJzaLCu@redhat.com> (raw)
In-Reply-To: <1686163139-256654-1-git-send-email-steven.sistare@oracle.com>
On Wed, Jun 07, 2023 at 11:38:59AM -0700, Steve Sistare wrote:
> Extend the migration URI to support file:<filename>. This can be used for
> any migration scenario that does not require a reverse path. It can be used
> as an alternative to 'exec:cat > file' in minimized containers that do not
> contain /bin/sh, and it is easier to use than the fd:<fdname> URI. It can
> be used in HMP commands, and as a qemu command-line parameter.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
In the cases where libvirt wants to save/restore QEMU migration state
to a file, we also need to have libvirt header and XML document at the
front of the file.
IOW, if libvirt is to be able to use this new 'file:' protocol, then
it neeeds to have the ability to specify an offset too. eg so libvirt
can tell QEMU to start reading/writing at, for example, 4MB offset
from the start.
Should be fairly easy to add on top of this - just requires support
for a URI parameter, and then a seek once the file is opened.
> ---
> migration/file.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
> migration/file.h | 14 ++++++++++++
> migration/meson.build | 1 +
> migration/migration.c | 5 ++++
> migration/trace-events | 4 ++++
> qemu-options.hx | 6 ++++-
> 6 files changed, 91 insertions(+), 1 deletion(-)
> create mode 100644 migration/file.c
> create mode 100644 migration/file.h
>
> diff --git a/migration/file.c b/migration/file.c
> new file mode 100644
> index 0000000..8e35827
> --- /dev/null
> +++ b/migration/file.c
> @@ -0,0 +1,62 @@
> +/*
> + * Copyright (c) 2021-2023 Oracle and/or its affiliates.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "channel.h"
> +#include "file.h"
> +#include "migration.h"
> +#include "io/channel-file.h"
> +#include "io/channel-util.h"
> +#include "trace.h"
> +
> +void file_start_outgoing_migration(MigrationState *s, const char *filename,
> + Error **errp)
> +{
> + g_autoptr(QIOChannelFile) fioc = NULL;
> + QIOChannel *ioc;
> +
> + trace_migration_file_outgoing(filename);
> +
> + fioc = qio_channel_file_new_path(filename, O_CREAT | O_WRONLY | O_TRUNC,
> + 0600, errp);
> + if (!fioc) {
> + return;
> + }
> +
> + ioc = QIO_CHANNEL(fioc);
> + qio_channel_set_name(ioc, "migration-file-outgoing");
> + migration_channel_connect(s, ioc, NULL, NULL);
> +}
> +
> +static gboolean file_accept_incoming_migration(QIOChannel *ioc,
> + GIOCondition condition,
> + gpointer opaque)
> +{
> + migration_channel_process_incoming(ioc);
> + object_unref(OBJECT(ioc));
> + return G_SOURCE_REMOVE;
> +}
> +
> +void file_start_incoming_migration(const char *filename, Error **errp)
> +{
> + QIOChannelFile *fioc = NULL;
> + QIOChannel *ioc;
> +
> + trace_migration_file_incoming(filename);
> +
> + fioc = qio_channel_file_new_path(filename, O_RDONLY, 0, errp);
> + if (!fioc) {
> + return;
> + }
> +
> + ioc = QIO_CHANNEL(fioc);
> + qio_channel_set_name(QIO_CHANNEL(ioc), "migration-file-incoming");
> + qio_channel_add_watch_full(ioc, G_IO_IN,
> + file_accept_incoming_migration,
> + NULL, NULL,
> + g_main_context_get_thread_default());
> +}
> diff --git a/migration/file.h b/migration/file.h
> new file mode 100644
> index 0000000..841b94a
> --- /dev/null
> +++ b/migration/file.h
> @@ -0,0 +1,14 @@
> +/*
> + * Copyright (c) 2021-2023 Oracle and/or its affiliates.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#ifndef QEMU_MIGRATION_FILE_H
> +#define QEMU_MIGRATION_FILE_H
> +void file_start_incoming_migration(const char *filename, Error **errp);
> +
> +void file_start_outgoing_migration(MigrationState *s, const char *filename,
> + Error **errp);
> +#endif
> diff --git a/migration/meson.build b/migration/meson.build
> index 8ba6e42..3af817e 100644
> --- a/migration/meson.build
> +++ b/migration/meson.build
> @@ -16,6 +16,7 @@ softmmu_ss.add(files(
> 'dirtyrate.c',
> 'exec.c',
> 'fd.c',
> + 'file.c',
> 'global_state.c',
> 'migration-hmp-cmds.c',
> 'migration.c',
> diff --git a/migration/migration.c b/migration/migration.c
> index dc05c6f..cfbde86 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -20,6 +20,7 @@
> #include "migration/blocker.h"
> #include "exec.h"
> #include "fd.h"
> +#include "file.h"
> #include "socket.h"
> #include "sysemu/runstate.h"
> #include "sysemu/sysemu.h"
> @@ -442,6 +443,8 @@ static void qemu_start_incoming_migration(const char *uri, Error **errp)
> exec_start_incoming_migration(p, errp);
> } else if (strstart(uri, "fd:", &p)) {
> fd_start_incoming_migration(p, errp);
> + } else if (strstart(uri, "file:", &p)) {
> + file_start_incoming_migration(p, errp);
> } else {
> error_setg(errp, "unknown migration protocol: %s", uri);
> }
> @@ -1662,6 +1665,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
> exec_start_outgoing_migration(s, p, &local_err);
> } else if (strstart(uri, "fd:", &p)) {
> fd_start_outgoing_migration(s, p, &local_err);
> + } else if (strstart(uri, "file:", &p)) {
> + file_start_outgoing_migration(s, p, &local_err);
> } else {
> if (!(has_resume && resume)) {
> yank_unregister_instance(MIGRATION_YANK_INSTANCE);
> diff --git a/migration/trace-events b/migration/trace-events
> index cdaef7a..c8c1771 100644
> --- a/migration/trace-events
> +++ b/migration/trace-events
> @@ -307,6 +307,10 @@ migration_exec_incoming(const char *cmd) "cmd=%s"
> migration_fd_outgoing(int fd) "fd=%d"
> migration_fd_incoming(int fd) "fd=%d"
>
> +# file.c
> +migration_file_outgoing(const char *filename) "filename=%s"
> +migration_file_incoming(const char *filename) "filename=%s"
> +
> # socket.c
> migration_socket_incoming_accepted(void) ""
> migration_socket_outgoing_connected(const char *hostname) "hostname=%s"
> diff --git a/qemu-options.hx b/qemu-options.hx
> index b37eb96..b93449d 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -4610,6 +4610,7 @@ DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \
> " prepare for incoming migration, listen on\n" \
> " specified protocol and socket address\n" \
> "-incoming fd:fd\n" \
> + "-incoming file:filename\n" \
> "-incoming exec:cmdline\n" \
> " accept incoming migration on given file descriptor\n" \
> " or from given external command\n" \
> @@ -4626,7 +4627,10 @@ SRST
> Prepare for incoming migration, listen on a given unix socket.
>
> ``-incoming fd:fd``
> - Accept incoming migration from a given filedescriptor.
> + Accept incoming migration from a given file descriptor.
> +
> +``-incoming file:filename``
> + Accept incoming migration from a given file.
>
> ``-incoming exec:cmdline``
> Accept incoming migration as an output from specified external
> --
> 1.8.3.1
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2023-06-22 10:13 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-07 18:38 [PATCH V2] migration: file URI Steve Sistare
2023-06-12 18:44 ` Peter Xu
2023-06-12 19:39 ` Steven Sistare
2023-06-12 19:55 ` Peter Xu
2023-06-14 15:47 ` Fabiano Rosas
2023-06-14 15:50 ` Peter Xu
2023-06-14 17:59 ` Fabiano Rosas
2023-06-14 18:38 ` Peter Xu
2023-06-15 14:50 ` Fabiano Rosas
2023-06-20 18:36 ` Steven Sistare
2023-06-20 19:35 ` Peter Xu
2023-06-21 12:40 ` Daniel P. Berrangé
2023-06-22 10:12 ` Daniel P. Berrangé [this message]
2023-06-22 12:28 ` Steven Sistare
2023-06-22 12:20 ` Fabiano Rosas
2023-06-22 20:39 ` Steven Sistare
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZJQenKR1aMJzaLCu@redhat.com \
--to=berrange@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=steven.sistare@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).