mirror of https://github.com/xzeldon/htop.git
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.
This commit is contained in:
parent
f6aa5d29bb
commit
293c16e22d
|
@ -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, },
|
[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, },
|
[IO_PRIORITY] = { .name = "IO_PRIORITY", .title = "IO ", .description = "I/O priority", .flags = PROCESS_FLAG_LINUX_IOPRIO, },
|
||||||
#ifdef HAVE_DELAYACCT
|
#ifdef HAVE_DELAYACCT
|
||||||
[PERCENT_CPU_DELAY] = { .name = "PERCENT_CPU_DELAY", .title = "CPUD% ", .description = "CPU 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 = 0, },
|
[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 = 0, },
|
[PERCENT_SWAP_DELAY] = { .name = "PERCENT_SWAP_DELAY", .title = "SWAPD% ", .description = "Swapin delay %", .flags = PROCESS_FLAG_LINUX_DELAYACCT, },
|
||||||
#endif
|
#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_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, },
|
[M_SWAP] = { .name = "M_SWAP", .title = " SWAP ", .description = "Size of the process's swapped pages", .flags = PROCESS_FLAG_LINUX_SMAPS, },
|
||||||
|
|
|
@ -28,6 +28,7 @@ in the source distribution for its full text.
|
||||||
#define PROCESS_FLAG_LINUX_SECATTR 0x00008000
|
#define PROCESS_FLAG_LINUX_SECATTR 0x00008000
|
||||||
#define PROCESS_FLAG_LINUX_LRS_FIX 0x00010000
|
#define PROCESS_FLAG_LINUX_LRS_FIX 0x00010000
|
||||||
#define PROCESS_FLAG_LINUX_CWD 0x00020000
|
#define PROCESS_FLAG_LINUX_CWD 0x00020000
|
||||||
|
#define PROCESS_FLAG_LINUX_DELAYACCT 0x00040000
|
||||||
|
|
||||||
|
|
||||||
/* LinuxProcessMergedCommand is populated by LinuxProcess_makeCommandStr: It
|
/* LinuxProcessMergedCommand is populated by LinuxProcess_makeCommandStr: It
|
||||||
|
|
|
@ -208,10 +208,6 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, ui
|
||||||
ProcessList_init(pl, Class(LinuxProcess), usersTable, pidMatchList, userId);
|
ProcessList_init(pl, Class(LinuxProcess), usersTable, pidMatchList, userId);
|
||||||
LinuxProcessList_initTtyDrivers(this);
|
LinuxProcessList_initTtyDrivers(this);
|
||||||
|
|
||||||
#ifdef HAVE_DELAYACCT
|
|
||||||
LinuxProcessList_initNetlinkSocket(this);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Initialize page size
|
// Initialize page size
|
||||||
pageSize = sysconf(_SC_PAGESIZE);
|
pageSize = sysconf(_SC_PAGESIZE);
|
||||||
if (pageSize == -1)
|
if (pageSize == -1)
|
||||||
|
@ -955,12 +951,19 @@ static int handleNetlinkMsg(struct nl_msg* nlmsg, void* linuxProcess) {
|
||||||
static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProcess* process) {
|
static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProcess* process) {
|
||||||
struct nl_msg* msg;
|
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) {
|
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())) {
|
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)) {
|
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) {
|
if (nl_send_sync(this->netlink_socket, msg) < 0) {
|
||||||
process->swapin_delay_percent = NAN;
|
goto delayacct_failure;
|
||||||
process->blkio_delay_percent = NAN;
|
|
||||||
process->cpu_delay_percent = NAN;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nl_recvmsgs_default(this->netlink_socket) < 0) {
|
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
|
#endif
|
||||||
|
@ -1419,7 +1426,9 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DELAYACCT
|
#ifdef HAVE_DELAYACCT
|
||||||
|
if (settings->flags & PROCESS_FLAG_LINUX_DELAYACCT) {
|
||||||
LinuxProcessList_readDelayAcctData(this, lp);
|
LinuxProcessList_readDelayAcctData(this, lp);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (settings->flags & PROCESS_FLAG_LINUX_CGROUP) {
|
if (settings->flags & PROCESS_FLAG_LINUX_CGROUP) {
|
||||||
|
|
Loading…
Reference in New Issue