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)";