All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Juan Quintela <quintela@redhat.com>,
	qemu-devel@nongnu.org, dgilbert@redhat.com, patches@linaro.org
Subject: Re: [Qemu-devel] [PATCH] savevm: Ignore minimum_version_id_old if there is no load_state_old
Date: Mon, 31 Mar 2014 22:29:32 +0300	[thread overview]
Message-ID: <20140331192932.GG12208@redhat.com> (raw)
In-Reply-To: <1396283826-7100-1-git-send-email-peter.maydell@linaro.org>

On Mon, Mar 31, 2014 at 05:37:06PM +0100, Peter Maydell wrote:
> At the moment we require vmstate definitions to set minimum_version_id_old
> to the same value as minimum_version_id if they do not provide a
> load_state_old handler. Since the load_state_old functionality is
> required only for a handful of devices that need to retain migration
> compatibility with a pre-vmstate implementation, this means the bulk
> of devices have pointless boilerplate. Relax the definition so that
> minimum_version_id_old is ignored if there is no load_state_old handler.
> 
> Note that under the old scheme we would segfault if the vmstate
> specified a minimum_version_id_old that was less than minimum_version_id
> but did not provide a load_state_old function, and the incoming state
> specified a version number between minimum_version_id_old and
> minimum_version_id. Under the new scheme this will just result in
> our failing the migration.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

> ---
> There's obviously scope for subsequent cleanup to delete all the
> now-redundant setting of minimum_version_id_old in vmstates; in this
> patch I only changed the occurrences in the documentation.
> 
>  docs/migration.txt | 12 +++++-------
>  vmstate.c          |  9 +++++----
>  2 files changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/docs/migration.txt b/docs/migration.txt
> index 0e0a1d4..fe1f2bb 100644
> --- a/docs/migration.txt
> +++ b/docs/migration.txt
> @@ -139,7 +139,6 @@ static const VMStateDescription vmstate_kbd = {
>      .name = "pckbd",
>      .version_id = 3,
>      .minimum_version_id = 3,
> -    .minimum_version_id_old = 3,
>      .fields      = (VMStateField []) {
>          VMSTATE_UINT8(write_cmd, KBDState),
>          VMSTATE_UINT8(status, KBDState),
> @@ -168,12 +167,13 @@ You can see that there are several version fields:
>  - minimum_version_id: the minimum version_id that VMState is able to understand
>    for that device.
>  - minimum_version_id_old: For devices that were not able to port to vmstate, we can
> -  assign a function that knows how to read this old state.
> +  assign a function that knows how to read this old state. This field is
> +  ignored if there is no load_state_old handler.
>  
>  So, VMState is able to read versions from minimum_version_id to
> -version_id.  And the function load_state_old() is able to load state
> -from minimum_version_id_old to minimum_version_id.  This function is
> -deprecated and will be removed when no more users are left.
> +version_id.  And the function load_state_old() (if present) is able to
> +load state from minimum_version_id_old to minimum_version_id.  This
> +function is deprecated and will be removed when no more users are left.
>  
>  ===  Massaging functions ===
>  
> @@ -255,7 +255,6 @@ const VMStateDescription vmstate_ide_drive_pio_state = {
>      .name = "ide_drive/pio_state",
>      .version_id = 1,
>      .minimum_version_id = 1,
> -    .minimum_version_id_old = 1,
>      .pre_save = ide_drive_pio_pre_save,
>      .post_load = ide_drive_pio_post_load,
>      .fields      = (VMStateField []) {
> @@ -275,7 +274,6 @@ const VMStateDescription vmstate_ide_drive = {
>      .name = "ide_drive",
>      .version_id = 3,
>      .minimum_version_id = 0,
> -    .minimum_version_id_old = 0,
>      .post_load = ide_drive_post_load,
>      .fields      = (VMStateField []) {
>          .... several fields ....
> diff --git a/vmstate.c b/vmstate.c
> index b689f2f..bfa34cc 100644
> --- a/vmstate.c
> +++ b/vmstate.c
> @@ -19,11 +19,12 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
>      if (version_id > vmsd->version_id) {
>          return -EINVAL;
>      }
> -    if (version_id < vmsd->minimum_version_id_old) {
> -        return -EINVAL;
> -    }
>      if  (version_id < vmsd->minimum_version_id) {
> -        return vmsd->load_state_old(f, opaque, version_id);
> +        if (vmsd->load_state_old &&
> +            version_id >= vmsd->minimum_version_id_old) {
> +            return vmsd->load_state_old(f, opaque, version_id);
> +        }
> +        return -EINVAL;
>      }
>      if (vmsd->pre_load) {
>          int ret = vmsd->pre_load(opaque);
> -- 
> 1.9.0

      reply	other threads:[~2014-03-31 19:29 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-31 16:37 [Qemu-devel] [PATCH] savevm: Ignore minimum_version_id_old if there is no load_state_old Peter Maydell
2014-03-31 19:29 ` Michael S. Tsirkin [this message]

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=20140331192932.GG12208@redhat.com \
    --to=mst@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=patches@linaro.org \
    --cc=peter.maydell@linaro.org \
    --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 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.