Mercurial > illumos > illumos-gate
changeset 9711:d309660fd989
6842350 PowerTOP's idle state report shows ghost C0 residency, wrong average
Contributed by Aubrey Li <aubrey.li@intel.com>
6829404 powertop does not show correct percentages for cpu p-states
Portions contributed by Juergen Keil <jrgn.keil@googlemai.com> and Aubrey Li <aubrey.li@intel.com>
6842361 PowerTOP should use #defines for time values
author | Rafael Vanoni <rafael.vanoni@sun.com> |
---|---|
date | Fri, 22 May 2009 19:48:28 -0700 |
parents | d02d4803985d |
children | d0f85f328e5b |
files | usr/src/cmd/powertop/amd64/pt_amd64.c usr/src/cmd/powertop/common/cpufreq.c usr/src/cmd/powertop/common/cpuidle.c usr/src/cmd/powertop/common/display.c usr/src/cmd/powertop/common/events.c usr/src/cmd/powertop/common/powertop.c usr/src/cmd/powertop/common/powertop.h usr/src/cmd/powertop/common/suggestions.c usr/src/cmd/powertop/i386/pt_i386.c |
diffstat | 9 files changed, 173 insertions(+), 156 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/powertop/amd64/pt_amd64.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/amd64/pt_amd64.c Fri May 22 19:48:28 2009 -0700 @@ -215,5 +215,5 @@ /* * amd64 platform specific display messages */ -const char *g_msg_idle_state = "C-states (idle power states)"; +const char *g_msg_idle_state = "C-states (idle power)"; const char *g_msg_freq_state = "P-states (frequencies)";
--- a/usr/src/cmd/powertop/common/cpufreq.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/cpufreq.c Fri May 22 19:48:28 2009 -0700 @@ -44,7 +44,7 @@ #include <errno.h> #include "powertop.h" -#define HZ2MHZ(speed) ((speed) / 1000000) +#define HZ2MHZ(speed) ((speed) / MICROSEC) #define DTP_ARG_COUNT 2 #define DTP_ARG_LENGTH 5 @@ -76,7 +76,7 @@ "/last[(processorid_t)arg0] != 0/" "{" " this->cpu = (processorid_t)arg0;" -" this->oldspeed = (uint32_t)(arg1/1000000);" +" this->oldspeed = (uint64_t)arg1;" " @times[this->cpu, this->oldspeed] = sum(timestamp - last[this->cpu]);" " last[this->cpu] = timestamp;" "}" @@ -84,7 +84,7 @@ "/last[(processorid_t)arg0] == 0/" "{" " this->cpu = (processorid_t)arg0;" -" this->oldspeed = (uint32_t)(arg1/1000000);" +" this->oldspeed = (uint64_t)arg1;" " @times[this->cpu, this->oldspeed] = sum(timestamp - begin);" " last[this->cpu] = timestamp;" "}"; @@ -105,7 +105,7 @@ " last != 0/" "{" " this->cpu = (processorid_t)arg0;" -" this->oldspeed = (uint32_t)(arg1/1000000);" +" this->oldspeed = (uint64_t)arg1;" " @times[this->cpu, this->oldspeed] = sum(timestamp - last);" " last = timestamp;" "}" @@ -114,7 +114,7 @@ " last == 0/" "{" " this->cpu = (processorid_t)arg0;" -" this->oldspeed = (uint32_t)(arg1/1000000);" +" this->oldspeed = (uint64_t)arg1;" " @times[this->cpu, this->oldspeed] = sum(timestamp - begin);" " last = timestamp;" "}"; @@ -139,7 +139,7 @@ (void) snprintf(dtp_argv[0], 5, "%d\0", g_ncpus_observed); - if (PTOP_ON_CPU) { + if (PT_ON_CPU) { if ((dtp_argv[1] = malloc(sizeof (char) * DTP_ARG_LENGTH)) == NULL) { free(dtp_argv[0]); @@ -238,7 +238,7 @@ * Execute different scripts (defined above) depending on * user specified options. Default mode uses dtp_cpufreq. */ - if (PTOP_ON_CPU) + if (PT_ON_CPU) prog_ptr = (char *)dtp_cpufreq_c; else prog_ptr = (char *)dtp_cpufreq; @@ -292,7 +292,7 @@ int pt_cpufreq_stat_collect(double interval) { - int i, ret; + int i, ret; /* * Zero out the interval time reported by DTrace for @@ -322,10 +322,10 @@ } switch (g_op_mode) { - case PTOP_MODE_CPU: + case PT_MODE_CPU: pt_cpufreq_stat_account(interval, g_observed_cpu); break; - case PTOP_MODE_DEFAULT: + case PT_MODE_DEFAULT: default: for (i = 0; i < g_ncpus_observed; i++) pt_cpufreq_stat_account(interval, i); @@ -338,20 +338,29 @@ static void pt_cpufreq_stat_account(double interval, uint_t cpu) { + cpu_power_info_t *cpu_pow; uint64_t speed; hrtime_t duration; - cpu_power_info_t *cpu_pow; int i; cpu_pow = &g_cpu_power_states[cpu]; speed = cpu_pow->current_pstate; - duration = (hrtime_t)((interval * NANOSEC)) - cpu_pow->dtrace_time; + duration = (hrtime_t)(interval * NANOSEC) - cpu_pow->dtrace_time; + + /* + * 'duration' may be a negative value when we're using or forcing a + * small interval, and the amount of time already accounted ends up + * being larger than the the former. + */ + if (duration < 0) + return; for (i = 0; i < g_npstates; i++) { if (g_pstate_info[i].speed == speed) { g_pstate_info[i].total_time += duration; cpu_pow->time_accounted += duration; + cpu_pow->speed_accounted = speed; } } } @@ -362,18 +371,18 @@ static int pt_cpufreq_snapshot(void) { - kstat_ctl_t *kc; - int ret; - uint_t i; + kstat_ctl_t *kc; + int ret; + uint_t i; if ((kc = kstat_open()) == NULL) return (errno); switch (g_op_mode) { - case PTOP_MODE_CPU: + case PT_MODE_CPU: ret = pt_cpufreq_snapshot_cpu(kc, g_observed_cpu); break; - case PTOP_MODE_DEFAULT: + case PT_MODE_DEFAULT: default: for (i = 0; i < g_ncpus_observed; i++) if ((ret = pt_cpufreq_snapshot_cpu(kc, i)) != 0) @@ -429,30 +438,30 @@ { dtrace_aggdesc_t *aggdesc = data->dtada_desc; dtrace_recdesc_t *cpu_rec, *speed_rec; - cpu_power_info_t *cpu_pow; + cpu_power_info_t *cp; int32_t cpu; uint64_t speed; - hrtime_t dt_state_time = 0; + hrtime_t res; int i; if (strcmp(aggdesc->dtagd_name, "times") == 0) { cpu_rec = &aggdesc->dtagd_rec[1]; speed_rec = &aggdesc->dtagd_rec[2]; - for (i = 0; i < g_ncpus; i++) { - /* LINTED - alignment */ - dt_state_time += *((hrtime_t *)(data->dtada_percpu[i])); - } + /* LINTED - alignment */ + cpu = *(int32_t *)(data->dtada_data + cpu_rec->dtrd_offset); /* LINTED - alignment */ - cpu = *(int32_t *)(data->dtada_data + cpu_rec->dtrd_offset); + res = *((hrtime_t *)(data->dtada_percpu[cpu])); + /* LINTED - alignment */ speed = *(uint64_t *)(data->dtada_data + speed_rec->dtrd_offset); - if (speed == 0) { + if (speed == 0) speed = max_cpufreq; - } + else + speed = HZ2MHZ(speed); /* * We have an aggregation record for "cpu" being at "speed" @@ -464,25 +473,28 @@ * that happened during prior powertop samplings, so subtract * out time already accounted. */ - cpu_pow = &g_cpu_power_states[cpu]; + cp = &g_cpu_power_states[cpu]; for (i = 0; i < g_npstates; i++) { if (g_pstate_info[i].speed == speed) { - if (cpu_pow->time_accounted > 0) { - if (dt_state_time == 0) - continue; - if (dt_state_time > - cpu_pow->time_accounted) { - dt_state_time -= - cpu_pow->time_accounted; - cpu_pow->time_accounted = 0; + + if (cp->time_accounted > 0 && + cp->speed_accounted == speed) { + if (res > cp->time_accounted) { + res -= cp->time_accounted; + cp->time_accounted = 0; + cp->speed_accounted = 0; + } else { + return (DTRACE_AGGWALK_NEXT); } } - g_pstate_info[i].total_time += dt_state_time; - cpu_pow->dtrace_time += dt_state_time; + + g_pstate_info[i].total_time += res; + cp->dtrace_time += res; } } } + return (DTRACE_AGGWALK_NEXT); }
--- a/usr/src/cmd/powertop/common/cpuidle.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/cpuidle.c Fri May 22 19:48:28 2009 -0700 @@ -41,6 +41,8 @@ #include <dtrace.h> #include "powertop.h" +#define S2NS(x) ((x) * (NANOSEC)) + static dtrace_hdl_t *dtp; /* @@ -58,7 +60,7 @@ "/arg0 == 0 && self->start/" "{" " @number[self->state] = count();" -" @times[self->state] = sum((timestamp - self->start)/1000000);" +" @times[self->state] = sum(timestamp - self->start);" " self->start = 0;" " self->state = 0;" "}"; @@ -80,7 +82,7 @@ " arg0 == 0 && self->start/" "{" " @number[self->state] = count();" -" @times[self->state] = sum((timestamp - self->start)/1000000);" +" @times[self->state] = sum(timestamp - self->start);" " self->start = 0;" " self->state = 0;" "}"; @@ -109,7 +111,7 @@ * Execute different scripts (defined above) depending on * user specified options. */ - if (PTOP_ON_CPU) + if (PT_ON_CPU) prog_ptr = (char *)dtp_cpuidle_c; else prog_ptr = (char *)dtp_cpuidle; @@ -168,8 +170,8 @@ * time out of the default bucket as it processes aggregation * records for time spent in other states. */ - g_cstate_info[0].total_time = (long)(interval * g_ncpus_observed * - 1000); + g_cstate_info[0].total_time = (uint64_t)S2NS(interval * + g_ncpus_observed); if (dtrace_status(dtp) == -1) return (-1); @@ -242,6 +244,8 @@ g_cstate_info[state].total_time += n; if (g_cstate_info[0].total_time >= n) g_cstate_info[0].total_time -= n; + else + g_cstate_info[0].total_time = 0; } return (DTRACE_AGGWALK_NEXT);
--- a/usr/src/cmd/powertop/common/display.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/display.c Fri May 22 19:48:28 2009 -0700 @@ -51,12 +51,12 @@ static WINDOW *status_bar_window; #define print(win, y, x, fmt, args...) \ - if (PTOP_ON_DUMP) \ + if (PT_ON_DUMP) \ (void) printf(fmt, ## args); \ else \ (void) mvwprintw(win, y, x, fmt, ## args); -char g_status_bar_slots[PTOP_BAR_NSLOTS][PTOP_BAR_LENGTH]; +char g_status_bar_slots[PT_BAR_NSLOTS][PT_BAR_LENGTH]; char g_suggestion_key; static int maxx, maxy; @@ -214,7 +214,7 @@ (void) wrefresh(title_bar_window); (void) werase(status_bar_window); - for (i = 0; i < PTOP_BAR_NSLOTS; i++) { + for (i = 0; i < PT_BAR_NSLOTS; i++) { if (strlen(g_status_bar_slots[i]) == 0) continue; (void) wattron(status_bar_window, A_REVERSE); @@ -233,13 +233,13 @@ double total_pstates = 0.0, avg, res; uint64_t p0_speed, p1_speed; - if (!PTOP_ON_DUMP) { + if (!PT_ON_DUMP) { (void) werase(cstate_window); (void) wattrset(cstate_window, COLOR_PAIR(PT_COLOR_DEFAULT)); (void) wbkgd(cstate_window, COLOR_PAIR(PT_COLOR_DEFAULT)); } - print(cstate_window, 0, 0, "%s\tAvg residency\n", g_msg_idle_state); + print(cstate_window, 0, 0, "%s\tAvg\tresidency\n", g_msg_idle_state); res = (((double)g_cstate_info[0].total_time / g_total_c_time)) * 100; (void) sprintf(c, "C0 (cpu running)\t\t(%.1f%%)\n", (float)res); print(cstate_window, 1, 0, "%s", c); @@ -251,7 +251,7 @@ */ if (g_cstate_info[i].events > 0) avg = (((double)g_cstate_info[i].total_time/ - g_ncpus_observed)/g_cstate_info[i].events); + MICROSEC)/g_cstate_info[i].events); else avg = 0; @@ -263,7 +263,7 @@ print(cstate_window, i + 1, 0, "%s", c); } - print(cstate_window, 0, 48, "%s", g_msg_freq_state); + print(cstate_window, 0, 48, "%s\n", g_msg_freq_state); if (g_npstates < 2) { (void) sprintf(c, "%4lu Mhz\t%.1f%%", @@ -272,7 +272,7 @@ } else { for (i = 0; i < g_npstates; i++) { total_pstates += (double)(g_pstate_info[i].total_time/ - g_ncpus_observed/1000000); + g_ncpus_observed/MICROSEC); } /* @@ -282,7 +282,7 @@ (void) sprintf(c, "%4lu Mhz\t%.1f%%", (long)g_pstate_info[i].speed, 100 * (g_pstate_info[i].total_time/g_ncpus_observed/ - 1000000/total_pstates)); + MICROSEC/total_pstates)); print(cstate_window, i+1, 48, "%s\n", c); } @@ -319,17 +319,17 @@ (void) sprintf(c, "%4lu Mhz(turbo)\t%.1f%%", (long)p0_speed, 100 * (g_pstate_info[i].total_time/ - g_ncpus_observed/1000000/total_pstates)); + g_ncpus_observed/MICROSEC/total_pstates)); } else { (void) sprintf(c, "%4lu Mhz\t%.1f%%", (long)g_pstate_info[i].speed, 100 * (g_pstate_info[i].total_time/ - g_ncpus_observed/1000000/total_pstates)); + g_ncpus_observed/MICROSEC/total_pstates)); } print(cstate_window, i+1, 48, "%s\n", c); } - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) (void) wnoutrefresh(cstate_window); } @@ -341,7 +341,7 @@ (void) sprintf(buffer, _("no ACPI power usage estimate available")); - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) (void) werase(acpi_power_window); if (flag) { char *c; @@ -369,7 +369,7 @@ } print(acpi_power_window, 0, 0, "%s\n", buffer); - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) (void) wnoutrefresh(acpi_power_window); } @@ -378,9 +378,9 @@ { char c[100]; int i, event_sum = 0; - event_info_t *g_p_event = g_event_info; + event_info_t *event = g_event_info; - if (!PTOP_ON_DUMP) { + if (!PT_ON_DUMP) { (void) werase(wakeup_window); (void) wbkgd(wakeup_window, COLOR_PAIR(PT_COLOR_RED)); (void) wattron(wakeup_window, A_BOLD); @@ -389,8 +389,8 @@ /* * calculate the actual total event number */ - for (i = 0; i < g_tog_p_events; i++, g_p_event++) - event_sum += g_p_event->total_count; + for (i = 0; i < g_top_events; i++, event++) + event_sum += event->total_count; /* * g_total_events is the sum of the number of Cx->C0 transition, @@ -406,7 +406,7 @@ "%.1fs", (double)(g_total_events/interval), interval); print(wakeup_window, 0, 0, "%s\n", c); - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) (void) wnoutrefresh(wakeup_window); } @@ -416,9 +416,9 @@ char c[100]; int i; double events; - event_info_t *g_p_event = g_event_info; + event_info_t *event = g_event_info; - if (!PTOP_ON_DUMP) { + if (!PT_ON_DUMP) { (void) werase(eventstat_window); (void) wattrset(eventstat_window, COLOR_PAIR(PT_COLOR_DEFAULT)); (void) wbkgd(eventstat_window, COLOR_PAIR(PT_COLOR_DEFAULT)); @@ -427,13 +427,13 @@ /* * Sort the event report list */ - if (g_tog_p_events > EVENT_NUM_MAX) - g_tog_p_events = EVENT_NUM_MAX; + if (g_top_events > EVENT_NUM_MAX) + g_top_events = EVENT_NUM_MAX; - qsort((void *)g_event_info, g_tog_p_events, sizeof (event_info_t), + qsort((void *)g_event_info, g_top_events, sizeof (event_info_t), event_compare); - if (PTOP_ON_CPU) + if (PT_ON_CPU) (void) sprintf(c, "Top causes for wakeups on CPU %d:\n", g_observed_cpu); else @@ -441,24 +441,24 @@ print(eventstat_window, 0, 0, "%s", c); - for (i = 0; i < g_tog_p_events; i++, g_p_event++) { + for (i = 0; i < g_top_events; i++, event++) { - if (g_total_events > 0 && g_p_event->total_count > 0) - events = (double)g_p_event->total_count/ + if (g_total_events > 0 && event->total_count > 0) + events = (double)event->total_count/ (double)g_total_events; else continue; (void) sprintf(c, "%4.1f%% (%5.1f)", 100 * events, - (double)g_p_event->total_count/interval); + (double)event->total_count/interval); print(eventstat_window, i+1, 0, "%s", c); print(eventstat_window, i+1, 16, "%20s :", - g_p_event->offender_name); + event->offender_name); print(eventstat_window, i+1, 40, "%-64s\n", - g_p_event->offense_name); + event->offense_name); } - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) (void) wnoutrefresh(eventstat_window); }
--- a/usr/src/cmd/powertop/common/events.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/events.c Fri May 22 19:48:28 2009 -0700 @@ -43,22 +43,23 @@ #include "powertop.h" static dtrace_hdl_t *dtp; +static event_info_t *event; /*ARGSUSED*/ static int -walk(const dtrace_aggdata_t *data, void *arg) +pt_events_walk(const dtrace_aggdata_t *data, void *arg) { dtrace_aggdesc_t *aggdesc = data->dtada_desc; dtrace_recdesc_t *rec1, *rec2, *rec3; dtrace_syminfo_t dts; - char *offense_name; + GElf_Sym sym; uint64_t offender_addr; + uint64_t n = 0; int32_t *instance, *offender_cpu; int i; - uint64_t n = 0; - GElf_Sym sym; + char *offense_name; - if (g_tog_p_events >= EVENT_NUM_MAX) + if (g_top_events >= EVENT_NUM_MAX) return (0); rec1 = &aggdesc->dtagd_rec[1]; @@ -72,16 +73,16 @@ /* LINTED - alignment */ instance = (int32_t *)(data->dtada_data + rec2->dtrd_offset); - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", "<interrupt>"); - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "%s#%d", offense_name, *instance); /* * Report kernel events */ } else if (strcmp(aggdesc->dtagd_name, "events_k") == 0) { - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", "<kernel>"); /* @@ -108,11 +109,11 @@ */ if (offender_addr != NULL && dtrace_lookup_by_addr(dtp, offender_addr, &sym, &dts) == 0) { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "%s`%s", dts.dts_object, dts.dts_name); } else { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "0x%llx", offender_addr); } /* @@ -121,9 +122,9 @@ } else if (strcmp(aggdesc->dtagd_name, "events_u") == 0) { offense_name = data->dtada_data + rec1->dtrd_offset; - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", offense_name); - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "<scheduled timeout expiration>"); /* * Report cross calls @@ -131,7 +132,7 @@ } else if (strcmp(aggdesc->dtagd_name, "events_x") == 0) { offense_name = data->dtada_data + rec1->dtrd_offset; - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", offense_name); switch (g_bit_depth) { @@ -152,11 +153,11 @@ */ if (offender_addr != NULL && dtrace_lookup_by_addr(dtp, offender_addr, &sym, &dts) == 0) { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "<xcalls> %s`%s", dts.dts_object, dts.dts_name); } else { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "<xcalls>"); } /* @@ -167,7 +168,7 @@ rec3 = &aggdesc->dtagd_rec[3]; offense_name = data->dtada_data + rec1->dtrd_offset; - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", offense_name); switch (g_bit_depth) { @@ -191,11 +192,11 @@ */ if (offender_addr != NULL && dtrace_lookup_by_addr(dtp, offender_addr, &sym, &dts) == 0) { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "<xcalls> %s`%s (CPU %d)", dts.dts_object, dts.dts_name, *offender_cpu); } else { - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "<xcalls> (CPU %d)", *offender_cpu); } @@ -203,20 +204,21 @@ * Report unknown events */ } else { - (void) snprintf((char *)(g_p_event->offender_name), + (void) snprintf((char *)(event->offender_name), EVENT_NAME_MAX, "%s", "<unknown>"); - (void) snprintf((char *)(g_p_event->offense_name), + (void) snprintf((char *)(event->offense_name), EVENT_NAME_MAX, "%s", "<unknown>"); } - for (i = 0; i < g_ncpus; i++) + for (i = 0; i < g_ncpus; i++) { /* LINTED - alignment */ n += *((uint64_t *)(data->dtada_percpu[i])); - - g_p_event->total_count = n; + } - g_p_event++; - g_tog_p_events++; + event->total_count = n; + + event++; + g_top_events++; return (DTRACE_AGGWALK_NEXT); } @@ -226,11 +228,11 @@ { dtrace_prog_t *prog; dtrace_proginfo_t info; + dtrace_optval_t statustime; int err; - dtrace_optval_t statustime; char *prog_ptr; - g_p_event = g_event_info; + event = g_event_info; if ((dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) { pt_error("%s : cannot open dtrace library: %s\n", __FILE__, @@ -242,10 +244,10 @@ * Execute different scripts (defined in the platform specific file) * depending on user specified options. */ - if (PTOP_ON_VERBOSE) { + if (PT_ON_VERBOSE) { prog_ptr = (char *)g_dtp_events_v; } else { - if (PTOP_ON_CPU) + if (PT_ON_CPU) prog_ptr = (char *)g_dtp_events_c; else prog_ptr = (char *)g_dtp_events; @@ -293,8 +295,8 @@ int pt_events_stat_collect(void) { - g_p_event = g_event_info; - g_tog_p_events = 0; + g_top_events = 0; + event = g_event_info; if (dtrace_status(dtp) == -1) return (-1); @@ -302,7 +304,7 @@ if (dtrace_aggregate_snap(dtp) != 0) pt_error("%s : failed to add to aggregate", __FILE__); - if (dtrace_aggregate_walk_keyvarsorted(dtp, walk, NULL) != 0) + if (dtrace_aggregate_walk_keyvarsorted(dtp, pt_events_walk, NULL) != 0) pt_error("%s : failed to sort aggregate", __FILE__); dtrace_aggregate_clear(dtp);
--- a/usr/src/cmd/powertop/common/powertop.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/powertop.c Fri May 22 19:48:28 2009 -0700 @@ -55,7 +55,7 @@ double g_displaytime; int g_bit_depth; -int g_total_events, g_tog_p_events; +int g_total_events, g_top_events; int g_npstates, g_max_cstate, g_longest_cstate; uint_t g_ncpus; uint_t g_ncpus_observed; @@ -69,7 +69,6 @@ uint_t g_observed_cpu; event_info_t g_event_info[EVENT_NUM_MAX]; -event_info_t *g_p_event; state_info_t g_cstate_info[NSTATES]; freq_state_info_t g_pstate_info[NSTATES]; cpu_power_info_t *g_cpu_power_states; @@ -120,7 +119,7 @@ g_ticktime = g_ticktime_usr = INTERVAL_DEFAULT; g_displaytime = 0.0; - g_op_mode = PTOP_MODE_DEFAULT; + g_op_mode = PT_MODE_DEFAULT; g_gui = B_FALSE; g_max_cstate = 0; g_argv = NULL; @@ -135,10 +134,10 @@ switch (c) { case 'd': - if (PTOP_ON_DUMP) + if (PT_ON_DUMP) usage(); - g_op_mode |= PTOP_MODE_DUMP; + g_op_mode |= PT_MODE_DUMP; dump_count = (int)strtod(optarg, &endptr); if (dump_count <= 0 || *endptr != NULL) @@ -157,16 +156,16 @@ usage(); break; case 'v': - if (PTOP_ON_CPU || PTOP_ON_VERBOSE) + if (PT_ON_CPU || PT_ON_VERBOSE) usage(); - g_op_mode |= PTOP_MODE_VERBOSE; + g_op_mode |= PT_MODE_VERBOSE; break; case 'c': - if (PTOP_ON_CPU || PTOP_ON_VERBOSE) + if (PT_ON_CPU || PT_ON_VERBOSE) usage(); - g_op_mode |= PTOP_MODE_CPU; + g_op_mode |= PT_MODE_CPU; g_observed_cpu = (uint_t)strtod(optarg, &endptr); if (g_observed_cpu >= g_ncpus) @@ -229,7 +228,7 @@ (void) printf(_("Collecting data for %.2f second(s) \n"), (float)g_ticktime); - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) g_gui = B_TRUE; last = gethrtime(); @@ -248,9 +247,9 @@ FD_SET(0, &rfds); tv.tv_sec = (long)g_ticktime; - tv.tv_usec = (long)((g_ticktime - tv.tv_sec) * 1000000); + tv.tv_usec = (long)((g_ticktime - tv.tv_sec) * MICROSEC); - if (!PTOP_ON_DUMP) + if (!PT_ON_DUMP) key = select(1, &rfds, NULL, NULL, &tv); else key = select(1, NULL, NULL, NULL, &tv); @@ -260,7 +259,7 @@ g_interval = (double)(now - last)/NANOSEC; last = now; - g_tog_p_events = 0; + g_top_events = 0; g_total_events = 0; (void) memset(g_event_info, 0, @@ -311,7 +310,7 @@ * Initialize curses if we're not dumping and * haven't already done it */ - if (!PTOP_ON_DUMP) { + if (!PT_ON_DUMP) { if (!ncursesinited) { initialize_curses(); ncursesinited++; @@ -334,7 +333,7 @@ g_displaytime = g_displaytime - g_ticktime; - if (key && !PTOP_ON_DUMP) { + if (key && !PT_ON_DUMP) { keychar = toupper(fgetc(stdin)); switch (keychar) { @@ -365,7 +364,7 @@ dump_count--; /* Exits if user requested a dump */ - if (PTOP_ON_DUMP && !dump_count) { + if (PT_ON_DUMP && !dump_count) { print_all_suggestions(); exit(EXIT_SUCCESS); } @@ -375,7 +374,7 @@ pick_suggestion(); /* Refresh display */ - if (!PTOP_ON_DUMP) { + if (!PT_ON_DUMP) { show_title_bar(); update_windows(); } @@ -386,7 +385,7 @@ * specified an interval we skip this bit and keep it fixed. */ last_time = (((double)g_cstate_info[g_longest_cstate].total_time - /g_ncpus)/g_cstate_info[g_longest_cstate].events); + /MICROSEC/g_ncpus)/g_cstate_info[g_longest_cstate].events); if (!user_interval) if (last_time < INTERVAL_DEFAULT ||
--- a/usr/src/cmd/powertop/common/powertop.h Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/powertop.h Fri May 22 19:48:28 2009 -0700 @@ -98,21 +98,21 @@ #define TITLE_LINE 1 #define BLANK_LINE 1 #define NEXT_LINE 1 -#define PTOP_BAR_NSLOTS 10 -#define PTOP_BAR_LENGTH 40 +#define PT_BAR_NSLOTS 10 +#define PT_BAR_LENGTH 40 /* * Available op modes */ -#define PTOP_MODE_DEFAULT 0x01 -#define PTOP_MODE_DUMP 0x02 -#define PTOP_MODE_VERBOSE 0x04 -#define PTOP_MODE_CPU 0x08 +#define PT_MODE_DEFAULT 0x01 +#define PT_MODE_DUMP 0x02 +#define PT_MODE_VERBOSE 0x04 +#define PT_MODE_CPU 0x08 -#define PTOP_ON_DEFAULT (g_op_mode & PTOP_MODE_DEFAULT) -#define PTOP_ON_DUMP (g_op_mode & PTOP_MODE_DUMP) -#define PTOP_ON_VERBOSE (g_op_mode & PTOP_MODE_VERBOSE) -#define PTOP_ON_CPU (g_op_mode & PTOP_MODE_CPU) +#define PT_ON_DEFAULT (g_op_mode & PT_MODE_DEFAULT) +#define PT_ON_DUMP (g_op_mode & PT_MODE_DUMP) +#define PT_ON_VERBOSE (g_op_mode & PT_MODE_VERBOSE) +#define PT_ON_CPU (g_op_mode & PT_MODE_CPU) /* * Structures and typedefs @@ -135,7 +135,7 @@ char name[STATE_NAME_MAX]; hrtime_t total_time; hrtime_t last_time; - double events; + uint64_t events; } state_info_t; typedef struct freq_state_info { @@ -145,6 +145,7 @@ typedef struct cpu_power_info { uint64_t current_pstate; + uint64_t speed_accounted; hrtime_t time_accounted; hrtime_t dtrace_time; } cpu_power_info_t; @@ -157,7 +158,7 @@ uint64_t t_acnt; } turbo_info_t; -typedef void (suggestion_func)(void); +typedef void (suggestion_func)(void); /* * Global variables @@ -170,7 +171,7 @@ * Event accounting */ extern int g_total_events; -extern int g_tog_p_events; +extern int g_top_events; /* * Interval @@ -188,7 +189,6 @@ * Event info array */ extern event_info_t g_event_info[EVENT_NUM_MAX]; -extern event_info_t *g_p_event; /* * Lookup table, sequential CPU id to Solaris CPU id @@ -216,16 +216,16 @@ extern uint_t g_ncpus; extern uint_t g_ncpus_observed; -extern char g_status_bar_slots[PTOP_BAR_NSLOTS] - [PTOP_BAR_LENGTH]; +extern char g_status_bar_slots[PT_BAR_NSLOTS] + [PT_BAR_LENGTH]; extern cpu_power_info_t *g_cpu_power_states; /* * Turbo mode related information */ -extern boolean_t g_turbo_supported; -extern double g_turbo_ratio; +extern boolean_t g_turbo_supported; +extern double g_turbo_ratio; extern char g_suggestion_key; extern suggestion_func *g_suggestion_activate; @@ -247,8 +247,8 @@ /* * Platform specific messages */ -extern const char *g_msg_idle_state; -extern const char *g_msg_freq_state; +extern const char *g_msg_idle_state; +extern const char *g_msg_freq_state; /* * Suggestions related */ @@ -272,12 +272,12 @@ extern void show_title_bar(void); extern void setup_windows(void); extern void initialize_curses(void); -extern void show_acpi_power_line(uint32_t flag, double rate, - double rem_cap, double cap, uint32_t state); +extern void show_acpi_power_line(uint32_t, double, double, double, + uint32_t); extern void show_cstates(); -extern void show_wakeups(double interval); -extern void show_eventstats(double interval); -extern void show_suggestion(char *sug); +extern void show_wakeups(double); +extern void show_eventstats(double); +extern void show_suggestion(char *); extern void cleanup_curses(void); extern void update_windows(void); @@ -285,8 +285,8 @@ * Suggestions */ extern void pick_suggestion(void); -extern void add_suggestion(char *text, int weight, char key, - char *keystring, suggestion_func *func); +extern void add_suggestion(char *, int, char, char *, + suggestion_func *); extern void reset_suggestions(void); extern void print_all_suggestions(void); extern void print_battery(void); @@ -295,9 +295,9 @@ * DTrace stats */ extern int pt_cpufreq_stat_prepare(void); -extern int pt_cpufreq_stat_collect(double interval); +extern int pt_cpufreq_stat_collect(double); extern int pt_cpuidle_stat_prepare(void); -extern int pt_cpuidle_stat_collect(double interval); +extern int pt_cpuidle_stat_collect(double); extern int pt_events_stat_prepare(void); extern int pt_events_stat_collect(void);
--- a/usr/src/cmd/powertop/common/suggestions.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/common/suggestions.c Fri May 22 19:48:28 2009 -0700 @@ -147,7 +147,7 @@ if (running > value) { if (ptr->keystring) (void) strncpy(g_status_bar_slots[8], - ptr->keystring, PTOP_BAR_LENGTH); + ptr->keystring, PT_BAR_LENGTH); g_suggestion_key = ptr->key; g_suggestion_activate = ptr->func;
--- a/usr/src/cmd/powertop/i386/pt_i386.c Fri May 22 22:15:42 2009 -0400 +++ b/usr/src/cmd/powertop/i386/pt_i386.c Fri May 22 19:48:28 2009 -0700 @@ -215,5 +215,5 @@ /* * i386 platform specific display messages */ -const char *g_msg_idle_state = "C-states (idle power states)"; +const char *g_msg_idle_state = "C-states (idle power)"; const char *g_msg_freq_state = "P-states (frequencies)";