From 293c16e22da7fbda98eae1836f11e642fcbd699b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Mon, 28 Dec 2020 20:51:02 +0100 Subject: 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. --- linux/LinuxProcess.c | 6 +++--- linux/LinuxProcess.h | 21 +++++++++++---------- linux/LinuxProcessList.c | 33 +++++++++++++++++++++------------ 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) { -- cgit v1.2.3