From e435f03eda5b42f622e0eba4b314d8f7fe261d0c Mon Sep 17 00:00:00 2001 From: "yuhong.tao@intel.com" Date: Tue, 26 Jun 2018 20:45:50 +0800 Subject: [PATCH] tools: acrnd: handle timer request from UOS DM can send ACRND_TIMER to Acrnd, then acrnd will setup a timer for it. When this time is expired, acrnd will try to make this UOS run again. Reviewed-by: Yan Like Signed-off-by: Tao Yuhong --- tools/acrn-manager/acrnd.c | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tools/acrn-manager/acrnd.c b/tools/acrn-manager/acrnd.c index f87333e51..3421de714 100644 --- a/tools/acrn-manager/acrnd.c +++ b/tools/acrn-manager/acrnd.c @@ -102,6 +102,37 @@ static void try_do_works(void) } } +static void acrnd_run_vm(char *name); + +/* Time to run/resume VM */ +void acrnd_vm_timer_func(struct work_arg *arg) +{ + struct vmmngr_struct *vm; + + if (!arg) { + pdebug(); + return; + } + + vmmngr_update(); + vm = vmmngr_find(arg->name); + if (!vm) { + pdebug(); + return; + } + + switch (vm->state) { + case VM_CREATED: + acrnd_run_vm(arg->name); + break; + case VM_PAUSED: + resume_vm(arg->name); + break; + default: + pdebug(); + } +} + #define TIMER_LIST_FILE "/opt/acrn/conf/timer_list" /* load/store_timer_list to file to keep timers if SOS poweroff */ @@ -192,6 +223,34 @@ unsigned get_sos_wakeup_reason(void) static void handle_timer_req(struct mngr_msg *msg, int client_fd, void *param) { + struct req_acrnd_timer *req = (void *)msg; + struct ack_acrnd_timer ack; + struct vmmngr_struct *vm; + struct work_arg arg = {}; + + ack.msg.msgid = req->msg.msgid; + ack.msg.len = sizeof(ack); + ack.msg.timestamp = req->msg.timestamp; + ack.err = -1; + + vmmngr_update(); + vm = vmmngr_find(req->name); + if (!vm) { + pdebug(); + goto reply_ack; + } + + strncpy(arg.name, req->name, sizeof(arg.name) - 1); + + if (acrnd_add_work(acrnd_vm_timer_func, &arg, req->t)) { + pdebug(); + goto reply_ack; + } + + ack.err = 0; + reply_ack: + if (client_fd > 0) + mngr_send_msg(client_fd, (void *)&ack, NULL, 0, 0); } static int store_timer_list(void)