From 653aa859b1de0195f7c6312fff6f3596d5305d73 Mon Sep 17 00:00:00 2001 From: "yuhong.tao@intel.com" Date: Thu, 27 Jun 2019 14:44:18 +0000 Subject: [PATCH] DM: monitor support force stop When someone send DM message DM_STOP, with a non-zero data.acrnd_stop.force value, DM set suspend mode to VM_SUSPEND_POWEROFF directly, that will cause DM quit main loop. That can force stop VM Tracked-On: #3484 Signed-off-by: Tao Yuhong Reviewed-by: Yan, Like --- devicemodel/core/monitor.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/devicemodel/core/monitor.c b/devicemodel/core/monitor.c index f013df6e2..f924249df 100644 --- a/devicemodel/core/monitor.c +++ b/devicemodel/core/monitor.c @@ -337,11 +337,42 @@ static void name(struct mngr_msg *msg, int client_fd, void *param) \ mngr_send_msg(client_fd, &ack, NULL, ACK_TIMEOUT); \ } -DEFINE_HANDLER(handle_stop, stop); DEFINE_HANDLER(handle_suspend, suspend); DEFINE_HANDLER(handle_pause, pause); DEFINE_HANDLER(handle_continue, unpause); +static void handle_stop(struct mngr_msg *msg, int client_fd, void *param) +{ + struct mngr_msg ack; + struct vm_ops *ops; + int ret = 0; + int count = 0; + + ack.magic = MNGR_MSG_MAGIC; + ack.msgid = msg->msgid; + ack.timestamp = msg->timestamp; + + if (msg->data.acrnd_stop.force) { + vm_set_suspend_mode(VM_SUSPEND_POWEROFF); + ack.data.err = 0; + } else { + LIST_FOREACH(ops, &vm_ops_head, list) { + if (ops->ops->stop) { + ret += ops->ops->stop(ops->arg); + count++; + } + } + + if (!count) { + ack.data.err = -1; + pr_err("No handler for id:%u\r\n", msg->msgid); + } else + ack.data.err = ret; + } + + mngr_send_msg(client_fd, &ack, NULL, ACK_TIMEOUT); +} + static void handle_resume(struct mngr_msg *msg, int client_fd, void *param) { struct mngr_msg ack;