summaryrefslogtreecommitdiffstats
path: root/linux/LinuxProcessList.c
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2018-01-29 12:08:56 -0200
committerHisham Muhammad <hisham@gobolinux.org>2018-02-17 15:30:15 -0200
commitcf0c074cc8c7e6fe858d621ea59976d2159d51bf (patch)
tree04688c8b7d64d1105dd6ca41c05c337c68731ab7 /linux/LinuxProcessList.c
parent9c40c9a0e7e43577e77a372c18aa733ee17d81c2 (diff)
Add IPC performance counter for Linux
Diffstat (limited to 'linux/LinuxProcessList.c')
-rw-r--r--linux/LinuxProcessList.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
index 753a478e..bba611f0 100644
--- a/linux/LinuxProcessList.c
+++ b/linux/LinuxProcessList.c
@@ -660,6 +660,32 @@ static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProc
#endif
+#ifdef HAVE_PERFCOUNTERS
+
+static void LinuxProcessList_readPerfCounters(LinuxProcess* lp) {
+ if (!lp->cycleCounter) {
+ lp->cycleCounter = PerfCounter_new(lp->super.pid, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES);
+ }
+ if (!lp->insnCounter) {
+ lp->insnCounter = PerfCounter_new(lp->super.pid, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS);
+ }
+ bool cOk = PerfCounter_read(lp->cycleCounter);
+ bool iOk = PerfCounter_read(lp->insnCounter);
+ if (cOk && iOk) {
+ uint64_t i = PerfCounter_delta(lp->insnCounter);
+ uint64_t c = PerfCounter_delta(lp->cycleCounter);
+ if (c > 0) {
+ lp->ipc = (double)i / c;
+ } else {
+ lp->ipc = 0;
+ }
+ } else {
+ lp->ipc = -1;
+ }
+}
+
+#endif
+
static void setCommand(Process* process, const char* command, int len) {
if (process->comm && process->commLen >= len) {
strncpy(process->comm, command, len + 1);
@@ -871,6 +897,11 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char*
if (ss->flags & PROCESS_FLAG_LINUX_OOM)
LinuxProcessList_readOomData(lp, dirname, name);
+ #ifdef HAVE_PERFCOUNTERS
+ if (ss->flags & PROCESS_FLAG_LINUX_HPC)
+ LinuxProcessList_readPerfCounters(lp);
+ #endif
+
if (proc->state == 'Z' && (proc->basenameOffset == 0)) {
proc->basenameOffset = -1;
setCommand(proc, command, commLen);

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