All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"jan.kiszka@siemens.com" <jan.kiszka@siemens.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	Luiz Capitulino <lcapitulino@redhat.com>,
	"avi@redhat.com" <avi@redhat.com>
Subject: Re: [Qemu-devel] [PATCH RESEND v5 2/6] Introduce "save_devices"
Date: Tue, 13 Mar 2012 11:51:56 +0000	[thread overview]
Message-ID: <alpine.DEB.2.00.1203131142300.923@kaball-desktop> (raw)
In-Reply-To: <4F5E4180.80601@codemonkey.ws>

On Mon, 12 Mar 2012, Anthony Liguori wrote:
> On 02/28/2012 09:51 AM, Stefano Stabellini wrote:
> > - add an "is_ram" flag to SaveStateEntry;
> >
> > - add an "is_ram" parameter to register_savevm_live;
> >
> > - introduce a "save_devices" monitor command that can be used to save
> > the state of non-ram devices.
> >
> > Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> > ---
> >   block-migration.c |    2 +-
> >   hmp-commands.hx   |   14 ++++++++++
> >   qmp-commands.hx   |   17 ++++++++++++
> >   savevm.c          |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >   sysemu.h          |    1 +
> >   vl.c              |    2 +-
> >   vmstate.h         |    1 +
> >   7 files changed, 106 insertions(+), 3 deletions(-)
> >
> > diff --git a/block-migration.c b/block-migration.c
> > index 4467468..d283fd0 100644
> > --- a/block-migration.c
> > +++ b/block-migration.c
> > @@ -722,6 +722,6 @@ void blk_mig_init(void)
> >       QSIMPLEQ_INIT(&block_mig_state.bmds_list);
> >       QSIMPLEQ_INIT(&block_mig_state.blk_list);
> >
> > -    register_savevm_live(NULL, "block", 0, 1, block_set_params,
> > +    register_savevm_live(NULL, "block", 0, 1, 0, block_set_params,
> >                            block_save_live, NULL, block_load,&block_mig_state);
> 
> Do you really want the block live migration to be part of Xen?
> 
> If not, then you can simplify by just making register_savevm_live always imply 
> !device and adjust register_savevm() accordingly.  Otherwise, the likelihood of 
> a casual observer knowing what '0, 1, 0' means is pretty bad...

That's a good point, I'll do that.


> >   }
> > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > index 64b3656..873abc9 100644
> > --- a/hmp-commands.hx
> > +++ b/hmp-commands.hx
> > @@ -280,6 +280,20 @@ a snapshot with the same tag or ID, it is replaced. More info at
> >   ETEXI
> >
> >       {
> > +        .name       = "save_devices",
> > +        .args_type  = "filename:F",
> > +        .params     = "filename",
> > +        .help       = "save the state of non-ram devices.",
> > +        .mhandler.cmd_new = do_save_device_state,
> > +    },
> > +
> > +STEXI
> > +@item save_devices @var{filename}
> > +@findex save_devices
> > +Save the state of non-ram devices.
> > +ETEXI
> > +
> > +    {
> >           .name       = "loadvm",
> >           .args_type  = "name:s",
> >           .params     = "tag|id",
> > diff --git a/qmp-commands.hx b/qmp-commands.hx
> > index 705f704..619d9de 100644
> > --- a/qmp-commands.hx
> > +++ b/qmp-commands.hx
> > @@ -444,6 +444,23 @@ Note: inject-nmi is only supported for x86 guest currently, it will
> >   EQMP
> >
> >       {
> > +        .name       = "save_devices",
> > +        .args_type  = "filename:F",
> > +        .params     = "filename",
> > +        .help       = "save the state of non-ram devices.",
> > +        .user_print = monitor_user_noop,	
> > +    .mhandler.cmd_new = do_save_device_state,
> > +    },
> > +
> > +SQMP
> > +save_devices
> > +-------
> > +
> > +Save the state of non-ram devices.
> > +
> > +EQMP
> > +
> > +    {
> >           .name       = "migrate",
> >           .args_type  = "detach:-d,blk:-b,inc:-i,uri:s",
> >           .params     = "[-d] [-b] [-i] uri",
> 
> 
> Should be QAPI commands and documented a great deal more (see other examples in 
> qapi-schema.json).  Please CC Luiz too when adding new QMP commands.

OK, I'll do.


> > diff --git a/savevm.c b/savevm.c
> > index 80be1ff..d0e62bb 100644
> > --- a/savevm.c
> > +++ b/savevm.c
> > @@ -1177,6 +1177,7 @@ typedef struct SaveStateEntry {
> >       void *opaque;
> >       CompatEntry *compat;
> >       int no_migrate;
> > +    int is_ram;
> >   } SaveStateEntry;
> >
> >
> > @@ -1223,6 +1224,7 @@ int register_savevm_live(DeviceState *dev,
> >                            const char *idstr,
> >                            int instance_id,
> >                            int version_id,
> > +                         int is_ram,
> >                            SaveSetParamsHandler *set_params,
> >                            SaveLiveStateHandler *save_live_state,
> >                            SaveStateHandler *save_state,
> > @@ -1241,6 +1243,7 @@ int register_savevm_live(DeviceState *dev,
> >       se->opaque = opaque;
> >       se->vmsd = NULL;
> >       se->no_migrate = 0;
> > +    se->is_ram = is_ram;
> >
> >       if (dev&&  dev->parent_bus&&  dev->parent_bus->info->get_dev_path) {
> >           char *id = dev->parent_bus->info->get_dev_path(dev);
> > @@ -1277,7 +1280,7 @@ int register_savevm(DeviceState *dev,
> >                       LoadStateHandler *load_state,
> >                       void *opaque)
> >   {
> > -    return register_savevm_live(dev, idstr, instance_id, version_id,
> > +    return register_savevm_live(dev, idstr, instance_id, version_id, 0,
> >                                   NULL, NULL, save_state, load_state, opaque);
> >   }
> >
> > @@ -1728,6 +1731,43 @@ out:
> >       return ret;
> >   }
> >
> > +static int qemu_save_device_state(Monitor *mon, QEMUFile *f)
> > +{
> > +    SaveStateEntry *se;
> > +
> > +    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
> > +    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
> > +
> > +    cpu_synchronize_all_states();
> > +
> > +    QTAILQ_FOREACH(se,&savevm_handlers, entry) {
> > +        int len;
> > +
> > +        if (se->is_ram)
> > +            continue;
> 
> Violating CODING_STYLE.

I'll fix that.


> > +        if (se->save_state == NULL&&  se->vmsd == NULL)
> > +            continue;
> > +
> > +        /* Section type */
> > +        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
> > +        qemu_put_be32(f, se->section_id);
> > +
> > +        /* ID string */
> > +        len = strlen(se->idstr);
> > +        qemu_put_byte(f, len);
> > +        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
> > +
> > +        qemu_put_be32(f, se->instance_id);
> > +        qemu_put_be32(f, se->version_id);
> > +
> > +        vmstate_save(f, se);
> > +    }
> > +
> > +    qemu_put_byte(f, QEMU_VM_EOF);
> > +
> > +    return qemu_file_get_error(f);
> > +}
> 
> Please add something to docs/ documenting this format.

OK


> > +
> >   static SaveStateEntry *find_se(const char *idstr, int instance_id)
> >   {
> >       SaveStateEntry *se;
> > @@ -2109,6 +2149,36 @@ void do_savevm(Monitor *mon, const QDict *qdict)
> >           vm_start();
> >   }
> >
> > +int do_save_device_state(Monitor *mon, const QDict *qdict, QObject **ret_data)
> > +{
> > +    int ret;
> > +    QEMUFile *f;
> > +    int saved_vm_running;
> > +    const char *filename = qdict_get_try_str(qdict, "filename");
> > +
> > +    saved_vm_running = runstate_is_running();
> > +    vm_stop(RUN_STATE_SAVE_VM);
> > +
> > +    f = qemu_fopen(filename, "wb");
> > +    if (!f) {
> > +        monitor_printf(mon, "Could not open VM state file\n");
> > +        ret = -1;
> > +        goto the_end;
> > +    }
> > +    ret = qemu_save_device_state(mon, f);
> > +    qemu_fclose(f);
> > +    if (ret<  0) {
> > +        monitor_printf(mon, "Error %d while writing VM\n", ret);
> > +        goto the_end;
> > +    }
> > +    ret = 0;
> > +
> > + the_end:
> > +    if (saved_vm_running)
> > +        vm_start();
> > +    return ret;
> > +}
> > +
> 
> Would it be useful/interesting to return a binary blob via QMP instead of 
> writing to a file?

Yes, it is potentially useful. I have just gone with the file interface
because it is easier to handle but I could change it or maybe have QMP
return the binary as an alternative option.

WARNING: multiple messages have this Message-ID (diff)
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"jan.kiszka@siemens.com" <jan.kiszka@siemens.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	Luiz Capitulino <lcapitulino@redhat.com>,
	"avi@redhat.com" <avi@redhat.com>
Subject: Re: [PATCH RESEND v5 2/6] Introduce "save_devices"
Date: Tue, 13 Mar 2012 11:51:56 +0000	[thread overview]
Message-ID: <alpine.DEB.2.00.1203131142300.923@kaball-desktop> (raw)
In-Reply-To: <4F5E4180.80601@codemonkey.ws>

On Mon, 12 Mar 2012, Anthony Liguori wrote:
> On 02/28/2012 09:51 AM, Stefano Stabellini wrote:
> > - add an "is_ram" flag to SaveStateEntry;
> >
> > - add an "is_ram" parameter to register_savevm_live;
> >
> > - introduce a "save_devices" monitor command that can be used to save
> > the state of non-ram devices.
> >
> > Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> > ---
> >   block-migration.c |    2 +-
> >   hmp-commands.hx   |   14 ++++++++++
> >   qmp-commands.hx   |   17 ++++++++++++
> >   savevm.c          |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >   sysemu.h          |    1 +
> >   vl.c              |    2 +-
> >   vmstate.h         |    1 +
> >   7 files changed, 106 insertions(+), 3 deletions(-)
> >
> > diff --git a/block-migration.c b/block-migration.c
> > index 4467468..d283fd0 100644
> > --- a/block-migration.c
> > +++ b/block-migration.c
> > @@ -722,6 +722,6 @@ void blk_mig_init(void)
> >       QSIMPLEQ_INIT(&block_mig_state.bmds_list);
> >       QSIMPLEQ_INIT(&block_mig_state.blk_list);
> >
> > -    register_savevm_live(NULL, "block", 0, 1, block_set_params,
> > +    register_savevm_live(NULL, "block", 0, 1, 0, block_set_params,
> >                            block_save_live, NULL, block_load,&block_mig_state);
> 
> Do you really want the block live migration to be part of Xen?
> 
> If not, then you can simplify by just making register_savevm_live always imply 
> !device and adjust register_savevm() accordingly.  Otherwise, the likelihood of 
> a casual observer knowing what '0, 1, 0' means is pretty bad...

That's a good point, I'll do that.


> >   }
> > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > index 64b3656..873abc9 100644
> > --- a/hmp-commands.hx
> > +++ b/hmp-commands.hx
> > @@ -280,6 +280,20 @@ a snapshot with the same tag or ID, it is replaced. More info at
> >   ETEXI
> >
> >       {
> > +        .name       = "save_devices",
> > +        .args_type  = "filename:F",
> > +        .params     = "filename",
> > +        .help       = "save the state of non-ram devices.",
> > +        .mhandler.cmd_new = do_save_device_state,
> > +    },
> > +
> > +STEXI
> > +@item save_devices @var{filename}
> > +@findex save_devices
> > +Save the state of non-ram devices.
> > +ETEXI
> > +
> > +    {
> >           .name       = "loadvm",
> >           .args_type  = "name:s",
> >           .params     = "tag|id",
> > diff --git a/qmp-commands.hx b/qmp-commands.hx
> > index 705f704..619d9de 100644
> > --- a/qmp-commands.hx
> > +++ b/qmp-commands.hx
> > @@ -444,6 +444,23 @@ Note: inject-nmi is only supported for x86 guest currently, it will
> >   EQMP
> >
> >       {
> > +        .name       = "save_devices",
> > +        .args_type  = "filename:F",
> > +        .params     = "filename",
> > +        .help       = "save the state of non-ram devices.",
> > +        .user_print = monitor_user_noop,	
> > +    .mhandler.cmd_new = do_save_device_state,
> > +    },
> > +
> > +SQMP
> > +save_devices
> > +-------
> > +
> > +Save the state of non-ram devices.
> > +
> > +EQMP
> > +
> > +    {
> >           .name       = "migrate",
> >           .args_type  = "detach:-d,blk:-b,inc:-i,uri:s",
> >           .params     = "[-d] [-b] [-i] uri",
> 
> 
> Should be QAPI commands and documented a great deal more (see other examples in 
> qapi-schema.json).  Please CC Luiz too when adding new QMP commands.

OK, I'll do.


> > diff --git a/savevm.c b/savevm.c
> > index 80be1ff..d0e62bb 100644
> > --- a/savevm.c
> > +++ b/savevm.c
> > @@ -1177,6 +1177,7 @@ typedef struct SaveStateEntry {
> >       void *opaque;
> >       CompatEntry *compat;
> >       int no_migrate;
> > +    int is_ram;
> >   } SaveStateEntry;
> >
> >
> > @@ -1223,6 +1224,7 @@ int register_savevm_live(DeviceState *dev,
> >                            const char *idstr,
> >                            int instance_id,
> >                            int version_id,
> > +                         int is_ram,
> >                            SaveSetParamsHandler *set_params,
> >                            SaveLiveStateHandler *save_live_state,
> >                            SaveStateHandler *save_state,
> > @@ -1241,6 +1243,7 @@ int register_savevm_live(DeviceState *dev,
> >       se->opaque = opaque;
> >       se->vmsd = NULL;
> >       se->no_migrate = 0;
> > +    se->is_ram = is_ram;
> >
> >       if (dev&&  dev->parent_bus&&  dev->parent_bus->info->get_dev_path) {
> >           char *id = dev->parent_bus->info->get_dev_path(dev);
> > @@ -1277,7 +1280,7 @@ int register_savevm(DeviceState *dev,
> >                       LoadStateHandler *load_state,
> >                       void *opaque)
> >   {
> > -    return register_savevm_live(dev, idstr, instance_id, version_id,
> > +    return register_savevm_live(dev, idstr, instance_id, version_id, 0,
> >                                   NULL, NULL, save_state, load_state, opaque);
> >   }
> >
> > @@ -1728,6 +1731,43 @@ out:
> >       return ret;
> >   }
> >
> > +static int qemu_save_device_state(Monitor *mon, QEMUFile *f)
> > +{
> > +    SaveStateEntry *se;
> > +
> > +    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
> > +    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
> > +
> > +    cpu_synchronize_all_states();
> > +
> > +    QTAILQ_FOREACH(se,&savevm_handlers, entry) {
> > +        int len;
> > +
> > +        if (se->is_ram)
> > +            continue;
> 
> Violating CODING_STYLE.

I'll fix that.


> > +        if (se->save_state == NULL&&  se->vmsd == NULL)
> > +            continue;
> > +
> > +        /* Section type */
> > +        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
> > +        qemu_put_be32(f, se->section_id);
> > +
> > +        /* ID string */
> > +        len = strlen(se->idstr);
> > +        qemu_put_byte(f, len);
> > +        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
> > +
> > +        qemu_put_be32(f, se->instance_id);
> > +        qemu_put_be32(f, se->version_id);
> > +
> > +        vmstate_save(f, se);
> > +    }
> > +
> > +    qemu_put_byte(f, QEMU_VM_EOF);
> > +
> > +    return qemu_file_get_error(f);
> > +}
> 
> Please add something to docs/ documenting this format.

OK


> > +
> >   static SaveStateEntry *find_se(const char *idstr, int instance_id)
> >   {
> >       SaveStateEntry *se;
> > @@ -2109,6 +2149,36 @@ void do_savevm(Monitor *mon, const QDict *qdict)
> >           vm_start();
> >   }
> >
> > +int do_save_device_state(Monitor *mon, const QDict *qdict, QObject **ret_data)
> > +{
> > +    int ret;
> > +    QEMUFile *f;
> > +    int saved_vm_running;
> > +    const char *filename = qdict_get_try_str(qdict, "filename");
> > +
> > +    saved_vm_running = runstate_is_running();
> > +    vm_stop(RUN_STATE_SAVE_VM);
> > +
> > +    f = qemu_fopen(filename, "wb");
> > +    if (!f) {
> > +        monitor_printf(mon, "Could not open VM state file\n");
> > +        ret = -1;
> > +        goto the_end;
> > +    }
> > +    ret = qemu_save_device_state(mon, f);
> > +    qemu_fclose(f);
> > +    if (ret<  0) {
> > +        monitor_printf(mon, "Error %d while writing VM\n", ret);
> > +        goto the_end;
> > +    }
> > +    ret = 0;
> > +
> > + the_end:
> > +    if (saved_vm_running)
> > +        vm_start();
> > +    return ret;
> > +}
> > +
> 
> Would it be useful/interesting to return a binary blob via QMP instead of 
> writing to a file?

Yes, it is potentially useful. I have just gone with the file interface
because it is easier to handle but I could change it or maybe have QMP
return the binary as an alternative option.

  reply	other threads:[~2012-03-13 11:43 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-28 15:50 [Qemu-devel] [PATCH RESEND v5 0/6] save/restore on Xen Stefano Stabellini
2012-02-28 15:50 ` Stefano Stabellini
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 1/6] cirrus_vga: do not reset videoram Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini
2012-02-28 18:35   ` [Qemu-devel] " Anthony PERARD
2012-03-12 12:43   ` Avi Kivity
2012-03-12 12:43     ` Avi Kivity
2012-03-12 13:18     ` [Qemu-devel] " Stefano Stabellini
2012-03-12 13:18       ` Stefano Stabellini
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 2/6] Introduce "save_devices" Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini
2012-02-28 18:58   ` [Qemu-devel] " Anthony PERARD
2012-02-28 18:58     ` Anthony PERARD
2012-03-12 18:33   ` [Qemu-devel] " Anthony Liguori
2012-03-12 18:33     ` Anthony Liguori
2012-03-13 11:51     ` Stefano Stabellini [this message]
2012-03-13 11:51       ` Stefano Stabellini
2012-03-13 19:26       ` [Qemu-devel] " Luiz Capitulino
2012-03-13 19:26         ` Luiz Capitulino
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 3/6] Set runstate to INMIGRATE earlier Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini
2012-02-28 19:34   ` [Qemu-devel] " Anthony PERARD
2012-02-28 19:34     ` Anthony PERARD
2012-03-07 17:41   ` [Qemu-devel] " Luiz Capitulino
2012-03-07 17:41     ` Luiz Capitulino
2012-03-12 12:17     ` [Qemu-devel] " Stefano Stabellini
2012-03-12 12:17       ` Stefano Stabellini
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 4/6] xen: record physmap changes to xenstore Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 5/6] xen mapcache: check if memory region has moved Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini
2012-02-28 15:51 ` [Qemu-devel] [PATCH RESEND v5 6/6] xen: do not allocate RAM during INMIGRATE runstate Stefano Stabellini
2012-02-28 15:51   ` Stefano Stabellini

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=alpine.DEB.2.00.1203131142300.923@kaball-desktop \
    --to=stefano.stabellini@eu.citrix.com \
    --cc=anthony@codemonkey.ws \
    --cc=avi@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=xen-devel@lists.xensource.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.