From 021ba1c430e1a62c9330240515178e341f5b4882 Mon Sep 17 00:00:00 2001 From: zhangyaqi Date: Wed, 13 Mar 2024 13:42:50 +0800 Subject: [PATCH] fix Do not go into freeze when systemd crashd --- ...t-go-into-freeze-when-systemd-crashd.patch | 140 ++++++++++++++++++ systemd.spec | 6 +- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 fix-do-not-go-into-freeze-when-systemd-crashd.patch diff --git a/fix-do-not-go-into-freeze-when-systemd-crashd.patch b/fix-do-not-go-into-freeze-when-systemd-crashd.patch new file mode 100644 index 0000000..eb24d20 --- /dev/null +++ b/fix-do-not-go-into-freeze-when-systemd-crashd.patch @@ -0,0 +1,140 @@ +From 84b4fb91fcbf10fa7c5b4951025af35ebe3609ec Mon Sep 17 00:00:00 2001 +From: zhang yaqi +Date: Wed, 13 Mar 2024 10:27:15 +0800 +Subject: [PATCH] fix do not go into freeze when systemd crashd + +Systemd go into freezing execution when crashed.Systemctl cmdline cannot works, unless reboot -f -f. +Fix it makes systemd do not go into freezing execution,means systemctl is available. + +--- + src/core/crash-handler.c | 30 +++++++++++++++++++++++++++++- + src/core/crash-handler.h | 5 ++++- + src/core/main.c | 14 ++++++++++++-- + src/core/main.h | 3 +++ + 4 files changed, 48 insertions(+), 4 deletions(-) + +diff --git a/src/core/crash-handler.c b/src/core/crash-handler.c +index f5c31b6..dbc88ae 100644 +--- a/src/core/crash-handler.c ++++ b/src/core/crash-handler.c +@@ -16,6 +16,34 @@ + #include "terminal-util.h" + #include "virt.h" + ++void reexec_handler(int sig) { ++ reexec_jmp_can = true; ++} ++ ++_noreturn_ void freeze_wait_upgrade(void) { ++ struct sigaction sa; ++ sigset_t ss; ++ ++ sigemptyset(&ss); ++ sigaddset(&ss, SIGTERM); ++ sigprocmask(SIG_UNBLOCK, &ss, NULL); ++ ++ sa.sa_handler = reexec_handler; ++ sa.sa_flags = SA_RESTART; ++ sigaction(SIGTERM, &sa, NULL); ++ ++ log_error("freeze_wait_upgrade: %d\n", reexec_jmp_inited); ++ reexec_jmp_can = false; ++ while(1) { ++ usleep(10000); ++ if (reexec_jmp_inited && reexec_jmp_can) { ++ log_error("goto manager_reexecute.\n"); ++ siglongjmp(reexec_jmp_buf, 1); ++ } ++ waitpid(-1, NULL, WNOHANG); ++ } ++} ++ + _noreturn_ void freeze_or_exit_or_reboot(void) { + + /* If we are running in a container, let's prefer exiting, after all we can propagate an exit code to +@@ -42,7 +70,7 @@ _noreturn_ void freeze_or_exit_or_reboot(void) { + LOG_MESSAGE("Freezing execution."), + "MESSAGE_ID=" SD_MESSAGE_CRASH_FREEZE_STR); + sync(); +- freeze(); ++ freeze_wait_upgrade(); + } + + _noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) { +diff --git a/src/core/crash-handler.h b/src/core/crash-handler.h +index dc14335..131486c 100644 +--- a/src/core/crash-handler.h ++++ b/src/core/crash-handler.h +@@ -1,7 +1,10 @@ + /* SPDX-License-Identifier: LGPL-2.1-or-later */ + #pragma once +- ++#include ++#include + #include "macro.h" + ++void reexec_handler(int sig); ++_noreturn_ void freeze_wait_upgrade(void); + _noreturn_ void freeze_or_exit_or_reboot(void); + void install_crash_handler(void); +diff --git a/src/core/main.c b/src/core/main.c +index 534c14a..4eb5ede 100644 +--- a/src/core/main.c ++++ b/src/core/main.c +@@ -154,6 +154,9 @@ static void *arg_random_seed; + static size_t arg_random_seed_size; + static usec_t arg_reload_limit_interval_sec; + static unsigned arg_reload_limit_burst; ++bool reexec_jmp_can = false; ++bool reexec_jmp_inited = false; ++sigjmp_buf reexec_jmp_buf; + + /* A copy of the original environment block */ + static char **saved_env = NULL; +@@ -1971,6 +1974,7 @@ static int invoke_main_loop( + const char **ret_error_message) { + + int r; ++ int objective; + + assert(m); + assert(saved_rlimit_nofile); +@@ -1981,8 +1985,14 @@ static int invoke_main_loop( + assert(ret_switch_root_init); + assert(ret_error_message); + ++ reexec_jmp_inited = true; ++ if (sigsetjmp(reexec_jmp_buf, 1)) { ++ objective = MANAGER_REEXECUTE; ++ goto manager_reexecute; ++ } ++ + for (;;) { +- int objective = manager_loop(m); ++ objective = manager_loop(m); + if (objective < 0) { + *ret_error_message = "Failed to run main loop"; + return log_struct_errno(LOG_EMERG, objective, +@@ -2031,7 +2041,7 @@ static int invoke_main_loop( + } + + case MANAGER_REEXECUTE: +- ++manager_reexecute: + manager_send_reloading(m); /* From the perspective of the manager calling us this is + * pretty much the same as a reload */ + +diff --git a/src/core/main.h b/src/core/main.h +index b12a1cc..3a53421 100644 +--- a/src/core/main.h ++++ b/src/core/main.h +@@ -7,3 +7,6 @@ extern bool arg_dump_core; + extern int arg_crash_chvt; + extern bool arg_crash_shell; + extern bool arg_crash_reboot; ++extern bool reexec_jmp_can; ++extern bool reexec_jmp_inited; ++extern sigjmp_buf reexec_jmp_buf; +-- +2.41.0 + diff --git a/systemd.spec b/systemd.spec index 1cc6264..d585419 100644 --- a/systemd.spec +++ b/systemd.spec @@ -25,7 +25,7 @@ Name: systemd Url: https://www.freedesktop.org/wiki/Software/systemd Version: 255 -Release: 5 +Release: 6 License: MIT and LGPLv2+ and GPLv2+ Summary: System and Service Manager @@ -106,6 +106,7 @@ Patch9055: delete-journal-files-except-system.journal-when-jour.patch Patch9056: set-the-cpuset.cpus-mems-of-machine.slice-to-all-by-.patch Patch9057: add-a-new-switch-to-control-whether-udev-complies-wi.patch Patch9058: journal-don-t-enable-systemd-journald-audit.socket.patch +Patch9059: fix-do-not-go-into-freeze-when-systemd-crashd.patch Patch9801: Systemd-Add-sw64-architecture.patch @@ -1635,6 +1636,9 @@ fi %{_libdir}/security/pam_systemd_loadkey.so %changelog +* Wed Mar 13 2024 zhangyaqi - 255-6 +- fix Do not go into freeze when systemd crashd + * Fri Mar 1 2024 huyubiao - 255-5 - move the architecture patches after Patch9800 (excluding Patch9800) -- Gitee