tools: acrn-manager: fix acrnctl reset issue

Wait for targeting VM stopping before starting it again

Tracked-On: projectacrn/acrn-hypervisor#926
Signed-off-by: Yan, Like <like.yan@intel.com>
Acked-by: Yin Fengwei <fengwei.yin@intel.com>
This commit is contained in:
Yan, Like 2018-09-07 17:34:30 +08:00 committed by wenlingz
parent f42209c567
commit 4ae88bb676
3 changed files with 28 additions and 2 deletions

View File

@ -50,7 +50,7 @@ static pthread_mutex_t vmmngr_mutex = PTHREAD_MUTEX_INITIALIZER;
struct vmmngr_list_struct vmmngr_head; struct vmmngr_list_struct vmmngr_head;
static unsigned long update_count = 0; 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; struct vmmngr_struct *s;

View File

@ -38,6 +38,8 @@
#define RESUME_DESC "Resume virtual machine from suspend state" #define RESUME_DESC "Resume virtual machine from suspend state"
#define RESET_DESC "Stop and then start virtual machine VM_NAME" #define RESET_DESC "Stop and then start virtual machine VM_NAME"
#define STOP_TIMEOUT 10U
struct acrnctl_cmd { struct acrnctl_cmd {
const char *cmd; const char *cmd;
const char desc[128]; /* Description of the cmd */ const char desc[128]; /* Description of the cmd */
@ -492,6 +494,25 @@ static int acrnctl_do_resume(int argc, char *argv[])
return 0; 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[]) static int acrnctl_do_reset(int argc, char *argv[])
{ {
struct vmmngr_struct *s; struct vmmngr_struct *s;
@ -511,6 +532,11 @@ static int acrnctl_do_reset(int argc, char *argv[])
case VM_STARTED: case VM_STARTED:
case VM_PAUSED: case VM_PAUSED:
stop_vm(argv[i]); 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]); start_vm(argv[i]);
break; break;
default: default:

View File

@ -28,7 +28,7 @@ extern const char *state_str[];
* *
* @return vmmngr_struct * if find, NULL not find * @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 */ /* Per-vm vm managerment struct */
struct vmmngr_struct { struct vmmngr_struct {