misc: life_mngr: Fix Linux and rtvm not restarting acrn in life_mngr

Only Windows virtual machines can restart ACRN through life_mngr.
Added Linux and rtvm to restart acrn in life_mngr.

Tracked-On: #8431
Signed-off-by: Gaofei Sun <gaofeix.sun@intel.com>
Reviewed-by: Li Fei <fei1.li@intel.com>
This commit is contained in:
Gaofei Sun 2023-06-20 13:02:15 +08:00 committed by acrnsi-robot
parent aebc16e9e5
commit d2fae30b23
7 changed files with 66 additions and 0 deletions

View File

@ -61,6 +61,7 @@ all-linux: life_mngr.service
$(CC) -g $(LM_C_SRCS) -o $(OUT_DIR)/life_mngr -lpthread $(LIFEMNGR_CFLAGS) $(LIFEMNGR_LDFLAGS)
cp life_mngr.conf $(OUT_DIR)/life_mngr.conf
cp s5_trigger_linux.py $(OUT_DIR)/s5_trigger_linux.py
cp system_reboot_trigger_linux_rtvm.py $(OUT_DIR)/system_reboot_trigger_linux_rtvm.py
# only build for Windows if cross compiler is installed
all-win:
@ -81,6 +82,7 @@ ifneq ($(OUT_DIR),.)
rm -f $(OUT_DIR)/life_mngr.service
rm -f $(OUT_DIR)/life_mngr.conf
rm -f $(OUT_DIR)/s5_trigger_linux.py
rm -f $(OUT_DIR)/system_reboot_trigger_linux_rtvm.py
rm -rf $(OUT_DIR)
endif

View File

@ -37,6 +37,7 @@
GEN_CMD_OBJ(USER_VM_REBOOT, USER_VM_REBOOT_ID),\
GEN_CMD_OBJ(ACK_USER_VM_REBOOT, ACK_USER_VM_REBOOT_ID),\
GEN_CMD_OBJ(REQ_SYS_REBOOT, REQ_SYS_REBOOT_ID), \
GEN_CMD_OBJ(ACK_REQ_SYS_REBOOT, ACK_REQ_SYS_REBOOT_ID), \
struct command dm_command_list[CMD_END] = {CMD_OBJS};

View File

@ -52,6 +52,7 @@ enum command_id {
USER_VM_REBOOT_ID,
ACK_USER_VM_REBOOT_ID,
REQ_SYS_REBOOT_ID,
ACK_REQ_SYS_REBOOT_ID,
CMD_END,
};

View File

@ -173,6 +173,33 @@ int socket_req_user_vm_reboot_handler(void *arg, int fd)
{
return req_user_vm_shutdown_reboot(arg, fd, USER_VM_REBOOT, ACK_REQ_USER_VM_REBOOT);
}
int socket_req_system_reboot_handler(void *arg, int fd)
{
int ret;
struct channel_dev *c_dev = NULL;
usleep(LISTEN_INTERVAL + SECOND_TO_US);
c_dev = (struct channel_dev *)LIST_FIRST(&channel->tty_conn_head);
if (c_dev == NULL) {
(void) send_socket_ack(arg, fd, USER_VM_DISCONNECT);
LOG_WRITE("User VM is disconnect\n");
return 0;
}
ret = send_socket_ack(arg, fd, ACK_REQ_SYS_REBOOT);
if (ret < 0) {
LOG_WRITE("Failed to send ACK by socket\n");
return 0;
}
LOG_WRITE("Foward reboot req to service VM by UART\n");
start_uart_channel_dev_resend(c_dev, REQ_SYS_REBOOT, MIN_RESEND_TIME);
ret = send_message_by_uart(c_dev->uart_device, REQ_SYS_REBOOT, strlen(REQ_SYS_REBOOT));
if (ret < 0)
LOG_WRITE("Failed to foward system reboot request to service VM by UART\n");
return ret;
}
int socket_req_system_shutdown_user_vm_handler(void *arg, int fd)
{
int ret;

View File

@ -29,6 +29,8 @@ int socket_req_user_vm_shutdown_handler(void *arg, int fd);
* @brief The handler of request user reboot command on socket in service VM
*/
int socket_req_user_vm_reboot_handler(void *arg, int fd);
int socket_req_system_reboot_handler(void *arg, int fd);
/**
* @brief The handler of request system shutdown command on socket in user VM
*/

View File

@ -98,6 +98,8 @@ int init_socket_server_and_shutdown_commands(bool service_vm)
} else {
register_command_handler(socket_req_system_shutdown_user_vm_handler,
sock_server, REQ_SYS_SHUTDOWN);
register_command_handler(socket_req_system_reboot_handler,
sock_server, REQ_SYS_REBOOT);
}
return ret;
}

View File

@ -0,0 +1,31 @@
#!/usr/bin/env python3
#
# Copyright (C) 2021 Intel Corporation.
#
# SPDX-License-Identifier: BSD-3-Clause
#
import socket
class SocketClient:
def __init__(self):
pass
def connect_to_server(self):
SOKET_ADDR = '/var/lib/life_mngr/monitor.sock'
SHUTDOWN_REQ = 'req_sys_reboot'
BUF_LEN = 1024
# unix domain sockets
server_address = SOKET_ADDR
socket_family = socket.AF_UNIX
socket_type = socket.SOCK_STREAM
sock = socket.socket(socket_family, socket_type)
sock.connect(server_address)
sock.sendall(SHUTDOWN_REQ.encode())
data = sock.recv(BUF_LEN)
print(f"Waiting for ACK message...: {data.decode()}")
sock.close()
if __name__ == "__main__":
socket_client_obj = SocketClient()
socket_client_obj.connect_to_server()