From 8750ac02381be5f0b3ebbcc0131779553fa7ce52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 9 Mar 2018 09:32:03 +0100 Subject: [PATCH] pid1: make use of high rt signals on hppa with newer kernels Back in 4dffec1459f50ac9f8f67ccfcb79836b4ed5a50e we stopped using SIGRTMIN+26 and higher on hppa because they were not available. Then they became available in linux 3.18: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1f25df2eff5b25f52c139d3ff31bc883eee9a0ab Instead of hard-coding the list based on architecture, let's use a runtime check like signal(7) says. (A note about implementation: RTSIG_IF_AVAILABLE is defined to take the full signal and not just an offset from SIGRTMIN so that it's still possible to grep for SIGRTMIN\+.) Add a simple "test" to print the signal values. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=84931. --- src/core/manager.c | 28 +++++++++++++++------------- src/test/test-signal-util.c | 12 ++++++++++++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/core/manager.c b/src/core/manager.c index 84adb9c6660..3c662ffdefb 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -426,6 +426,8 @@ static int enable_special_signals(Manager *m) { return 0; } +#define RTSIG_IF_AVAILABLE(signum) (signum <= SIGRTMAX ? signum : -1) + static int manager_setup_signals(Manager *m) { struct sigaction sa = { .sa_handler = SIG_DFL, @@ -479,22 +481,22 @@ static int manager_setup_signals(Manager *m) { /* .. one free signal here ... */ -#if !defined(__hppa64__) && !defined(__hppa__) - /* Apparently Linux on hppa has fewer RT - * signals (SIGRTMAX is SIGRTMIN+25 there), - * hence let's not try to make use of them - * here. Since these commands are accessible - * by different means and only really a safety - * net, the missing functionality on hppa - * shouldn't matter. */ + /* Apparently Linux on hppa had fewer RT signals until v3.18, + * SIGRTMAX was SIGRTMIN+25, and then SIGRTMIN was lowered, + * see commit v3.17-7614-g1f25df2eff. + * + * We cannot unconditionally make use of those signals here, + * so let's use a runtime check. Since these commands are + * accessible by different means and only really a safety + * net, the missing functionality on hppa shouldn't matter. + */ - SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */ - SIGRTMIN+27, /* systemd: set log target to console */ - SIGRTMIN+28, /* systemd: set log target to kmsg */ - SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */ + RTSIG_IF_AVAILABLE(SIGRTMIN+26), /* systemd: set log target to journal-or-kmsg */ + RTSIG_IF_AVAILABLE(SIGRTMIN+27), /* systemd: set log target to console */ + RTSIG_IF_AVAILABLE(SIGRTMIN+28), /* systemd: set log target to kmsg */ + RTSIG_IF_AVAILABLE(SIGRTMIN+29), /* systemd: set log target to syslog-or-kmsg (obsolete) */ /* ... one free signal here SIGRTMIN+30 ... */ -#endif -1); assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0); diff --git a/src/test/test-signal-util.c b/src/test/test-signal-util.c index f4b19ed69d3..d2640824783 100644 --- a/src/test/test-signal-util.c +++ b/src/test/test-signal-util.c @@ -21,10 +21,21 @@ #include #include +#include "log.h" #include "macro.h" #include "signal-util.h" #include "process-util.h" +#define info(sig) log_info(#sig " = " STRINGIFY(sig) " = %d", sig) + +static void test_rt_signals(void) { + info(SIGRTMIN); + info(SIGRTMAX); + + /* We use signals SIGRTMIN+0 to SIGRTMIN+24 unconditionally */ + assert(SIGRTMAX - SIGRTMIN >= 24); +} + static void test_block_signals(void) { sigset_t ss; @@ -62,6 +73,7 @@ static void test_ignore_signals(void) { } int main(int argc, char *argv[]) { + test_rt_signals(); test_block_signals(); test_ignore_signals();