From 7d3837ea2c0cf06da0a944119ed3758d28c2bb5c Mon Sep 17 00:00:00 2001 From: luckky Date: Tue, 19 Nov 2024 20:25:32 +0800 Subject: [PATCH 1/2] hbm online repair add unload driver --- .../c/hbm_online_repair/hbm_online_repair.c | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c b/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c index 00c9c0b..2560dc3 100644 --- a/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c +++ b/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c @@ -11,6 +11,8 @@ #define DEFAULT_LOG_LEVEL LOG_INFO #define DEFAULT_PAGE_ISOLATION_THRESHOLD 3355443 +#define DRIVER_COMMAND_LEN 32 + int global_level_setting; int page_isolation_threshold; @@ -57,25 +59,34 @@ int execute_command(const char *command) return -1; } - ret = WEXITSTATUS(ret); + ret = -WEXITSTATUS(ret); log(LOG_DEBUG, "command %s exited with status: %d\n", command, ret); return ret; } -int load_required_driver(void) +int handle_driver(char* driver_name, bool load) { int ret; - ret = execute_command("modprobe hisi_mem_ras 2>&1"); + char command[DRIVER_COMMAND_LEN]; + + snprintf(command, DRIVER_COMMAND_LEN, "%s %s 2>&1", load ? "modprobe" : "rmmod", driver_name); + ret = execute_command(command); if (ret < 0) { - log(LOG_ERROR, "load repair driver failed\n"); - return ret; + log(LOG_ERROR, "%s %s failed\n", load ? "load" : "unload", driver_name); } - ret = execute_command("modprobe page_eject 2>&1"); - if (ret < 0) { - log(LOG_ERROR, "load page driver failed\n"); + log(LOG_DEBUG, "%s %s success\n", load ? "load" : "unload", driver_name); + return ret; +} + +int handle_all_drivers(bool load) +{ + int ret; + + ret = handle_driver("hisi_mem_ras", load); + if (ret < 0) return ret; - } - log(LOG_INFO, "load required driver success\n"); + + ret = handle_driver("page_eject", load); return ret; } @@ -116,21 +127,21 @@ int main(int argc, char *argv[]) hbm_param_init(); - ret = load_required_driver(); + ret = handle_all_drivers(true); if (ret < 0) { - log(LOG_DEBUG, "load required driver failed\n"); return ret; } struct ras_events *ras = init_trace_instance(); - if (!ras) - return -1; + if (!ras) { + ret = -1; + goto err_unload; + } ret = toggle_ras_event(ras->tracing, "ras", "non_standard_event", 1); if (ret < 0) { log(LOG_WARNING, "unable to enable ras non_standard_event.\n"); - free(ras); - return -1; + goto err_free; } get_flash_total_size(); @@ -142,6 +153,9 @@ int main(int argc, char *argv[]) log(LOG_WARNING, "unable to disable ras non_standard_event.\n"); } +err_free: free(ras); +err_unload: + handle_all_drivers(false); return ret; } -- Gitee From 173abd9e22a3db235d630f1e0a7b37c641eb7854 Mon Sep 17 00:00:00 2001 From: luckky Date: Tue, 19 Nov 2024 20:28:33 +0800 Subject: [PATCH 2/2] hbm online repair add pid file to keep single instance running --- .../c/hbm_online_repair/hbm_online_repair.c | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c b/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c index 2560dc3..c97173a 100644 --- a/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c +++ b/sysSentry-1.0.2/src/c/hbm_online_repair/hbm_online_repair.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "logger.h" #include "ras-events.h" @@ -10,12 +11,66 @@ #define DEFAULT_LOG_LEVEL LOG_INFO #define DEFAULT_PAGE_ISOLATION_THRESHOLD 3355443 +#define PID_FILE_PATH "/var/run/"TOOL_NAME".pid" #define DRIVER_COMMAND_LEN 32 int global_level_setting; int page_isolation_threshold; +int handle_file_lock(int fd, bool lock) +{ + int ret; + struct flock fl; + fl.l_type = lock ? F_WRLCK : F_UNLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + + ret = fcntl(fd, F_SETLK, &fl); + if (ret < 0) { + log(LOG_ERROR, "fcntl failed, error msg is %s\n", strerror(errno)); + } + log(LOG_DEBUG, "fcntl success, lock ret code is %d\n", ret); + return ret; +} + +int check_and_set_pid_file() +{ + int ret, fd; + fd = open(PID_FILE_PATH, O_CREAT | O_RDWR, 0600); + if (fd < 0) { + log(LOG_ERROR, "open file %s failed!\n", PID_FILE_PATH); + return -1; + } + + ret = handle_file_lock(fd, true); + if (ret < 0) { + log(LOG_ERROR, "%s is already running\n", TOOL_NAME); + close(fd); + return ret; + } + + return fd; +} + +int release_pid_file(int fd) +{ + int ret; + ret = handle_file_lock(fd, false); + if (ret < 0) { + log(LOG_ERROR, "release pid file %s lock failed, error msg is %s\n", PID_FILE_PATH, strerror(errno)); + return ret; + } + + close(fd); + ret = remove(PID_FILE_PATH); + if (ret < 0) { + log(LOG_ERROR, "remove %s failed, error msg is %s\n", PID_FILE_PATH, strerror(errno)); + } + return ret; +} + int string2int(const char* str, int* value) { if (!str) { @@ -123,13 +178,18 @@ void hbm_param_init(void) int main(int argc, char *argv[]) { - int ret; + int ret, pid_fd; hbm_param_init(); + pid_fd = check_and_set_pid_file(); + if (pid_fd < 0) { + return pid_fd; + } + ret = handle_all_drivers(true); if (ret < 0) { - return ret; + goto err_release; } struct ras_events *ras = init_trace_instance(); @@ -157,5 +217,7 @@ err_free: free(ras); err_unload: handle_all_drivers(false); +err_release: + release_pid_file(pid_fd); return ret; } -- Gitee