vl: change QEMU state machine for system reset
This patch implements proposal from Paolo to handle system reset when the guest is not running. "After a reset, main_loop_should_exit should actually transition to VM_STATE_PRELAUNCH (*not* RUN_STATE_PAUSED) for *all* states except RUN_STATE_INMIGRATE, RUN_STATE_SAVE_VM (which I think cannot happen there) and (of course) RUN_STATE_RUNNING." Signed-off-by: Denis V. Lunev <den@openvz.org> CC: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <1455369986-20353-1-git-send-email-den@openvz.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									b11d029b0a
								
							
						
					
					
						commit
						7ec13c798a
					
				
							
								
								
									
										16
									
								
								vl.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								vl.c
									
									
									
									
									
								
							| @ -579,6 +579,7 @@ static const RunStateTransition runstate_transitions_def[] = { | ||||
|     /*     from      ->     to      */ | ||||
|     { RUN_STATE_DEBUG, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_DEBUG, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_DEBUG, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_INMIGRATE, RUN_STATE_INTERNAL_ERROR }, | ||||
|     { RUN_STATE_INMIGRATE, RUN_STATE_IO_ERROR }, | ||||
| @ -592,15 +593,19 @@ static const RunStateTransition runstate_transitions_def[] = { | ||||
| 
 | ||||
|     { RUN_STATE_INTERNAL_ERROR, RUN_STATE_PAUSED }, | ||||
|     { RUN_STATE_INTERNAL_ERROR, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_INTERNAL_ERROR, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_IO_ERROR, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_IO_ERROR, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_IO_ERROR, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_PAUSED, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_PAUSED, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_PAUSED, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_POSTMIGRATE, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_POSTMIGRATE, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_POSTMIGRATE, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_PRELAUNCH, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_PRELAUNCH, RUN_STATE_FINISH_MIGRATE }, | ||||
| @ -608,8 +613,10 @@ static const RunStateTransition runstate_transitions_def[] = { | ||||
| 
 | ||||
|     { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_FINISH_MIGRATE, RUN_STATE_POSTMIGRATE }, | ||||
|     { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_RESTORE_VM, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_RESTORE_VM, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_RUNNING, RUN_STATE_DEBUG }, | ||||
|     { RUN_STATE_RUNNING, RUN_STATE_INTERNAL_ERROR }, | ||||
| @ -626,17 +633,21 @@ static const RunStateTransition runstate_transitions_def[] = { | ||||
| 
 | ||||
|     { RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED }, | ||||
|     { RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_SHUTDOWN, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_DEBUG, RUN_STATE_SUSPENDED }, | ||||
|     { RUN_STATE_RUNNING, RUN_STATE_SUSPENDED }, | ||||
|     { RUN_STATE_SUSPENDED, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_SUSPENDED, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_SUSPENDED, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_WATCHDOG, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_WATCHDOG, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_WATCHDOG, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE_GUEST_PANICKED, RUN_STATE_RUNNING }, | ||||
|     { RUN_STATE_GUEST_PANICKED, RUN_STATE_FINISH_MIGRATE }, | ||||
|     { RUN_STATE_GUEST_PANICKED, RUN_STATE_PRELAUNCH }, | ||||
| 
 | ||||
|     { RUN_STATE__MAX, RUN_STATE__MAX }, | ||||
| }; | ||||
| @ -1881,8 +1892,9 @@ static bool main_loop_should_exit(void) | ||||
|         cpu_synchronize_all_states(); | ||||
|         qemu_system_reset(VMRESET_REPORT); | ||||
|         resume_all_vcpus(); | ||||
|         if (runstate_needs_reset()) { | ||||
|             runstate_set(RUN_STATE_PAUSED); | ||||
|         if (!runstate_check(RUN_STATE_RUNNING) && | ||||
|                 !runstate_check(RUN_STATE_INMIGRATE)) { | ||||
|             runstate_set(RUN_STATE_PRELAUNCH); | ||||
|         } | ||||
|     } | ||||
|     if (qemu_wakeup_requested()) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Denis V. Lunev
						Denis V. Lunev