qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Steven Sistare <steven.sistare@oracle.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, Peter Xu <peterx@redhat.com>,
	Juan Quintela <quintela@redhat.com>,
	Fabiano Rosas <farosas@suse.de>
Subject: Re: [PATCH V4 1/2] migration: file URI
Date: Wed, 30 Aug 2023 10:15:43 -0400	[thread overview]
Message-ID: <2dbbaf06-81cb-0442-05f2-f0f00deb5618@oracle.com> (raw)
In-Reply-To: <ZO9BNnnOnLjH3bcD@redhat.com>

On 8/30/2023 9:16 AM, Daniel P. Berrangé wrote:
> On Fri, Jun 30, 2023 at 07:25:07AM -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.
>>
>> For best performance, guest ram should be shared and x-ignore-shared
>> should be true, so guest pages are not written to the file, in which case
>> the guest may remain running.  If ram is not so configured, then the user
>> is advised to stop the guest first.  Otherwise, a busy guest may re-dirty
>> the same page, causing it to be appended to the file multiple times,
>> and the file may grow unboundedly.  That issue is being addressed in the
>> "fixed-ram" patch series.
>>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> Reviewed-by: Fabiano Rosas <farosas@suse.de>
>> Reviewed-by: Peter Xu <peterx@redhat.com>
>> ---
>>  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.
> 
> Was it an intentional decision to assign this under the version 2 *only* ?
> 
> QEMU's LICENSE file states
> 
> [quote]
> As of July 2013, contributions under version 2 of the GNU General Public
> License (and no later version) are only accepted for the following files
> or directories: bsd-user/, linux-user/, hw/vfio/, hw/xen/xen_pt*.
> [/quote]
> 
> Thus we'd expect this new file to be version 2, or later.

My mistake, sorry.  It should say "GNU GPL, version 2 or later"

- Steve

>> + * 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 1ae2852..92b1cc4 100644
>> --- a/migration/meson.build
>> +++ b/migration/meson.build
>> @@ -16,6 +16,7 @@ system_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);
> 
> This section will clash with the other pending reviewed series
> that introduces a formall QAPI schema for migration addresses.
> 
> Either this or that series will need an update depending on
> which Juan decides to merge first.  The changes should be
> fairly simple to resolve so not a big deal.
> 
>> 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 b57489d..5aab8fb 100644
>> --- a/qemu-options.hx
>> +++ b/qemu-options.hx
>> @@ -4622,6 +4622,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" \
>> @@ -4638,7 +4639,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


  reply	other threads:[~2023-08-30 14:16 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-30 14:25 [PATCH V4 0/2] migration file URI Steve Sistare
2023-06-30 14:25 ` [PATCH V4 1/2] migration: " Steve Sistare
2023-08-30 13:16   ` Daniel P. Berrangé
2023-08-30 14:15     ` Steven Sistare [this message]
2023-09-08 10:52       ` Daniel P. Berrangé
2023-09-08 14:23         ` Steven Sistare
2023-06-30 14:25 ` [PATCH V4 2/2] migration: file URI offset Steve Sistare
2023-07-13 21:26 ` [PATCH V4 0/2] migration file URI Michael Galaxy
2023-08-22 12:00 ` Claudio Fontana
2023-08-22 13:25   ` Philippe Mathieu-Daudé
2023-08-30 13:09     ` Claudio Fontana
2023-09-13 13:00       ` Claudio Fontana
2023-09-27 13:14         ` migration maintenance, governance [Was: Re: [PATCH V4 0/2] migration file URI] Claudio Fontana
2023-09-27 13:56           ` Peter Xu
2023-09-27 14:36             ` Daniel P. Berrangé
2023-09-27 15:15               ` Peter Xu
2023-09-27 14:31           ` Daniel P. Berrangé

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=2dbbaf06-81cb-0442-05f2-f0f00deb5618@oracle.com \
    --to=steven.sistare@oracle.com \
    --cc=berrange@redhat.com \
    --cc=farosas@suse.de \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.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).