Skip to content

Commit 4ae88bb

Browse files
lyan3wenlingz
authored andcommitted
tools: acrn-manager: fix acrnctl reset issue
Wait for targeting VM stopping before starting it again Tracked-On: #926 Signed-off-by: Yan, Like <like.yan@intel.com> Acked-by: Yin Fengwei <fengwei.yin@intel.com>
1 parent f42209c commit 4ae88bb

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

tools/acrn-manager/acrn_vm_ops.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static pthread_mutex_t vmmngr_mutex = PTHREAD_MUTEX_INITIALIZER;
5050
struct vmmngr_list_struct vmmngr_head;
5151
static unsigned long update_count = 0;
5252

53-
struct vmmngr_struct *vmmngr_find(char *name)
53+
struct vmmngr_struct *vmmngr_find(const char *name)
5454
{
5555
struct vmmngr_struct *s;
5656

tools/acrn-manager/acrnctl.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#define RESUME_DESC "Resume virtual machine from suspend state"
3939
#define RESET_DESC "Stop and then start virtual machine VM_NAME"
4040

41+
#define STOP_TIMEOUT 10U
42+
4143
struct acrnctl_cmd {
4244
const char *cmd;
4345
const char desc[128]; /* Description of the cmd */
@@ -492,6 +494,25 @@ static int acrnctl_do_resume(int argc, char *argv[])
492494
return 0;
493495
}
494496

497+
static int wait_vm_stop(const char * vmname, unsigned int timeout)
498+
{
499+
unsigned long t = timeout;
500+
struct vmmngr_struct *s;
501+
502+
do {
503+
/* list and update the vm status */
504+
vmmngr_update();
505+
506+
s = vmmngr_find(vmname);
507+
if (s->state == VM_CREATED)
508+
return 0;
509+
510+
sleep(1);
511+
} while (t--);
512+
513+
return -1;
514+
}
515+
495516
static int acrnctl_do_reset(int argc, char *argv[])
496517
{
497518
struct vmmngr_struct *s;
@@ -511,6 +532,11 @@ static int acrnctl_do_reset(int argc, char *argv[])
511532
case VM_STARTED:
512533
case VM_PAUSED:
513534
stop_vm(argv[i]);
535+
if (wait_vm_stop(argv[i], STOP_TIMEOUT)) {
536+
printf("Failed to stop %s in %u sec\n",
537+
argv[i], STOP_TIMEOUT);
538+
break;
539+
}
514540
start_vm(argv[i]);
515541
break;
516542
default:

tools/acrn-manager/acrnctl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extern const char *state_str[];
2828
*
2929
* @return vmmngr_struct * if find, NULL not find
3030
*/
31-
struct vmmngr_struct *vmmngr_find(char *vmname);
31+
struct vmmngr_struct *vmmngr_find(const char *vmname);
3232

3333
/* Per-vm vm managerment struct */
3434
struct vmmngr_struct {

0 commit comments

Comments
 (0)