mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-30 09:12:57 +00:00
tools: acrnd: handle resume request from SOS-LCS
SOS-Life-Cycle-Service can send ACRND_RESUME to Acrnd. Acrnd first check If there is a timer list to be load. Then check wakeup reason, just wait timer works to expire when wakeup reason is RTC, or acrnd will start/resume all VMs. Reviewed-by: Yan Like <like.yan@intel.com> Signed-off-by: Tao Yuhong <yuhong.tao@intel.com>
This commit is contained in:
parent
04ed916f26
commit
f5e9c768e3
@ -27,18 +27,84 @@ int load_timer_list(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ACRND_LOG_FMT "/opt/acrn/%s.log"
|
||||||
|
|
||||||
|
static void acrnd_run_vm(char *name)
|
||||||
|
{
|
||||||
|
char log_path[128] = {};
|
||||||
|
|
||||||
|
snprintf(log_path, sizeof(log_path) -1, ACRND_LOG_FMT, name);
|
||||||
|
unlink(log_path);
|
||||||
|
stdin = freopen(log_path, "w+", stdin);
|
||||||
|
stdout = freopen(log_path, "w+", stdout);
|
||||||
|
stderr = freopen(log_path, "w+", stderr);
|
||||||
|
fflush(stdin);
|
||||||
|
fflush(stdout);
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
start_vm(name);
|
||||||
|
printf("%s exited!\n", name);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
static int active_all_vms(void)
|
static int active_all_vms(void)
|
||||||
{
|
{
|
||||||
return -1;
|
struct vmmngr_struct *vm;
|
||||||
|
int ret = 0;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
vmmngr_update();
|
||||||
|
|
||||||
|
LIST_FOREACH(vm, &vmmngr_head, list) {
|
||||||
|
switch (vm->state) {
|
||||||
|
case VM_CREATED:
|
||||||
|
pid = fork();
|
||||||
|
if (!pid)
|
||||||
|
acrnd_run_vm(vm->name);
|
||||||
|
break;
|
||||||
|
case VM_PAUSED:
|
||||||
|
ret += resume_vm(vm->name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pdebug();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SOS_LCS_SOCK "sos-lcs"
|
#define SOS_LCS_SOCK "sos-lcs"
|
||||||
|
#define DEFAULT_TIMEOUT 2U
|
||||||
#define ACRND_NAME "acrnd"
|
#define ACRND_NAME "acrnd"
|
||||||
static int acrnd_fd = -1;
|
static int acrnd_fd = -1;
|
||||||
|
|
||||||
unsigned get_sos_wakeup_reason(void)
|
unsigned get_sos_wakeup_reason(void)
|
||||||
{
|
{
|
||||||
return 0;
|
int client_fd, ret = 0;
|
||||||
|
struct req_wakeup_reason req;
|
||||||
|
struct ack_wakeup_reason ack;
|
||||||
|
|
||||||
|
client_fd = mngr_open_un(SOS_LCS_SOCK, MNGR_CLIENT);
|
||||||
|
if (client_fd <= 0) {
|
||||||
|
fprintf(stderr, "Failed to open the socket(%s) to query the "
|
||||||
|
"reason for the wake-up", SOS_LCS_SOCK);
|
||||||
|
goto EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
req.msg.magic = MNGR_MSG_MAGIC;
|
||||||
|
req.msg.msgid = WAKEUP_REASON;
|
||||||
|
req.msg.timestamp = time(NULL);
|
||||||
|
req.msg.len = sizeof(struct req_wakeup_reason);
|
||||||
|
|
||||||
|
if (mngr_send_msg(client_fd, (void *)&req, (void *)&ack, sizeof(ack),
|
||||||
|
DEFAULT_TIMEOUT))
|
||||||
|
fprintf(stderr, "Failed to get wakeup_reason from SOS, err(%d)\n", ret);
|
||||||
|
else
|
||||||
|
ret = ack.reason;
|
||||||
|
|
||||||
|
mngr_close(client_fd);
|
||||||
|
EXIT:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_timer_req(struct mngr_msg *msg, int client_fd, void *param)
|
static void handle_timer_req(struct mngr_msg *msg, int client_fd, void *param)
|
||||||
@ -98,6 +164,40 @@ static void handle_acrnd_stop(struct mngr_msg *msg, int client_fd, void *param)
|
|||||||
|
|
||||||
void handle_acrnd_resume(struct mngr_msg *msg, int client_fd, void *param)
|
void handle_acrnd_resume(struct mngr_msg *msg, int client_fd, void *param)
|
||||||
{
|
{
|
||||||
|
struct req_acrnd_resume *req = (void *)msg;
|
||||||
|
struct ack_acrnd_resume ack;
|
||||||
|
struct stat st;
|
||||||
|
int wakeup_reason;
|
||||||
|
|
||||||
|
ack.msg.msgid = req->msg.msgid;
|
||||||
|
ack.msg.len = sizeof(ack);
|
||||||
|
ack.msg.timestamp = req->msg.timestamp;
|
||||||
|
ack.err = 0;
|
||||||
|
|
||||||
|
/* Do we have a timer list file to load? */
|
||||||
|
if (!stat(TIMER_LIST_FILE, &st))
|
||||||
|
if (S_ISREG(st.st_mode)) {
|
||||||
|
ack.err = load_timer_list();
|
||||||
|
if (ack.err)
|
||||||
|
pdebug();
|
||||||
|
goto reply_ack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* acrnd get wakeup_reason from sos lcs */
|
||||||
|
wakeup_reason = get_sos_wakeup_reason();
|
||||||
|
|
||||||
|
if (wakeup_reason & CBC_WK_RSN_RTC) {
|
||||||
|
/* do nothing, just wait the acrnd_work to expire */
|
||||||
|
goto reply_ack;
|
||||||
|
}
|
||||||
|
|
||||||
|
ack.err = active_all_vms();
|
||||||
|
|
||||||
|
reply_ack:
|
||||||
|
unlink(TIMER_LIST_FILE);
|
||||||
|
|
||||||
|
if (client_fd > 0)
|
||||||
|
mngr_send_msg(client_fd, (void *)&ack, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_on_exit(void)
|
static void handle_on_exit(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user