From 2d802d0afefd32fc6f1862cb5b2e33949a182c11 Mon Sep 17 00:00:00 2001 From: "yuhong.tao@intel.com" Date: Fri, 10 Aug 2018 18:31:55 +0800 Subject: [PATCH] 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 Signed-off-by: Tao Yuhong --- tools/acrn-manager/acrn_mngr.h | 2 +- tools/acrn-manager/acrn_vm_ops.c | 4 +++- tools/acrn-manager/acrnctl.c | 34 ++++++++++++++++++-------------- tools/acrn-manager/acrnctl.h | 2 +- tools/acrn-manager/acrnd.c | 9 +++++++-- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/tools/acrn-manager/acrn_mngr.h b/tools/acrn-manager/acrn_mngr.h index 6a93ea830..12c9f1c5d 100644 --- a/tools/acrn-manager/acrn_mngr.h +++ b/tools/acrn-manager/acrn_mngr.h @@ -27,7 +27,7 @@ struct mngr_msg { int err; /* ack of WAKEUP_REASON */ - int reason; + unsigned reason; /* ack of DM_QUERY */ int state; diff --git a/tools/acrn-manager/acrn_vm_ops.c b/tools/acrn-manager/acrn_vm_ops.c index cd8ad29a4..a56e04316 100644 --- a/tools/acrn-manager/acrn_vm_ops.c +++ b/tools/acrn-manager/acrn_vm_ops.c @@ -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) { diff --git a/tools/acrn-manager/acrnctl.c b/tools/acrn-manager/acrnctl.c index 84465a2e8..1fb3cea8c 100644 --- a/tools/acrn-manager/acrnctl.c +++ b/tools/acrn-manager/acrnctl.c @@ -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; diff --git a/tools/acrn-manager/acrnctl.h b/tools/acrn-manager/acrnctl.h index 721a637c3..12447487c 100644 --- a/tools/acrn-manager/acrnctl.h +++ b/tools/acrn-manager/acrnctl.h @@ -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_ */ diff --git a/tools/acrn-manager/acrnd.c b/tools/acrn-manager/acrnd.c index 65783fd76..3b47bdd7d 100644 --- a/tools/acrn-manager/acrnd.c +++ b/tools/acrn-manager/acrnd.c @@ -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();