mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-23 14:07:42 +00:00
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:
parent
f42209c567
commit
4ae88bb676
@ -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;
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user