qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/8] Introduce the VMStatus type


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 1/8] Introduce the VMStatus type
Date: Tue, 12 Jul 2011 09:28:05 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

Luiz Capitulino <address@hidden> writes:

> 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:

Nitpicking about names, bear with me.

>     - debug: guest is running under gdb
>     - inmigrate: guest is paused waiting for an incoming migration

incoming-migration?

>     - postmigrate: guest is paused following a successful migration

post-migrate?

>     - internal-error: Fatal internal error that prevents further guest
>                 execution
>     - load-state-error: guest is paused following a failed 'loadvm'

Less than obvious.  If you like concrete, name it loadvm-failed.  If you
like abstract, name it restore-vm-failed.

>     - 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

Sounds like the watchdog suffered an error.  watchdog-fired?

>     - paused: guest has been paused via the 'stop' command

stop-command?

>     - prelaunch: QEMU was started with -S and guest has not started

unstarted?

>     - running: guest is actively running
>     - shutdown: guest is shut down (and -no-shutdown is in use)
>
> Signed-off-by: Luiz Capitulino <address@hidden>
> ---
>  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:

Previous hunk has VMST_DEBUG with VMST_DEBUG.  Odd.

> @@ -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;

How are these related to the VMSTOP_*?

Why do we need a separate enumeration?

> +
> +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];
> +}
> +

Couldn't find a better place than the ol' vl.c rubbish dump  ;)

[...]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]