diff options
-rw-r--r-- | procps/powertop.c | 92 |
1 files changed, 35 insertions, 57 deletions
diff --git a/procps/powertop.c b/procps/powertop.c index 77b071ffb..4c3c3565e 100644 --- a/procps/powertop.c +++ b/procps/powertop.c @@ -169,7 +169,7 @@ static void read_cstate_counts(ullong *usage, ullong *duration) if (len < 3 || len > BIG_SYSNAME_LEN) continue; - sprintf(buf, "/proc/acpi/processor/%s/power", d->d_name); + sprintf(buf, "%s/%s/power", "/proc/acpi/processor", d->d_name); fp = fopen_for_read(buf); if (!fp) continue; @@ -321,28 +321,17 @@ static void process_irq_counts(void) /* 0: 143646045 153901007 IO-APIC-edge timer * ^ */ + *p = '\0'; /* Deal with non-maskable interrupts -- make up fake numbers */ - nr = -1; - if (buf[0] != ' ' && !isdigit(buf[0])) { -//TODO: optimize - if (strncmp(buf, "NMI:", 4) == 0) - nr = 20000; - if (strncmp(buf, "RES:", 4) == 0) - nr = 20001; - if (strncmp(buf, "CAL:", 4) == 0) - nr = 20002; - if (strncmp(buf, "TLB:", 4) == 0) - nr = 20003; - if (strncmp(buf, "TRM:", 4) == 0) - nr = 20004; - if (strncmp(buf, "THR:", 4) == 0) - nr = 20005; - if (strncmp(buf, "SPU:", 4) == 0) - nr = 20006; + nr = index_in_strings("NMI\0RES\nCAL\0TLB\0TRM\0THR\0SPU\0", buf); + if (nr != -1) { + nr += 20000; } else { /* bb_strtou doesn't eat leading spaces, using strtoul */ nr = strtoul(buf, NULL, 10); } + *p = ':'; + if (nr == -1) continue; @@ -430,33 +419,31 @@ static NOINLINE int process_timer_stats(void) while (fgets(buf, sizeof(buf), fp)) { const char *count, *process, *func; char *p; - int cnt; + int idx; count = skip_whitespace(buf); + if (strcmp(strchrnul(count, ' '), " total events") == 0) + break; p = strchr(count, ','); if (!p) continue; *p++ = '\0'; - if (strcmp(strchrnul(count, ' '), " total events") == 0) - break; - p = skip_whitespace(p); /* points to pid */ - -/* Find char ' ', then eat remaining spaces */ -#define ADVANCE(p) do { \ - (p) = strchr((p), ' '); \ - if (!(p)) \ - continue; \ - *(p) = '\0'; \ - (p)++; \ - (p) = skip_whitespace(p); \ -} while (0) - /* Get process name */ - ADVANCE(p); - process = p; - /* Get function */ - ADVANCE(p); + if (strchr(count, 'D')) + continue; /* deferred */ + p = skip_whitespace(p); /* points to pid now */ + process = NULL; + get_func_name: + p = strchr(p, ' '); + if (!p) + continue; + *p++ = '\0'; + p = skip_whitespace(p); + if (process == NULL) { + process = p; + goto get_func_name; + } func = p; -#undef ADVANCE + //if (strcmp(process, "swapper") == 0 // && strcmp(func, "hrtimer_start_range_ns (tick_sched_timer)\n") == 0 //) { @@ -471,38 +458,29 @@ static NOINLINE int process_timer_stats(void) //if (strcmp(process, "powertop") == 0) // continue; - if (strcmp(process, "insmod") == 0) - process = "[kernel module]"; - if (strcmp(process, "modprobe") == 0) - process = "[kernel module]"; - if (strcmp(process, "swapper") == 0) - process = "<kernel core>"; + idx = index_in_strings("insmod\0modprobe\0swapper\0", process); + if (idx != -1) { + process = idx < 2 ? "[kernel module]" : "<kernel core>"; + } strchrnul(p, '\n')[0] = '\0'; - { - char *tmp; - cnt = bb_strtoull(count, &tmp, 10); - p = tmp; - } - while (*p != '\0') { - if (*p++ == 'D') /* deferred */ - goto skip; - } + // 46D\01136\0kondemand/1\0do_dbs_timer (delayed_work_timer_fn) + // ^ ^ ^ + // count process func //if (strchr(process, '[')) sprintf(line, "%15.15s : %s", process, func); //else // sprintf(line, "%s", process); - save_line(line, cnt); - skip: ; + save_line(line, bb_strtoull(count, NULL, 10)); } fclose(fp); } n = 0; #if ENABLE_FEATURE_POWERTOP_PROCIRQ - if (strstr(buf, "total events")) { + if (strstr(buf, " total events")) { n = bb_strtoull(buf, NULL, 10) / G.total_cpus; if (n > 0 && n < G.interrupt_0) { sprintf(line, " <interrupt> : %s", "extra timer interrupt"); @@ -566,7 +544,7 @@ static NOINLINE void print_intel_cstates(void) if (!isdigit(d->d_name[3])) continue; - len = sprintf(fname, "/sys/devices/system/cpu/%s/cpuidle", d->d_name); + len = sprintf(fname, "%s/%s/cpuidle", "/sys/devices/system/cpu", d->d_name); dir = opendir(fname); if (!dir) continue; |