All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juan Quintela <quintela@redhat.com>
To: Avihai Horon <avihaih@nvidia.com>
Cc: qemu-devel@nongnu.org,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Cédric Le Goater" <clg@redhat.com>,
	"Peter Xu" <peterx@redhat.com>,
	"Leonardo Bras" <leobras@redhat.com>,
	"Eric Blake" <eblake@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Yishai Hadas" <yishaih@nvidia.com>,
	"Jason Gunthorpe" <jgg@nvidia.com>,
	"Maor Gottlieb" <maorg@nvidia.com>,
	"Kirti Wankhede" <kwankhede@nvidia.com>,
	"Tarun Gupta" <targupta@nvidia.com>,
	"Joao Martins" <joao.m.martins@oracle.com>
Subject: Re: [PATCH 2/8] migration: Add precopy initial data handshake
Date: Wed, 10 May 2023 10:40:06 +0200	[thread overview]
Message-ID: <87h6ska8bd.fsf@secure.mitica> (raw)
In-Reply-To: <20230501140141.11743-3-avihaih@nvidia.com> (Avihai Horon's message of "Mon, 1 May 2023 17:01:35 +0300")

Avihai Horon <avihaih@nvidia.com> wrote:
> Add precopy initial data handshake between source and destination upon
> migration setup. The purpose of the handshake is to notify the
> destination that precopy initial data is used and which migration users
> (i.e., SaveStateEntry) are going to use it.
>
> The handshake is done in two levels. First, a general enable command is
> sent to notify the destination migration code that precopy initial data
> is used.
> Then, for each migration user in the source that supports precopy
> initial data, an enable command is sent to its counterpart in the
> destination:
> If both support it, precopy initial data will be used for them.
> If source doesn't support it, precopy initial data will not be used for
> them.
> If source supports it and destination doesn't, migration will be failed.
>
> To implement it, a new migration command MIG_CMD_INITIAL_DATA_ENABLE is
> added, as well as a new SaveVMHandlers handler initial_data_advise.
> Calling the handler advises the migration user that precopy initial data
> is used and its return value indicates whether precopy initial data is
> supported by it.
>
> Signed-off-by: Avihai Horon <avihaih@nvidia.com>

> diff --git a/migration/savevm.c b/migration/savevm.c
> index a9181b444b..2740defdf0 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -71,6 +71,13 @@
>  
>  const unsigned int postcopy_ram_discard_version;
>  
> +typedef struct {
> +    uint8_t general_enable;

I miss a comment for this field.

I think that you only use the values 0 and 1
And that 1 means something like: we require this feature and do nothing
And that 0 means that this is a device that uses the feature and
<something, something>

> +    uint8_t reserved[7];
> +    uint8_t idstr[256];
> +    uint32_t instance_id;
> +} InitialDataInfo;

We have several "reserved" space here.  Do we want a Version field?
It don't seem that we need a size field, as the command is fixed length.

> @@ -90,6 +97,8 @@ enum qemu_vm_cmd {
>      MIG_CMD_ENABLE_COLO,       /* Enable COLO */
>      MIG_CMD_POSTCOPY_RESUME,   /* resume postcopy on dest */
>      MIG_CMD_RECV_BITMAP,       /* Request for recved bitmap on dst */
> +

Spurious blank line

> +    MIG_CMD_INITIAL_DATA_ENABLE, /* Enable precopy initial data in dest */
>      MIG_CMD_MAX



> +void qemu_savevm_send_initial_data_enable(MigrationState *ms, QEMUFile *f)
> +{
> +    SaveStateEntry *se;
> +    InitialDataInfo buf;

Small nit.

The new way in the block to declare that something needs to be
initialized to zero is:

    InitialDataInfo buf = {};

And no, I have no clue if this makes the compiler generate any better code.

> +    /* Enable precopy initial data generally in the migration */
> +    memset(&buf, 0, sizeof(buf));
> +    buf.general_enable = 1;
> +    qemu_savevm_command_send(f, MIG_CMD_INITIAL_DATA_ENABLE, sizeof(buf),
> +                             (uint8_t *)&buf);
> +    trace_savevm_send_initial_data_enable(buf.general_enable, (char *)buf.idstr,
> +                                          buf.instance_id);

No buf.idstr here.

Why do we need a command before the loop and seeing if we are having any
device that requires this.

> +    /* Enable precopy initial data for each migration user that supports it */
> +    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> +        if (!se->ops || !se->ops->initial_data_advise) {
> +            continue;
> +        }
> +
> +        if (!se->ops->initial_data_advise(se->opaque)) {
> +            continue;
> +        }

Is this callback going to send anything?

> +
> +        memset(&buf, 0, sizeof(buf));
> +        memcpy(buf.idstr, se->idstr, sizeof(buf.idstr));
> +        buf.instance_id = se->instance_id;
> +
> +        qemu_savevm_command_send(f, MIG_CMD_INITIAL_DATA_ENABLE, sizeof(buf),
> +                                 (uint8_t *)&buf);
> +        trace_savevm_send_initial_data_enable(
> +            buf.general_enable, (char *)buf.idstr, buf.instance_id);

It is me or general_enable is always zero here?

> +    }
> +}
> +
>  void qemu_savevm_send_colo_enable(QEMUFile *f)
>  {
>      trace_savevm_send_colo_enable();
> @@ -2314,6 +2359,60 @@ static int loadvm_process_enable_colo(MigrationIncomingState *mis)
>      return ret;
>  }
>  
> +static int loadvm_handle_initial_data_enable(MigrationIncomingState *mis)
> +{
> +    InitialDataInfo buf;
> +    SaveStateEntry *se;
> +    ssize_t read_size;
> +
> +    read_size = qemu_get_buffer(mis->from_src_file, (void *)&buf, sizeof(buf));
> +    if (read_size != sizeof(buf)) {
> +        error_report("%s: Could not get data buffer, read_size %ld, len %lu",
> +                     __func__, read_size, sizeof(buf));
> +
> +        return -EIO;
> +    }
> +
> +    /* Enable precopy initial data generally in the migration */
> +    if (buf.general_enable) {
> +        mis->initial_data_enabled = true;
> +        trace_loadvm_handle_initial_data_enable(
> +            buf.general_enable, (char *)buf.idstr, buf.instance_id);
> +
> +        return 0;
> +    }
> +
> +    /* Enable precopy initial data for a specific migration user */
> +    se = find_se((char *)buf.idstr, buf.instance_id);
> +    if (!se) {
> +        error_report("%s: Could not find SaveStateEntry, idstr '%s', "
> +                     "instance_id %" PRIu32,
> +                     __func__, buf.idstr, buf.instance_id);
> +
> +        return -ENOENT;
> +    }
> +
> +    if (!se->ops || !se->ops->initial_data_advise) {
> +        error_report("%s: '%s' doesn't have required "
> +                     "initial_data_advise op",
> +                     __func__, buf.idstr);
> +
> +        return -EOPNOTSUPP;
> +    }
> +
> +    if (!se->ops->initial_data_advise(se->opaque)) {
> +        error_report("%s: '%s' doesn't support precopy initial data", __func__,
> +                     buf.idstr);

This is not your fault.  Just venting.

And here we are, again, with a place where we can't return errors.  Sniff.

> +
> +        return -EOPNOTSUPP;
> +    }

I have to wait until I see the usage later in the series, but it is a
good idea to have a single handle for source and destination, and not
passing at least a parameter telling where are we?

Really nice patch, very good done and very good integrated with the
surrounded style.  A pleasure.

Later, Juan.



  parent reply	other threads:[~2023-05-10  8:40 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-01 14:01 [PATCH 0/8] migration: Add precopy initial data capability and VFIO precopy support Avihai Horon
2023-05-01 14:01 ` [PATCH 1/8] migration: Add precopy initial data capability Avihai Horon
2023-05-10  8:24   ` Juan Quintela
2023-05-17  9:17   ` Markus Armbruster
2023-05-17 10:16     ` Avihai Horon
2023-05-17 12:21       ` Markus Armbruster
2023-05-17 13:23         ` Avihai Horon
2023-05-01 14:01 ` [PATCH 2/8] migration: Add precopy initial data handshake Avihai Horon
2023-05-02 22:54   ` Peter Xu
2023-05-03 15:31     ` Avihai Horon
2023-05-10  8:40   ` Juan Quintela [this message]
2023-05-10 15:32     ` Avihai Horon
2023-05-14 16:42   ` Cédric Le Goater
2023-05-15  7:56     ` Avihai Horon
2023-05-01 14:01 ` [PATCH 3/8] migration: Add precopy initial data loaded ACK functionality Avihai Horon
2023-05-02 22:56   ` Peter Xu
2023-05-03 15:36     ` Avihai Horon
2023-05-10  8:54   ` Juan Quintela
2023-05-10 15:52     ` Avihai Horon
2023-05-10 15:59       ` Juan Quintela
2023-05-01 14:01 ` [PATCH 4/8] migration: Enable precopy initial data capability Avihai Horon
2023-05-10  8:55   ` Juan Quintela
2023-05-01 14:01 ` [PATCH 5/8] tests: Add migration precopy initial data capability test Avihai Horon
2023-05-10  8:55   ` Juan Quintela
2023-05-01 14:01 ` [PATCH 6/8] vfio/migration: Refactor vfio_save_block() to return saved data size Avihai Horon
2023-05-10  9:00   ` Juan Quintela
2023-05-01 14:01 ` [PATCH 7/8] vfio/migration: Add VFIO migration pre-copy support Avihai Horon
2023-05-01 14:01 ` [PATCH 8/8] vfio/migration: Add support for precopy initial data capability Avihai Horon
2023-05-02 22:49 ` [PATCH 0/8] migration: Add precopy initial data capability and VFIO precopy support Peter Xu
2023-05-03 15:22   ` Avihai Horon
2023-05-03 15:49     ` Peter Xu
2023-05-04 10:18       ` Avihai Horon
2023-05-04 15:50         ` Peter Xu
2023-05-07 12:54           ` Avihai Horon
2023-05-08  0:49             ` Peter Xu
2023-05-08 11:11               ` Avihai Horon
2023-05-10  9:12     ` Juan Quintela
2023-05-10 16:01       ` Avihai Horon
2023-05-10 16:41         ` Juan Quintela
2023-05-11 11:31           ` Avihai Horon
2023-05-11 13:09             ` Juan Quintela
2023-05-11 15:08               ` Avihai Horon

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=87h6ska8bd.fsf@secure.mitica \
    --to=quintela@redhat.com \
    --cc=alex.williamson@redhat.com \
    --cc=armbru@redhat.com \
    --cc=avihaih@nvidia.com \
    --cc=clg@redhat.com \
    --cc=eblake@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=joao.m.martins@oracle.com \
    --cc=kwankhede@nvidia.com \
    --cc=leobras@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=maorg@nvidia.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=targupta@nvidia.com \
    --cc=thuth@redhat.com \
    --cc=yishaih@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.