diff --git a/tools/acrn-manager/acrn_vm_ops.c b/tools/acrn-manager/acrn_vm_ops.c index a610c593e..e7bdacb00 100644 --- a/tools/acrn-manager/acrn_vm_ops.c +++ b/tools/acrn-manager/acrn_vm_ops.c @@ -50,7 +50,7 @@ static pthread_mutex_t vmmngr_mutex = PTHREAD_MUTEX_INITIALIZER; struct vmmngr_list_struct vmmngr_head; static unsigned long update_count = 0; -struct vmmngr_struct *vmmngr_find(char *name) +struct vmmngr_struct *vmmngr_find(const char *name) { struct vmmngr_struct *s; diff --git a/tools/acrn-manager/acrnctl.c b/tools/acrn-manager/acrnctl.c index 1fb3cea8c..eb252fe49 100644 --- a/tools/acrn-manager/acrnctl.c +++ b/tools/acrn-manager/acrnctl.c @@ -38,6 +38,8 @@ #define RESUME_DESC "Resume virtual machine from suspend state" #define RESET_DESC "Stop and then start virtual machine VM_NAME" +#define STOP_TIMEOUT 10U + struct acrnctl_cmd { const char *cmd; const char desc[128]; /* Description of the cmd */ @@ -492,6 +494,25 @@ static int acrnctl_do_resume(int argc, char *argv[]) return 0; } +static int wait_vm_stop(const char * vmname, unsigned int timeout) +{ + unsigned long t = timeout; + struct vmmngr_struct *s; + + do { + /* list and update the vm status */ + vmmngr_update(); + + s = vmmngr_find(vmname); + if (s->state == VM_CREATED) + return 0; + + sleep(1); + } while (t--); + + return -1; +} + static int acrnctl_do_reset(int argc, char *argv[]) { struct vmmngr_struct *s; @@ -511,6 +532,11 @@ static int acrnctl_do_reset(int argc, char *argv[]) case VM_STARTED: case VM_PAUSED: stop_vm(argv[i]); + if (wait_vm_stop(argv[i], STOP_TIMEOUT)) { + printf("Failed to stop %s in %u sec\n", + argv[i], STOP_TIMEOUT); + break; + } start_vm(argv[i]); break; default: diff --git a/tools/acrn-manager/acrnctl.h b/tools/acrn-manager/acrnctl.h index 6a94cdb62..dc5e23800 100644 --- a/tools/acrn-manager/acrnctl.h +++ b/tools/acrn-manager/acrnctl.h @@ -28,7 +28,7 @@ extern const char *state_str[]; * * @return vmmngr_struct * if find, NULL not find */ -struct vmmngr_struct *vmmngr_find(char *vmname); +struct vmmngr_struct *vmmngr_find(const char *vmname); /* Per-vm vm managerment struct */ struct vmmngr_struct {