mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-23 05:57:33 +00:00
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:
parent
64a9b2b423
commit
2d802d0afe
@ -27,7 +27,7 @@ struct mngr_msg {
|
||||
int err;
|
||||
|
||||
/* ack of WAKEUP_REASON */
|
||||
int reason;
|
||||
unsigned reason;
|
||||
|
||||
/* ack of DM_QUERY */
|
||||
int state;
|
||||
|
@ -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) {
|
||||
|
@ -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]);
|
||||
if (!s) {
|
||||
printf("Can't find vm %s\n", argv[i]);
|
||||
continue;
|
||||
}
|
||||
s = vmmngr_find(argv[1]);
|
||||
if (!s) {
|
||||
printf("Can't find vm %s\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (s->state) {
|
||||
case VM_PAUSED:
|
||||
resume_vm(argv[i]);
|
||||
break;
|
||||
default:
|
||||
printf("%s current state %s, can't resume\n",
|
||||
argv[i], state_str[s->state]);
|
||||
}
|
||||
if (argc == 3) {
|
||||
sscanf(argv[2], "%x", &reason);
|
||||
reason = (reason & (0xff << 24)) ? 0 : reason;
|
||||
}
|
||||
|
||||
switch (s->state) {
|
||||
case VM_PAUSED:
|
||||
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[1], state_str[s->state]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -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_ */
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user