You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.1 KiB
90 lines
3.1 KiB
From a3b8feb9320f745f960fe8f7006183137f4969b1 Mon Sep 17 00:00:00 2001 |
|
From: Lennart Poettering <lennart@poettering.net> |
|
Date: Mon, 2 Nov 2015 09:34:05 +0100 |
|
Subject: [PATCH] core: bump net.unix.max_dgram_qlen really early during boot |
|
|
|
Only that way it actually has an effect on all our sockets, including |
|
$NOTIFY_SOCKET. |
|
|
|
(cherry picked from commit 19854865a877a3a4fa3d04550c15a99c0e1187ff) |
|
Related: #1267707 |
|
--- |
|
src/core/main.c | 36 ++++++++++++++++++++++++++++++++++++ |
|
src/shared/def.h | 3 +++ |
|
2 files changed, 39 insertions(+) |
|
|
|
diff --git a/src/core/main.c b/src/core/main.c |
|
index 60ea36c3c..c9d8ce4a4 100644 |
|
--- a/src/core/main.c |
|
+++ b/src/core/main.c |
|
@@ -1198,6 +1198,7 @@ static int status_welcome(void) { |
|
|
|
static int write_container_id(void) { |
|
const char *c; |
|
+ int r; |
|
|
|
c = getenv("container"); |
|
if (isempty(c)) |
|
@@ -1206,6 +1207,40 @@ static int write_container_id(void) { |
|
return write_string_file("/run/systemd/container", c); |
|
} |
|
|
|
+static int bump_unix_max_dgram_qlen(void) { |
|
+ _cleanup_free_ char *qlen = NULL; |
|
+ unsigned long v; |
|
+ int r; |
|
+ |
|
+ /* Let's bump the net.unix.max_dgram_qlen sysctl. The kernel |
|
+ * default of 16 is simply too low. We set the value really |
|
+ * really early during boot, so that it is actually applied to |
|
+ * all our sockets, including the $NOTIFY_SOCKET one. */ |
|
+ |
|
+ r = read_one_line_file("/proc/sys/net/unix/max_dgram_qlen", &qlen); |
|
+ if (r < 0) |
|
+ return log_warning_errno(r, "Failed to read AF_UNIX datagram queue length, ignoring: %m"); |
|
+ |
|
+ r = safe_atolu(qlen, &v); |
|
+ if (r < 0) |
|
+ return log_warning_errno(r, "Failed to parse AF_UNIX datagram queue length, ignoring: %m"); |
|
+ |
|
+ if (v >= DEFAULT_UNIX_MAX_DGRAM_QLEN) |
|
+ return 0; |
|
+ |
|
+ free(qlen); |
|
+ qlen = NULL; |
|
+ if (asprintf(&qlen, "%lu\n", DEFAULT_UNIX_MAX_DGRAM_QLEN) < 0) |
|
+ return log_oom(); |
|
+ |
|
+ r = write_string_file("/proc/sys/net/unix/max_dgram_qlen", qlen); |
|
+ if (r < 0) |
|
+ return log_full_errno(IN_SET(r, -EROFS, -EPERM, -EACCES) ? LOG_DEBUG : LOG_WARNING, r, |
|
+ "Failed to bump AF_UNIX datagram queue length, ignoring: %m"); |
|
+ |
|
+ return 1; |
|
+} |
|
+ |
|
int main(int argc, char *argv[]) { |
|
Manager *m = NULL; |
|
int r, retval = EXIT_FAILURE; |
|
@@ -1571,6 +1606,7 @@ int main(int argc, char *argv[]) { |
|
hostname_setup(); |
|
machine_id_setup(NULL); |
|
loopback_setup(); |
|
+ bump_unix_max_dgram_qlen(); |
|
|
|
test_mtab(); |
|
test_usr(); |
|
diff --git a/src/shared/def.h b/src/shared/def.h |
|
index a3d9fcf38..76daf012d 100644 |
|
--- a/src/shared/def.h |
|
+++ b/src/shared/def.h |
|
@@ -35,6 +35,9 @@ |
|
* the watchdog pings will keep the loop busy. */ |
|
#define DEFAULT_EXIT_USEC (30*USEC_PER_SEC) |
|
|
|
+/* The default value for the net.unix.max_dgram_qlen sysctl */ |
|
+#define DEFAULT_UNIX_MAX_DGRAM_QLEN 512UL |
|
+ |
|
#define SYSTEMD_CGROUP_CONTROLLER "name=systemd" |
|
|
|
#define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
|
|
|