summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2020-12-28 20:51:02 +0100
committercgzones <cgzones@googlemail.com>2021-01-01 21:34:22 +0100
commit293c16e22da7fbda98eae1836f11e642fcbd699b (patch)
tree6cee89cb0535d48c0a6a165ba834255af5b649b2
parentf6aa5d29bbf30fcde43d9c84a4b9fa775c006053 (diff)
Only initialize and gather delay accounting data if a related column is enabled
Avoid creating and communicating over a netlink socket by default, which triggers cap_net_admin checks as root.
-rw-r--r--linux/LinuxProcess.c6
-rw-r--r--linux/LinuxProcess.h21
-rw-r--r--linux/LinuxProcessList.c33
3 files changed, 35 insertions, 25 deletions
diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c
index 1ae05368..3ee9d2c6 100644
--- a/linux/LinuxProcess.c
+++ b/linux/LinuxProcess.c
@@ -88,9 +88,9 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = {
[OOM] = { .name = "OOM", .title = " OOM ", .description = "OOM (Out-of-Memory) killer score", .flags = PROCESS_FLAG_LINUX_OOM, },
[IO_PRIORITY] = { .name = "IO_PRIORITY", .title = "IO ", .description = "I/O priority", .flags = PROCESS_FLAG_LINUX_IOPRIO, },
#ifdef HAVE_DELAYACCT
- [PERCENT_CPU_DELAY] = { .name = "PERCENT_CPU_DELAY", .title = "CPUD% ", .description = "CPU delay %", .flags = 0, },
- [PERCENT_IO_DELAY] = { .name = "PERCENT_IO_DELAY", .title = "IOD% ", .description = "Block I/O delay %", .flags = 0, },
- [PERCENT_SWAP_DELAY] = { .name = "PERCENT_SWAP_DELAY", .title = "SWAPD% ", .description = "Swapin delay %", .flags = 0, },
+ [PERCENT_CPU_DELAY] = { .name = "PERCENT_CPU_DELAY", .title = "CPUD% ", .description = "CPU delay %", .flags = PROCESS_FLAG_LINUX_DELAYACCT, },
+ [PERCENT_IO_DELAY] = { .name = "PERCENT_IO_DELAY", .title = "IOD% ", .description = "Block I/O delay %", .flags = PROCESS_FLAG_LINUX_DELAYACCT, },
+ [PERCENT_SWAP_DELAY] = { .name = "PERCENT_SWAP_DELAY", .title = "SWAPD% ", .description = "Swapin delay %", .flags = PROCESS_FLAG_LINUX_DELAYACCT, },
#endif
[M_PSS] = { .name = "M_PSS", .title = " PSS ", .description = "proportional set size, same as M_RESIDENT but each page is divided by the number of processes sharing it.", .flags = PROCESS_FLAG_LINUX_SMAPS, },
[M_SWAP] = { .name = "M_SWAP", .title = " SWAP ", .description = "Size of the process's swapped pages", .flags = PROCESS_FLAG_LINUX_SMAPS, },
diff --git a/linux/LinuxProcess.h b/linux/LinuxProcess.h
index 719a4e9b..2e9a9d13 100644
--- a/linux/LinuxProcess.h
+++ b/linux/LinuxProcess.h
@@ -18,16 +18,17 @@ in the source distribution for its full text.
#include "Settings.h"
-#define PROCESS_FLAG_LINUX_IOPRIO 0x00000100
-#define PROCESS_FLAG_LINUX_OPENVZ 0x00000200
-#define PROCESS_FLAG_LINUX_VSERVER 0x00000400
-#define PROCESS_FLAG_LINUX_CGROUP 0x00000800
-#define PROCESS_FLAG_LINUX_OOM 0x00001000
-#define PROCESS_FLAG_LINUX_SMAPS 0x00002000
-#define PROCESS_FLAG_LINUX_CTXT 0x00004000
-#define PROCESS_FLAG_LINUX_SECATTR 0x00008000
-#define PROCESS_FLAG_LINUX_LRS_FIX 0x00010000
-#define PROCESS_FLAG_LINUX_CWD 0x00020000
+#define PROCESS_FLAG_LINUX_IOPRIO 0x00000100
+#define PROCESS_FLAG_LINUX_OPENVZ 0x00000200
+#define PROCESS_FLAG_LINUX_VSERVER 0x00000400
+#define PROCESS_FLAG_LINUX_CGROUP 0x00000800
+#define PROCESS_FLAG_LINUX_OOM 0x00001000
+#define PROCESS_FLAG_LINUX_SMAPS 0x00002000
+#define PROCESS_FLAG_LINUX_CTXT 0x00004000
+#define PROCESS_FLAG_LINUX_SECATTR 0x00008000
+#define PROCESS_FLAG_LINUX_LRS_FIX 0x00010000
+#define PROCESS_FLAG_LINUX_CWD 0x00020000
+#define PROCESS_FLAG_LINUX_DELAYACCT 0x00040000
/* LinuxProcessMergedCommand is populated by LinuxProcess_makeCommandStr: It
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
index f02aa76c..31f3ee21 100644
--- a/linux/LinuxProcessList.c
+++ b/linux/LinuxProcessList.c
@@ -208,10 +208,6 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, ui
ProcessList_init(pl, Class(LinuxProcess), usersTable, pidMatchList, userId);
LinuxProcessList_initTtyDrivers(this);
- #ifdef HAVE_DELAYACCT
- LinuxProcessList_initNetlinkSocket(this);
- #endif
-
// Initialize page size
pageSize = sysconf(_SC_PAGESIZE);
if (pageSize == -1)
@@ -955,12 +951,19 @@ static int handleNetlinkMsg(struct nl_msg* nlmsg, void* linuxProcess) {
static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProcess* process) {
struct nl_msg* msg;
+ if (!this->netlink_socket) {
+ LinuxProcessList_initNetlinkSocket(this);
+ if (!this->netlink_socket) {
+ goto delayacct_failure;
+ }
+ }
+
if (nl_socket_modify_cb(this->netlink_socket, NL_CB_VALID, NL_CB_CUSTOM, handleNetlinkMsg, process) < 0) {
- return;
+ goto delayacct_failure;
}
if (! (msg = nlmsg_alloc())) {
- return;
+ goto delayacct_failure;
}
if (! genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, this->netlink_family, 0, NLM_F_REQUEST, TASKSTATS_CMD_GET, TASKSTATS_VERSION)) {
@@ -972,15 +975,19 @@ static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProc
}
if (nl_send_sync(this->netlink_socket, msg) < 0) {
- process->swapin_delay_percent = NAN;
- process->blkio_delay_percent = NAN;
- process->cpu_delay_percent = NAN;
- return;
+ goto delayacct_failure;
}
if (nl_recvmsgs_default(this->netlink_socket) < 0) {
- return;
+ goto delayacct_failure;
}
+
+ return;
+
+delayacct_failure:
+ process->swapin_delay_percent = NAN;
+ process->blkio_delay_percent = NAN;
+ process->cpu_delay_percent = NAN;
}
#endif
@@ -1419,7 +1426,9 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_
}
#ifdef HAVE_DELAYACCT
- LinuxProcessList_readDelayAcctData(this, lp);
+ if (settings->flags & PROCESS_FLAG_LINUX_DELAYACCT) {
+ LinuxProcessList_readDelayAcctData(this, lp);
+ }
#endif
if (settings->flags & PROCESS_FLAG_LINUX_CGROUP) {

© 2014-2024 Faster IT GmbH | imprint | privacy policy