From d2fae30b23ab7eb8c2ee2686d24e5592043b661b Mon Sep 17 00:00:00 2001 From: Gaofei Sun Date: Tue, 20 Jun 2023 13:02:15 +0800 Subject: [PATCH] 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 Reviewed-by: Li Fei --- misc/services/life_mngr/Makefile | 2 ++ misc/services/life_mngr/command.c | 1 + misc/services/life_mngr/command.h | 1 + misc/services/life_mngr/command_handler.c | 27 ++++++++++++++++ misc/services/life_mngr/command_handler.h | 2 ++ misc/services/life_mngr/monitor.c | 2 ++ .../system_reboot_trigger_linux_rtvm.py | 31 +++++++++++++++++++ 7 files changed, 66 insertions(+) create mode 100644 misc/services/life_mngr/system_reboot_trigger_linux_rtvm.py diff --git a/misc/services/life_mngr/Makefile b/misc/services/life_mngr/Makefile index 1ecd6220e..7b6f7e195 100644 --- a/misc/services/life_mngr/Makefile +++ b/misc/services/life_mngr/Makefile @@ -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 diff --git a/misc/services/life_mngr/command.c b/misc/services/life_mngr/command.c index 3124a579d..4be9c478a 100644 --- a/misc/services/life_mngr/command.c +++ b/misc/services/life_mngr/command.c @@ -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}; diff --git a/misc/services/life_mngr/command.h b/misc/services/life_mngr/command.h index f2430a26f..79ca1fef4 100644 --- a/misc/services/life_mngr/command.h +++ b/misc/services/life_mngr/command.h @@ -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, }; diff --git a/misc/services/life_mngr/command_handler.c b/misc/services/life_mngr/command_handler.c index 1838b1f22..8b0a49604 100644 --- a/misc/services/life_mngr/command_handler.c +++ b/misc/services/life_mngr/command_handler.c @@ -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; diff --git a/misc/services/life_mngr/command_handler.h b/misc/services/life_mngr/command_handler.h index d8d6229ce..c0b69fe48 100644 --- a/misc/services/life_mngr/command_handler.h +++ b/misc/services/life_mngr/command_handler.h @@ -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 */ diff --git a/misc/services/life_mngr/monitor.c b/misc/services/life_mngr/monitor.c index f3e83c88a..20e1c5785 100644 --- a/misc/services/life_mngr/monitor.c +++ b/misc/services/life_mngr/monitor.c @@ -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; } diff --git a/misc/services/life_mngr/system_reboot_trigger_linux_rtvm.py b/misc/services/life_mngr/system_reboot_trigger_linux_rtvm.py new file mode 100644 index 000000000..13f9be3e4 --- /dev/null +++ b/misc/services/life_mngr/system_reboot_trigger_linux_rtvm.py @@ -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()