]> git.proxmox.com Git - qemu.git/commitdiff
RunState: Add additional states
authorLuiz Capitulino <lcapitulino@redhat.com>
Fri, 29 Jul 2011 18:04:45 +0000 (15:04 -0300)
committerLuiz Capitulino <lcapitulino@redhat.com>
Thu, 15 Sep 2011 19:39:32 +0000 (16:39 -0300)
Currently, only vm_start() and vm_stop() change the VM state.
That's, the state is only changed when starting or stopping the VM.

This commit adds the runstate_set() function, which makes it possible
to also do state transitions when the VM is stopped or running.

Additional states are also added and the current state is stored.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
cpus.c
migration.c
sysemu.h
vl.c

diff --git a/cpus.c b/cpus.c
index 76a79ac7d415eb92751d3b47039b1f034118cb26..3444bc06e7d38de4b964f0aab773e377b59936fd 100644 (file)
--- a/cpus.c
+++ b/cpus.c
@@ -124,6 +124,7 @@ static void do_vm_stop(RunState state)
         cpu_disable_ticks();
         vm_running = 0;
         pause_all_vcpus();
+        runstate_set(state);
         vm_state_notify(0, state);
         qemu_aio_flush();
         bdrv_flush_all();
index 29f1a76df135178ab43b095067f061096456603b..f2499cfdd485d3268ec6b80225571b942db6f306 100644 (file)
@@ -72,8 +72,11 @@ void process_incoming_migration(QEMUFile *f)
 
     incoming_expected = false;
 
-    if (autostart)
+    if (autostart) {
         vm_start();
+    } else {
+        runstate_set(RSTATE_PRE_LAUNCH);
+    }
 }
 
 int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
@@ -390,6 +393,9 @@ void migrate_fd_put_ready(void *opaque)
             }
             state = MIG_STATE_ERROR;
         }
+        if (state == MIG_STATE_COMPLETED) {
+            runstate_set(RSTATE_POST_MIGRATE);
+        }
         s->state = state;
         notifier_list_notify(&migration_state_notifiers, NULL);
     }
index be3448b1556807ff23ea4614d30c475da0229c0f..19088aa2dd5fdd7b818aa547966f0ee870f050db 100644 (file)
--- a/sysemu.h
+++ b/sysemu.h
 typedef enum {
     RSTATE_NO_STATE,
     RSTATE_DEBUG,          /* qemu is running under gdb */
+    RSTATE_IN_MIGRATE,     /* paused waiting for an incoming migration */
     RSTATE_PANICKED,       /* paused due to an internal error */
     RSTATE_IO_ERROR,       /* paused due to an I/O error */
     RSTATE_PAUSED,         /* paused by the user (ie. the 'stop' command) */
+    RSTATE_POST_MIGRATE,   /* paused following a successful migration */
+    RSTATE_PRE_LAUNCH,     /* qemu was started with -S and haven't started */
     RSTATE_PRE_MIGRATE,    /* paused preparing to finish migrate */
     RSTATE_RESTORE,        /* paused restoring the VM state */
     RSTATE_RUNNING,        /* qemu is running */
     RSTATE_SAVEVM,         /* paused saving VM state */
     RSTATE_SHUTDOWN,       /* guest shut down and -no-shutdown is in use */
-    RSTATE_WATCHDOG        /* watchdog fired and qemu is configured to pause */
+    RSTATE_WATCHDOG,       /* watchdog fired and qemu is configured to pause */
+    RSTATE_MAX
 } RunState;
 
 extern const char *bios_name;
@@ -32,6 +36,8 @@ extern uint8_t qemu_uuid[];
 int qemu_uuid_parse(const char *str, uint8_t *uuid);
 #define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
 
+bool runstate_check(RunState state);
+void runstate_set(RunState new_state);
 typedef struct vm_change_state_entry VMChangeStateEntry;
 typedef void VMChangeStateHandler(void *opaque, int running, RunState state);
 
diff --git a/vl.c b/vl.c
index 304a49955198e47d861c0d6d376132356dc90568..059e727cb201cdf2031e8fc97fcc29c126015540 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -322,6 +322,22 @@ static int default_driver_check(QemuOpts *opts, void *opaque)
     return 0;
 }
 
+/***********************************************************/
+/* QEMU state */
+
+static RunState current_run_state = RSTATE_NO_STATE;
+
+bool runstate_check(RunState state)
+{
+    return current_run_state == state;
+}
+
+void runstate_set(RunState new_state)
+{
+    assert(new_state < RSTATE_MAX);
+    current_run_state = new_state;
+}
+
 /***********************************************************/
 /* real time host monotonic timer */
 
@@ -1161,6 +1177,7 @@ void vm_start(void)
     if (!vm_running) {
         cpu_enable_ticks();
         vm_running = 1;
+        runstate_set(RSTATE_RUNNING);
         vm_state_notify(1, RSTATE_RUNNING);
         resume_all_vcpus();
         monitor_protocol_event(QEVENT_RESUME, NULL);
@@ -3438,6 +3455,7 @@ int main(int argc, char **argv, char **envp)
     }
 
     if (incoming) {
+        runstate_set(RSTATE_IN_MIGRATE);
         int ret = qemu_start_incoming_migration(incoming);
         if (ret < 0) {
             fprintf(stderr, "Migration failed. Exit code %s(%d), exiting.\n",
@@ -3446,6 +3464,8 @@ int main(int argc, char **argv, char **envp)
         }
     } else if (autostart) {
         vm_start();
+    } else {
+        runstate_set(RSTATE_PRE_LAUNCH);
     }
 
     os_setup_post();