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();
 | 
					        cpu_disable_ticks();
 | 
				
			||||||
        vm_running = 0;
 | 
					        vm_running = 0;
 | 
				
			||||||
        pause_all_vcpus();
 | 
					        pause_all_vcpus();
 | 
				
			||||||
 | 
					        runstate_set(state);
 | 
				
			||||||
        vm_state_notify(0, state);
 | 
					        vm_state_notify(0, state);
 | 
				
			||||||
        qemu_aio_flush();
 | 
					        qemu_aio_flush();
 | 
				
			||||||
        bdrv_flush_all();
 | 
					        bdrv_flush_all();
 | 
				
			||||||
 | 
				
			|||||||
@ -72,8 +72,11 @@ void process_incoming_migration(QEMUFile *f)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    incoming_expected = false;
 | 
					    incoming_expected = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (autostart)
 | 
					    if (autostart) {
 | 
				
			||||||
        vm_start();
 | 
					        vm_start();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        runstate_set(RSTATE_PRE_LAUNCH);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
 | 
					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;
 | 
					            state = MIG_STATE_ERROR;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (state == MIG_STATE_COMPLETED) {
 | 
				
			||||||
 | 
					            runstate_set(RSTATE_POST_MIGRATE);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        s->state = state;
 | 
					        s->state = state;
 | 
				
			||||||
        notifier_list_notify(&migration_state_notifiers, NULL);
 | 
					        notifier_list_notify(&migration_state_notifiers, NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								sysemu.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								sysemu.h
									
									
									
									
									
								
							@ -13,15 +13,19 @@
 | 
				
			|||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    RSTATE_NO_STATE,
 | 
					    RSTATE_NO_STATE,
 | 
				
			||||||
    RSTATE_DEBUG,          /* qemu is running under gdb */
 | 
					    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_PANICKED,       /* paused due to an internal error */
 | 
				
			||||||
    RSTATE_IO_ERROR,       /* paused due to an I/O error */
 | 
					    RSTATE_IO_ERROR,       /* paused due to an I/O error */
 | 
				
			||||||
    RSTATE_PAUSED,         /* paused by the user (ie. the 'stop' command) */
 | 
					    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_PRE_MIGRATE,    /* paused preparing to finish migrate */
 | 
				
			||||||
    RSTATE_RESTORE,        /* paused restoring the VM state */
 | 
					    RSTATE_RESTORE,        /* paused restoring the VM state */
 | 
				
			||||||
    RSTATE_RUNNING,        /* qemu is running */
 | 
					    RSTATE_RUNNING,        /* qemu is running */
 | 
				
			||||||
    RSTATE_SAVEVM,         /* paused saving VM state */
 | 
					    RSTATE_SAVEVM,         /* paused saving VM state */
 | 
				
			||||||
    RSTATE_SHUTDOWN,       /* guest shut down and -no-shutdown is in use */
 | 
					    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;
 | 
					} RunState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const char *bios_name;
 | 
					extern const char *bios_name;
 | 
				
			||||||
@ -32,6 +36,8 @@ extern uint8_t qemu_uuid[];
 | 
				
			|||||||
int qemu_uuid_parse(const char *str, uint8_t *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"
 | 
					#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 struct vm_change_state_entry VMChangeStateEntry;
 | 
				
			||||||
typedef void VMChangeStateHandler(void *opaque, int running, RunState state);
 | 
					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;
 | 
					    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 */
 | 
					/* real time host monotonic timer */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1161,6 +1177,7 @@ void vm_start(void)
 | 
				
			|||||||
    if (!vm_running) {
 | 
					    if (!vm_running) {
 | 
				
			||||||
        cpu_enable_ticks();
 | 
					        cpu_enable_ticks();
 | 
				
			||||||
        vm_running = 1;
 | 
					        vm_running = 1;
 | 
				
			||||||
 | 
					        runstate_set(RSTATE_RUNNING);
 | 
				
			||||||
        vm_state_notify(1, RSTATE_RUNNING);
 | 
					        vm_state_notify(1, RSTATE_RUNNING);
 | 
				
			||||||
        resume_all_vcpus();
 | 
					        resume_all_vcpus();
 | 
				
			||||||
        monitor_protocol_event(QEVENT_RESUME, NULL);
 | 
					        monitor_protocol_event(QEVENT_RESUME, NULL);
 | 
				
			||||||
@ -3438,6 +3455,7 @@ int main(int argc, char **argv, char **envp)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (incoming) {
 | 
					    if (incoming) {
 | 
				
			||||||
 | 
					        runstate_set(RSTATE_IN_MIGRATE);
 | 
				
			||||||
        int ret = qemu_start_incoming_migration(incoming);
 | 
					        int ret = qemu_start_incoming_migration(incoming);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            fprintf(stderr, "Migration failed. Exit code %s(%d), exiting.\n",
 | 
					            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) {
 | 
					    } else if (autostart) {
 | 
				
			||||||
        vm_start();
 | 
					        vm_start();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        runstate_set(RSTATE_PRE_LAUNCH);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    os_setup_post();
 | 
					    os_setup_post();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user