All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: kwolf@redhat.com, jan.kiszka@siemens.com, qemu-devel@nongnu.org,
	armbru@redhat.com, stefanha@gmail.com, jdenemar@redhat.com
Subject: Re: [Qemu-devel] [PATCH 1/8] Introduce the VMStatus type
Date: Tue, 5 Jul 2011 15:51:39 -0300	[thread overview]
Message-ID: <20110705155139.47bf18b3@doriath> (raw)
In-Reply-To: <4E1358E3.4010402@codemonkey.ws>

On Tue, 05 Jul 2011 13:33:07 -0500
Anthony Liguori <anthony@codemonkey.ws> wrote:

> On 07/05/2011 01:17 PM, Luiz Capitulino wrote:
> > We need to track the VM status so that QMP can report it to clients.
> >
> > This commit adds the VMStatus type and related functions. The
> > vm_status_set() function is used to keep track of the current
> > VM status.
> >
> > The current statuses are:
> 
> Which states are terminal, and what's the proper procedure to recover 
> from non-terminal states?  Is it cont or system_reset followed by cont?

Can I add that to the next patch (which also adds the QMP doc) or do you
prefer it in this patch?

> 
> >
> >      - debug: guest is running under gdb
> >      - inmigrate: guest is paused waiting for an incoming migration
> >      - postmigrate: guest is paused following a successful migration
> >      - internal-error: Fatal internal error that prevents further guest
> >                  execution
> >      - load-state-error: guest is paused following a failed 'loadvm'
> >      - io-error: the last IOP has failed and the device is configured
> >                  to pause on I/O errors
> >      - watchdog-error: the watchdog action is configured to pause and
> >                        has been triggered
> >      - paused: guest has been paused via the 'stop' command
> >      - prelaunch: QEMU was started with -S and guest has not started
> >      - running: guest is actively running
> >      - shutdown: guest is shut down (and -no-shutdown is in use)
> 
> Regards,
> 
> Anthony Liguori
> 
> >
> > Signed-off-by: Luiz Capitulino<lcapitulino@redhat.com>
> > ---
> >   gdbstub.c       |    4 ++++
> >   hw/ide/core.c   |    1 +
> >   hw/scsi-disk.c  |    1 +
> >   hw/virtio-blk.c |    1 +
> >   hw/watchdog.c   |    1 +
> >   kvm-all.c       |    1 +
> >   migration.c     |    3 +++
> >   monitor.c       |    5 ++++-
> >   sysemu.h        |   19 +++++++++++++++++++
> >   vl.c            |   37 +++++++++++++++++++++++++++++++++++++
> >   10 files changed, 72 insertions(+), 1 deletions(-)
> >
> > diff --git a/gdbstub.c b/gdbstub.c
> > index c085a5a..61b700a 100644
> > --- a/gdbstub.c
> > +++ b/gdbstub.c
> > @@ -2358,6 +2358,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
> >       s->state = RS_SYSCALL;
> >   #ifndef CONFIG_USER_ONLY
> >       vm_stop(VMSTOP_DEBUG);
> > +    vm_status_set(VMST_DEBUG);
> >   #endif
> >       s->state = RS_IDLE;
> >       va_start(va, fmt);
> > @@ -2432,6 +2433,7 @@ static void gdb_read_byte(GDBState *s, int ch)
> >           /* when the CPU is running, we cannot do anything except stop
> >              it when receiving a char */
> >           vm_stop(VMSTOP_USER);
> > +        vm_status_set(VMST_DEBUG);
> >       } else
> >   #endif
> >       {
> > @@ -2694,6 +2696,7 @@ static void gdb_chr_event(void *opaque, int event)
> >       switch (event) {
> >       case CHR_EVENT_OPENED:
> >           vm_stop(VMSTOP_USER);
> > +        vm_status_set(VMST_DEBUG);
> >           gdb_has_xml = 0;
> >           break;
> >       default:
> > @@ -2735,6 +2738,7 @@ static void gdb_sigterm_handler(int signal)
> >   {
> >       if (vm_running) {
> >           vm_stop(VMSTOP_USER);
> > +        vm_status_set(VMST_DEBUG);
> >       }
> >   }
> >   #endif
> > diff --git a/hw/ide/core.c b/hw/ide/core.c
> > index ca17a43..bf9df41 100644
> > --- a/hw/ide/core.c
> > +++ b/hw/ide/core.c
> > @@ -523,6 +523,7 @@ static int ide_handle_rw_error(IDEState *s, int error, int op)
> >           s->bus->error_status = op;
> >           bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
> >           vm_stop(VMSTOP_DISKFULL);
> > +        vm_status_set(VMST_IOERROR);
> >       } else {
> >           if (op&  BM_STATUS_DMA_RETRY) {
> >               dma_buf_commit(s, 0);
> > diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> > index a8c7372..66037fd 100644
> > --- a/hw/scsi-disk.c
> > +++ b/hw/scsi-disk.c
> > @@ -216,6 +216,7 @@ static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type)
> >
> >           bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
> >           vm_stop(VMSTOP_DISKFULL);
> > +        vm_status_set(VMST_IOERROR);
> >       } else {
> >           if (type == SCSI_REQ_STATUS_RETRY_READ) {
> >               scsi_req_data(&r->req, 0);
> > diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> > index 91e0394..bf70200 100644
> > --- a/hw/virtio-blk.c
> > +++ b/hw/virtio-blk.c
> > @@ -79,6 +79,7 @@ static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
> >           s->rq = req;
> >           bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
> >           vm_stop(VMSTOP_DISKFULL);
> > +        vm_status_set(VMST_IOERROR);
> >       } else {
> >           virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
> >           bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
> > diff --git a/hw/watchdog.c b/hw/watchdog.c
> > index 1c900a1..d130cbb 100644
> > --- a/hw/watchdog.c
> > +++ b/hw/watchdog.c
> > @@ -133,6 +133,7 @@ void watchdog_perform_action(void)
> >       case WDT_PAUSE:             /* same as 'stop' command in monitor */
> >           watchdog_mon_event("pause");
> >           vm_stop(VMSTOP_WATCHDOG);
> > +        vm_status_set(VMST_WATCHDOG);
> >           break;
> >
> >       case WDT_DEBUG:
> > diff --git a/kvm-all.c b/kvm-all.c
> > index cbc2532..aee9e0a 100644
> > --- a/kvm-all.c
> > +++ b/kvm-all.c
> > @@ -1015,6 +1015,7 @@ int kvm_cpu_exec(CPUState *env)
> >       if (ret<  0) {
> >           cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE);
> >           vm_stop(VMSTOP_PANIC);
> > +        vm_status_set(VMST_INTERROR);
> >       }
> >
> >       env->exit_request = 0;
> > diff --git a/migration.c b/migration.c
> > index af3a1f2..674792f 100644
> > --- a/migration.c
> > +++ b/migration.c
> > @@ -394,6 +394,9 @@ void migrate_fd_put_ready(void *opaque)
> >               }
> >               state = MIG_STATE_ERROR;
> >           }
> > +        if (state == MIG_STATE_COMPLETED) {
> > +            vm_status_set(VMST_POSTMIGRATE);
> > +        }
> >           s->state = state;
> >           notifier_list_notify(&migration_state_notifiers);
> >       }
> > diff --git a/monitor.c b/monitor.c
> > index 67ceb46..1cb3191 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -1258,6 +1258,7 @@ static void do_singlestep(Monitor *mon, const QDict *qdict)
> >   static int do_stop(Monitor *mon, const QDict *qdict, QObject **ret_data)
> >   {
> >       vm_stop(VMSTOP_USER);
> > +    vm_status_set(VMST_PAUSED);
> >       return 0;
> >   }
> >
> > @@ -2782,7 +2783,9 @@ static void do_loadvm(Monitor *mon, const QDict *qdict)
> >
> >       vm_stop(VMSTOP_LOADVM);
> >
> > -    if (load_vmstate(name) == 0&&  saved_vm_running) {
> > +    if (load_vmstate(name)<  0) {
> > +        vm_status_set(VMST_LOADERROR);
> > +    } else if (saved_vm_running) {
> >           vm_start();
> >       }
> >   }
> > diff --git a/sysemu.h b/sysemu.h
> > index d3013f5..7308ac5 100644
> > --- a/sysemu.h
> > +++ b/sysemu.h
> > @@ -77,6 +77,25 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f);
> >   void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f);
> >   int qemu_loadvm_state(QEMUFile *f);
> >
> > +typedef enum {
> > +    VMST_NOSTATUS,
> > +    VMST_DEBUG,
> > +    VMST_INMIGRATE,
> > +    VMST_POSTMIGRATE,
> > +    VMST_INTERROR,
> > +    VMST_IOERROR,
> > +    VMST_LOADERROR,
> > +    VMST_PAUSED,
> > +    VMST_PRELAUNCH,
> > +    VMST_RUNNING,
> > +    VMST_SHUTDOWN,
> > +    VMST_WATCHDOG,
> > +    VMST_MAX,
> > +} VMStatus;
> > +
> > +void vm_status_set(VMStatus s);
> > +const char *vm_status_get_name(void);
> > +
> >   /* SLIRP */
> >   void do_info_slirp(Monitor *mon);
> >
> > diff --git a/vl.c b/vl.c
> > index fcd7395..fb7208f 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -309,6 +309,37 @@ static int default_driver_check(QemuOpts *opts, void *opaque)
> >   }
> >
> >   /***********************************************************/
> > +/* VMStatus */
> > +
> > +static const char *const vm_status_name[VMST_MAX] = {
> > +    [VMST_DEBUG] = "debug",
> > +    [VMST_INMIGRATE] = "inmigrate",
> > +    [VMST_POSTMIGRATE] = "postmigrate",
> > +    [VMST_INTERROR] = "internal-error",
> > +    [VMST_IOERROR] = "io-error",
> > +    [VMST_LOADERROR] = "load-state-error",
> > +    [VMST_PAUSED] = "paused",
> > +    [VMST_PRELAUNCH] = "prelaunch",
> > +    [VMST_RUNNING] = "running",
> > +    [VMST_SHUTDOWN] = "shutdown",
> > +    [VMST_WATCHDOG] = "watchdog-error",
> > +};
> > +
> > +static VMStatus qemu_vm_status = VMST_NOSTATUS;
> > +
> > +void vm_status_set(VMStatus s)
> > +{
> > +    assert(s>  VMST_NOSTATUS&&  s<  VMST_MAX);
> > +    qemu_vm_status = s;
> > +}
> > +
> > +const char *vm_status_get_name(void)
> > +{
> > +    assert(qemu_vm_status>  VMST_NOSTATUS&&  qemu_vm_status<  VMST_MAX);
> > +    return vm_status_name[qemu_vm_status];
> > +}
> > +
> > +/***********************************************************/
> >   /* real time host monotonic timer */
> >
> >   /***********************************************************/
> > @@ -1150,6 +1181,7 @@ void vm_start(void)
> >           vm_state_notify(1, 0);
> >           resume_all_vcpus();
> >           monitor_protocol_event(QEVENT_RESUME, NULL);
> > +        vm_status_set(VMST_RUNNING);
> >       }
> >   }
> >
> > @@ -1392,12 +1424,14 @@ static void main_loop(void)
> >
> >           if (qemu_debug_requested()) {
> >               vm_stop(VMSTOP_DEBUG);
> > +            vm_status_set(VMST_DEBUG);
> >           }
> >           if (qemu_shutdown_requested()) {
> >               qemu_kill_report();
> >               monitor_protocol_event(QEVENT_SHUTDOWN, NULL);
> >               if (no_shutdown) {
> >                   vm_stop(VMSTOP_SHUTDOWN);
> > +                vm_status_set(VMST_SHUTDOWN);
> >                   no_shutdown = 0;
> >               } else
> >                   break;
> > @@ -2476,6 +2510,7 @@ int main(int argc, char **argv, char **envp)
> >                   break;
> >               case QEMU_OPTION_S:
> >                   autostart = 0;
> > +                vm_status_set(VMST_PRELAUNCH);
> >                   break;
> >   	    case QEMU_OPTION_k:
> >   		keyboard_layout = optarg;
> > @@ -3307,11 +3342,13 @@ int main(int argc, char **argv, char **envp)
> >       qemu_system_reset(VMRESET_SILENT);
> >       if (loadvm) {
> >           if (load_vmstate(loadvm)<  0) {
> > +            vm_status_set(VMST_LOADERROR);
> >               autostart = 0;
> >           }
> >       }
> >
> >       if (incoming) {
> > +        vm_status_set(VMST_INMIGRATE);
> >           int ret = qemu_start_incoming_migration(incoming);
> >           if (ret<  0) {
> >               fprintf(stderr, "Migration failed. Exit code %s(%d), exiting.\n",
> 

  reply	other threads:[~2011-07-05 18:51 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-05 18:17 [Qemu-devel] [PATCH v1 0/8]: QMP: Thin provisioning support Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 1/8] Introduce the VMStatus type Luiz Capitulino
2011-07-05 18:33   ` Anthony Liguori
2011-07-05 18:51     ` Luiz Capitulino [this message]
2011-07-05 18:58       ` Anthony Liguori
2011-07-05 19:34         ` Luiz Capitulino
2011-07-12  7:28   ` Markus Armbruster
2011-07-12 14:25     ` Luiz Capitulino
2011-07-12 14:51       ` Kevin Wolf
2011-07-12 15:12         ` Luiz Capitulino
2011-07-12 16:03           ` Luiz Capitulino
2011-07-12 16:16             ` Kevin Wolf
2011-07-12 17:59               ` Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 2/8] QMP: query-status: Introduce 'status' key Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 3/8] block: Support to keep track of I/O status Luiz Capitulino
2011-07-12  7:45   ` Markus Armbruster
2011-07-12  8:33     ` Kevin Wolf
2011-07-12  9:12       ` Markus Armbruster
2011-07-12 14:38         ` Luiz Capitulino
2011-07-12 14:25   ` Kevin Wolf
2011-07-12 14:56     ` Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 4/8] ide: Support " Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 5/8] virtio: " Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 6/8] scsi: " Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 7/8] QMP: query-status: Add 'io-status' key Luiz Capitulino
2011-07-12  7:47   ` Markus Armbruster
2011-07-12 14:56     ` Luiz Capitulino
2011-07-05 18:17 ` [Qemu-devel] [PATCH 8/8] HMP: Print 'io-status' information Luiz Capitulino
2011-07-11 17:43 ` [Qemu-devel] [PATCH v1 0/8]: QMP: Thin provisioning support Luiz Capitulino

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=20110705155139.47bf18b3@doriath \
    --to=lcapitulino@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=armbru@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=jdenemar@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.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.