RunState: Add additional states
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>
This commit is contained in:
parent
1dfb4dd993
commit
f5bbfba1eb
1
cpus.c
1
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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
8
sysemu.h
8
sysemu.h
@ -13,15 +13,19 @@
|
||||
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);
|
||||
|
||||
|
20
vl.c
20
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();
|
||||
|
Loading…
Reference in New Issue
Block a user