tools: vm_resume() requires wakeup reason

DM need to know wakeup reason when resume the VM, so
vm_resume(char *name) is updated to vm_resume(char *name, unsigned reason),
in acrn_vm_ops.c

Acked-by: Yan Like <like.yan@intel.com>
Signed-off-by: Tao Yuhong <yuhong.tao@intel.com>
This commit is contained in:
yuhong.tao@intel.com 2018-08-10 18:31:55 +08:00 committed by lijinxia
parent 64a9b2b423
commit 2d802d0afe
5 changed files with 31 additions and 20 deletions

View File

@ -27,7 +27,7 @@ struct mngr_msg {
int err;
/* ack of WAKEUP_REASON */
int reason;
unsigned reason;
/* ack of DM_QUERY */
int state;

View File

@ -392,7 +392,7 @@ int suspend_vm(char *vmname)
return ack.data.err;
}
int resume_vm(char *vmname)
int resume_vm(char *vmname, unsigned reason)
{
struct mngr_msg req;
struct mngr_msg ack;
@ -401,6 +401,8 @@ int resume_vm(char *vmname)
req.msgid = DM_RESUME;
req.timestamp = time(NULL);
req.data.reason = reason;
send_msg(vmname, &req, &ack);
if (ack.data.err) {

View File

@ -466,23 +466,27 @@ static int acrnctl_do_suspend(int argc, char *argv[])
static int acrnctl_do_resume(int argc, char *argv[])
{
struct vmmngr_struct *s;
int i;
unsigned reason = 0;
for (i = 1; i < argc; i++) {
s = vmmngr_find(argv[i]);
s = vmmngr_find(argv[1]);
if (!s) {
printf("Can't find vm %s\n", argv[i]);
continue;
printf("Can't find vm %s\n", argv[1]);
return -1;
}
if (argc == 3) {
sscanf(argv[2], "%x", &reason);
reason = (reason & (0xff << 24)) ? 0 : reason;
}
switch (s->state) {
case VM_PAUSED:
resume_vm(argv[i]);
resume_vm(argv[1], reason);
printf("resume %s reason(0x%x\n", argv[1], reason);
break;
default:
printf("%s current state %s, can't resume\n",
argv[i], state_str[s->state]);
}
argv[1], state_str[s->state]);
}
return 0;

View File

@ -56,6 +56,6 @@ int start_vm(char *vmname);
int pause_vm(char *vmname);
int continue_vm(char *vmname);
int suspend_vm(char *vmname);
int resume_vm(char *vmname);
int resume_vm(char *vmname, unsigned reason);
#endif /* _ACRNCTL_H_ */

View File

@ -105,11 +105,13 @@ static void try_do_works(void)
}
static void acrnd_run_vm(char *name);
unsigned get_sos_wakeup_reason(void);
/* Time to run/resume VM */
void acrnd_vm_timer_func(struct work_arg *arg)
{
struct vmmngr_struct *vm;
unsigned reason;
if (!arg) {
pdebug();
@ -128,7 +130,8 @@ void acrnd_vm_timer_func(struct work_arg *arg)
acrnd_run_vm(arg->name);
break;
case VM_PAUSED:
resume_vm(arg->name);
reason = get_sos_wakeup_reason();
resume_vm(arg->name, reason);
break;
default:
pdebug();
@ -235,6 +238,7 @@ static int active_all_vms(void)
struct vmmngr_struct *vm;
int ret = 0;
pid_t pid;
unsigned reason;
vmmngr_update();
@ -246,7 +250,8 @@ static int active_all_vms(void)
acrnd_run_vm(vm->name);
break;
case VM_PAUSED:
ret += resume_vm(vm->name);
reason = get_sos_wakeup_reason();
ret += resume_vm(vm->name, reason);
break;
default:
pdebug();