Hi Rafael,
2008/3/31 Rafael Vanoni <Rafael.Vanoni at sun.com>:
> Hey everyone
>
> Here's an export with a lot of code cleanup and fixes for most of what's
> on the PowerTop Testing page. Let me know what you think of it, Pat,
> once you get around to it.
Thanks for your work, I really appreciate it!
The patch looks good, please feel free to commit into repo.
>
> I'm also working on the man page, which leads me to a question about the
> bug that Aubrey reported. Did you guys reach a decision whether it
> should be dealt with in the code or is it something that should just be
> well documented ?
I still think it would be better to deal with the bug in the code.
something like
17.8%(100) <kernel>: unix`cbe_hres_tick, genunix`clock, genunix`cyclic_timer
But I'll defer to Eric, ;-)
Thanks,
-Aubrey
>
> # HG changeset patch
> # User rafael.vanoni at sun.com
> # Date 1206968948 -3600
> # Node ID f6c64140a2a59bbbbd924c1de263497f9e6f3b3e
> # Parent aed5f2ae104f74bc31717a76d5b39d9c49edc3b1
> Fixing usability bugs and code cleanup.
>
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/cpufreq.c
> --- a/usr/src/cmd/powertop/cpufreq.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/cpufreq.c Mon Mar 31 14:09:08 2008 +0100
> @@ -48,7 +48,7 @@ static dtrace_hdl_t *g_dtp;
> /*
> * Buffer containing DTrace program to track CPU frequency transitions
> */
> -static const char *pt_cpufreq_dtrace_prog =
> +static const char *pt_cpufreq_dtrace_prog =
> ""
> "hrtime_t last[int];"
> ""
> @@ -83,26 +83,26 @@ int
> int
> pt_cpufreq_stat_prepare()
> {
> - dtrace_prog_t *prog;
> - dtrace_proginfo_t info;
> - dtrace_optval_t statustime;
> + dtrace_prog_t *prog;
> + dtrace_proginfo_t info;
> + dtrace_optval_t statustime;
>
> - kstat_ctl_t *kc;
> - kstat_t *ksp;
> - kstat_named_t *knp;
> + kstat_ctl_t *kc;
> + kstat_t *ksp;
> + kstat_named_t *knp;
>
> - pstate_info_t *state;
> - char *s, *c, *token;
> - int err;
> + pstate_info_t *state;
> + char *s, *c, *token;
> + int err;
>
> - state = pstate_info;
> - cpu_power_states = calloc((size_t)g_ncpus, sizeof(cpu_power_info_t));
> + state = pstate_info;
> + cpu_power_states = calloc((size_t)g_ncpus,
> sizeof(cpu_power_info_t));
>
> /*
> * Enumerate the CPU frequencies
> */
> - kc = kstat_open();
> - ksp = kstat_lookup(kc, "cpu_info", cpu_table[0], NULL);
> + kc = kstat_open();
> + ksp = kstat_lookup(kc, "cpu_info", cpu_table[0], NULL);
> kstat_read(kc, ksp, NULL);
>
> knp = kstat_data_lookup(ksp, "supported_frequencies_Hz");
> @@ -110,8 +110,8 @@ pt_cpufreq_stat_prepare()
>
> npstates = 0;
> do {
> - c = strstr(s, ":");
> - token = strtok(s, ":");
> + c = strstr(s, ":");
> + token = strtok(s, ":");
>
> state->speed = HZ2MHZ(atoll(token));
>
> @@ -186,11 +186,11 @@ void
> void
> pt_cpufreq_stat_collect(double interval)
> {
> - hrtime_t now;
> - int cpu, i;
> - uint64_t speed;
> - hrtime_t duration;
> - cpu_power_info_t *cpu_pow;
> + hrtime_t now;
> + int cpu, i;
> + uint64_t speed;
> + hrtime_t duration;
> + cpu_power_info_t *cpu_pow;
>
> /*
> * Zero out the interval time reported by DTrace for
> @@ -220,8 +220,7 @@ pt_cpufreq_stat_collect(double interval)
>
> speed = cpu_pow->current_pstate;
>
> - duration = (hrtime_t)((interval * NANOSEC)) -
> - cpu_pow->dtrace_time;
> + duration = (hrtime_t)((interval * NANOSEC)) -
> cpu_pow->dtrace_time;
>
> for (i = 0; i < npstates; i++) {
> if (pstate_info[i].speed == speed) {
> @@ -238,13 +237,14 @@ static void
> static void
> pt_cpufreq_snapshot()
> {
> - kstat_ctl_t *kc;
> - kstat_t *ksp;
> - kstat_named_t *knp;
> - int cpu;
> - cpu_power_info_t *state;
> + kstat_ctl_t *kc;
> + kstat_t *ksp;
> + kstat_named_t *knp;
> + int cpu;
> + cpu_power_info_t *state;
>
> kc = kstat_open();
> +
> for (cpu = 0; cpu < g_ncpus; cpu++) {
> ksp = kstat_lookup(kc, "cpu_info", cpu_table[cpu], NULL);
> kstat_read(kc, ksp, NULL);
> @@ -253,6 +253,7 @@ pt_cpufreq_snapshot()
> state = &cpu_power_states[cpu];
> state->current_pstate = HZ2MHZ(knp->value.ui64);
> }
> +
> kstat_close(kc);
> }
>
> @@ -265,13 +266,13 @@ static int
> static int
> pt_cpufreq_dtrace_walk(const dtrace_aggdata_t *data, void *arg)
> {
> - dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> - dtrace_recdesc_t *cpu_rec, *speed_rec;
> - cpu_power_info_t *cpu_pow;
> - int32_t cpu;
> - uint64_t speed;
> - hrtime_t dt_state_time = 0;
> - int i;
> + dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> + dtrace_recdesc_t *cpu_rec, *speed_rec;
> + cpu_power_info_t *cpu_pow;
> + int32_t cpu;
> + uint64_t speed;
> + hrtime_t dt_state_time = 0;
> + int i;
>
> if (strcmp(aggdesc->dtagd_name, "times") == 0) {
> cpu_rec = &aggdesc->dtagd_rec[1];
> @@ -280,9 +281,9 @@ pt_cpufreq_dtrace_walk(const dtrace_aggd
> for (i = 0; i < g_ncpus; i++) {
> dt_state_time += *((hrtime_t
> *)(data->dtada_percpu[i]));
> }
> - cpu = *(int32_t *)(data->dtada_data + cpu_rec->dtrd_offset);
> - speed = *(uint64_t *)(data->dtada_data +
> - speed_rec->dtrd_offset);
> +
> + cpu = *(int32_t *)(data->dtada_data +
> cpu_rec->dtrd_offset);
> + speed = *(uint64_t *)(data->dtada_data +
> speed_rec->dtrd_offset);
>
> if (speed == 0) {
> speed = max_cpufreq;
> @@ -299,52 +300,53 @@ pt_cpufreq_dtrace_walk(const dtrace_aggd
> * out time already accounted.
> */
> cpu_pow = &cpu_power_states[cpu];
> +
> for (i = 0; i < npstates; i++) {
> if (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;
> + if (dt_state_time >
> cpu_pow->time_accounted) {
> + dt_state_time -=
> cpu_pow->time_accounted;
> cpu_pow->time_accounted = 0;
> }
> }
> pstate_info[i].total_time += dt_state_time;
> - cpu_pow->dtrace_time += dt_state_time;
> + cpu_pow->dtrace_time += dt_state_time;
> }
> }
> }
> return (DTRACE_AGGWALK_NEXT);
> }
> -
>
> void
> enable_p_state(void)
> {
> - system(" echo cpupm enable >> /etc/power.conf ");
> - system(" echo cpu-threshold 1s >> /etc/power.conf ");
> - system(" /usr/sbin/pmconfig ");
> + system(cpupm_enable);
> + system(cpupm_treshold);
> + system(default_pmconf);
> }
> -
>
> void
> suggest_p_state(void)
> {
> - char line[1024];
> - FILE *file;
> + char line[1024];
> + FILE *file;
>
> - file = fopen("/etc/power.conf", "r");
> + file = fopen(default_conf, "r");
> +
> if (!file)
> return;
> +
> memset(line, 0, 1024);
> +
> while(fgets(line, 1023, file)) {
> if (strstr(line, "cpupm")) {
> if (strstr(line, "enable"))
> return;
> }
> }
> +
> add_suggestion("Suggestion: enable CPU power management by "
> "pressing the P key", 40, 'P', "P - Enable p-state",
> enable_p_state);
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/cpuidle.c
> --- a/usr/src/cmd/powertop/cpuidle.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/cpuidle.c Mon Mar 31 14:09:08 2008 +0100
> @@ -41,7 +41,7 @@
>
> #include "powertop.h"
>
> -static dtrace_hdl_t *g_dtp;
> +static dtrace_hdl_t *g_dtp;
>
> /*
> * Buffer containing DTrace program to track CPU idle state transitions
> @@ -63,7 +63,7 @@ static const char *pt_cpuidle_dtrace_pro
> " self->state = 0;"
> "}";
>
> -static int pt_cpuidle_dtrace_walk(const dtrace_aggdata_t *, void *);
> +static int pt_cpuidle_dtrace_walk(const dtrace_aggdata_t *, void *);
>
> /*
> * Perform setup necessary to track CPU idle state transitions
> @@ -71,10 +71,10 @@ int
> int
> pt_cpuidle_stat_prepare()
> {
> - dtrace_prog_t *prog;
> - dtrace_proginfo_t info;
> - dtrace_optval_t statustime;
> - int err;
> + dtrace_prog_t *prog;
> + dtrace_proginfo_t info;
> + dtrace_optval_t statustime;
> + int err;
>
> if ((g_dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) {
> pt_error("cannot open dtrace library: %s\n",
> @@ -119,7 +119,7 @@ void
> void
> pt_cpuidle_stat_collect(double interval)
> {
> - int i;
> + int i;
>
> /*
> * Zero out the interval time reported by DTrace for
> @@ -163,30 +163,31 @@ static int
> static int
> pt_cpuidle_dtrace_walk(const dtrace_aggdata_t *data, void *arg)
> {
> - dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> - dtrace_recdesc_t *rec;
> - uint64_t n = 0;
> -
> - int32_t state;
> - int i;
> + dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> + dtrace_recdesc_t *rec;
> + uint64_t n = 0;
> + int32_t state;
> + int i;
>
> if (strcmp(aggdesc->dtagd_name, "number") == 0) {
> for (i = 0; i < g_ncpus; i++) {
> n += *((uint64_t *)(data->dtada_percpu[i]));
> }
> total_events += n;
> - } else if (strcmp(aggdesc->dtagd_name, "times") == 0) {
> - rec = &aggdesc->dtagd_rec[1];
> - for (i = 0; i < g_ncpus; i++) {
> - n += *((uint64_t *)(data->dtada_percpu[i]));
> + }
> + else
> + if (strcmp(aggdesc->dtagd_name, "times") == 0) {
> + rec = &aggdesc->dtagd_rec[1];
> + for (i = 0; i < g_ncpus; i++) {
> + n += *((uint64_t *)(data->dtada_percpu[i]));
> + }
> +
> + state = *(int32_t *)(data->dtada_data +
> rec->dtrd_offset);
> +
> + cstate_info[state].total_time += n;
> + if (cstate_info[0].total_time >= n)
> + cstate_info[0].total_time -= n;
> }
> -
> - state = *(int32_t *)(data->dtada_data + rec->dtrd_offset);
> -
> - cstate_info[state].total_time += n;
> - if (cstate_info[0].total_time >= n)
> - cstate_info[0].total_time -= n;
> - }
>
> return (DTRACE_AGGWALK_NEXT);
> }
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/display.c
> --- a/usr/src/cmd/powertop/display.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/display.c Mon Mar 31 14:09:08 2008 +0100
> @@ -38,13 +38,13 @@
>
> #include "powertop.h"
>
> -static WINDOW *title_bar_window;
> -static WINDOW *cstate_window;
> -static WINDOW *wakeup_window;
> -static WINDOW *acpi_power_window;
> -static WINDOW *eventstat_window;
> -static WINDOW *suggestion_window;
> -static WINDOW *status_bar_window;
> +static WINDOW *title_bar_window;
> +static WINDOW *cstate_window;
> +static WINDOW *wakeup_window;
> +static WINDOW *acpi_power_window;
> +static WINDOW *eventstat_window;
> +static WINDOW *suggestion_window;
> +static WINDOW *status_bar_window;
>
> #define print(win, y, x, fmt, args...) \
> do { \
> @@ -54,13 +54,15 @@ static WINDOW *status_bar_window;
> mvwprintw(win, y, x, fmt, ## args); \
> } while (0)
>
> -char status_bar_slots[10][40];
> +char status_bar_slots[10][40];
>
> -void cleanup_curses(void) {
> +void
> +cleanup_curses(void) {
> endwin();
> }
>
> -static void zap_windows(void)
> +static void
> +zap_windows(void)
> {
> if (title_bar_window) {
> delwin(title_bar_window);
> @@ -92,26 +94,26 @@ static void zap_windows(void)
> }
> }
>
> -int maxx, maxy;
> +int maxx, maxy;
> +int maxtimerstats = 50;
> +int maxwidth = 200;
>
> -int maxtimerstats = 50;
> -int maxwidth = 200;
> -
> -void setup_windows(void)
> +void
> +setup_windows(void)
> {
> getmaxyx(stdscr, maxy, maxx);
>
> zap_windows();
>
> - title_bar_window = subwin(stdscr, 1, maxx, 0, 0);
> - cstate_window = subwin(stdscr, 7, maxx, 2, 0);
> - wakeup_window = subwin(stdscr, 1, maxx, 9, 0);
> - acpi_power_window = subwin(stdscr, 2, maxx, 10, 0);
> - eventstat_window = subwin(stdscr, maxy-16, maxx, 12, 0);
> - maxtimerstats = maxy - 16 - 2;
> - maxwidth = maxx - 18;
> - suggestion_window = subwin(stdscr, 3, maxx, maxy-3, 0);
> - status_bar_window = subwin(stdscr, 1, maxx, maxy-1, 0);
> + title_bar_window = subwin(stdscr, 1, maxx, 0, 0);
> + cstate_window = subwin(stdscr, 7, maxx, 2, 0);
> + wakeup_window = subwin(stdscr, 1, maxx, 9, 0);
> + acpi_power_window = subwin(stdscr, 2, maxx, 10, 0);
> + eventstat_window = subwin(stdscr, maxy-16, maxx, 12, 0);
> + maxtimerstats = maxy - 16 - 2;
> + maxwidth = maxx - 18;
> + suggestion_window = subwin(stdscr, 3, maxx, maxy-3, 0);
> + status_bar_window = subwin(stdscr, 1, maxx, maxy-1, 0);
>
> strcpy(status_bar_slots[0], _(" Q - Quit "));
> strcpy(status_bar_slots[1], _(" R - Refresh "));
> @@ -120,15 +122,16 @@ void setup_windows(void)
> refresh();
> }
>
> -void initialize_curses(void)
> +void
> +initialize_curses(void)
> {
> initscr();
> start_color();
> keypad(stdscr, TRUE); /* enable keyboard mapping */
> nonl(); /* tell curses not to do NL->CR/NL on output
> */
> - cbreak(); /* take input chars one at a time, no wait
> for \n */
> - noecho(); /* dont echo input */
> - curs_set(0); /* turn off cursor */
> + cbreak(); /* take input chars one at a time, no wait for \n */
> + noecho(); /* dont echo input */
> + curs_set(0); /* turn off cursor */
> /*use_default_colors();*/
>
> init_pair(PT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK);
> @@ -143,10 +146,11 @@ void initialize_curses(void)
> atexit(cleanup_curses);
> }
>
> -void show_title_bar(void)
> +void
> +show_title_bar(void)
> {
> - int i;
> - int x;
> + int i, x;
> +
> wattrset(title_bar_window, COLOR_PAIR(PT_COLOR_HEADER_BAR));
> wbkgd(title_bar_window, COLOR_PAIR(PT_COLOR_HEADER_BAR));
> werase(title_bar_window);
> @@ -155,7 +159,6 @@ void show_title_bar(void)
> " Solaris PowerTOP version 1.0 (C) 2007 Intel Corporation");
>
> wrefresh(title_bar_window);
> -
> werase(status_bar_window);
>
> x = 0;
> @@ -170,13 +173,13 @@ void show_title_bar(void)
> wrefresh(status_bar_window);
> }
>
> -void show_cstates(double interval)
> +void
> +show_cstates(double interval)
> {
> - int i;
> char c[100];
> state_info_t *p_cstate = cstate_info;
> hrtime_t total_time = 0;
> - int max_cstate = 0;
> + int i, max_cstate = 0;
> double total_pstates = 0.0;
>
> if (!dump) {
> @@ -194,7 +197,7 @@ void show_cstates(double interval)
> }
>
> print(cstate_window, 0, 0, "%s", "Cn\t\t\tAvg residency\n");
> -
> +
> sprintf(c, "C0 (cpu running)\t\t(%.1f%%)\n",
> (((double)cstate_info[0].total_time / total_time)) * 100);
> print(cstate_window, 1, 0, "%s", c);
> @@ -209,8 +212,7 @@ void show_cstates(double interval)
> print(cstate_window, 0, 48, "%s", "P-states (frequencies)\n");
>
> if (npstates < 2) {
> - sprintf(c, "%4llu Mhz\t%.1f%%", pstate_info[0].speed,
> - 100.0);
> + sprintf(c, "%4llu Mhz\t%.1f%%", pstate_info[0].speed, 100.0);
> print(cstate_window, 1, 48, "%s\n", c);
> } else {
> for (i = 0; i< npstates; i++) {
> @@ -227,10 +229,10 @@ void show_cstates(double interval)
> wrefresh(cstate_window);
> }
>
> -
> -void show_acpi_power_line(double rate, double cap, double capdelta, time_t
> ti)
> +void
> +show_acpi_power_line(double rate, double cap, double capdelta, time_t ti)
> {
> - char buffer[1024];
> + char buffer[1024];
>
> sprintf(buffer, _("no ACPI power usage estimate available") );
>
> @@ -253,10 +255,11 @@ void show_acpi_power_line(double rate, d
> wrefresh(acpi_power_window);
> }
>
> -void show_wakeups(double interval)
> +void
> +show_wakeups(double interval)
> {
> + char c[100];
>
> - char c[100];
> if (!dump) {
> werase(wakeup_window);
> wbkgd(wakeup_window, COLOR_PAIR(PT_COLOR_RED));
> @@ -269,11 +272,12 @@ void show_wakeups(double interval)
> wrefresh(wakeup_window);
> }
>
> -void show_eventstats(double interval)
> +void
> +show_eventstats(double interval)
> {
> - char c[100];
> - int i;
> -
> + char c[100];
> + int i;
> +
> event_info_t *p_event = event_info;
>
> if (!dump) {
> @@ -282,7 +286,7 @@ void show_eventstats(double interval)
> wbkgd(eventstat_window, COLOR_PAIR(PT_COLOR_DEFAULT));
> }
> event_bubblesort();
> -
> +
> print(eventstat_window, 0, 0, "%s", "Top causes for wakeups:\n");
> for (i = 0; i< top_events; i++, p_event++) {
> sprintf(c, "%4.1f%% (%5.1f)",
> @@ -298,18 +302,20 @@ void show_eventstats(double interval)
> wrefresh(eventstat_window);
> }
>
> -void show_suggestion(char *sug)
> +void
> +show_suggestion(char *sug)
> {
> werase(suggestion_window);
> print(suggestion_window, 0, 0, "%s", sug);
> wrefresh(suggestion_window);
> }
>
> -void event_bubblesort()
> +void
> +event_bubblesort()
> {
> - event_info_t tmp;
> - int i,j;
> - int exchange;
> + event_info_t tmp;
> + int i,j;
> + int exchange;
>
> for (i = 0; i < top_events - 1; i++) {
> exchange = 0;
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/events.c
> --- a/usr/src/cmd/powertop/events.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/events.c Mon Mar 31 14:09:08 2008 +0100
> @@ -76,16 +76,16 @@ static int
> static int
> walk(const dtrace_aggdata_t *data, void *arg)
> {
> - dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> - dtrace_recdesc_t *rec1, *rec2;
> - dtrace_syminfo_t dts;
> - char *offense_name;
> - uint64_t *offender_addr;
> - char *offender_name;
> - int32_t *instance;
> - int i;
> - uint64_t n = 0;
> - GElf_Sym sym;
> + dtrace_aggdesc_t *aggdesc = data->dtada_desc;
> + dtrace_recdesc_t *rec1, *rec2;
> + dtrace_syminfo_t dts;
> + char *offense_name;
> + char *offender_name;
> + uint64_t *offender_addr;
> + int32_t *instance;
> + int i;
> + uint64_t n = 0;
> + GElf_Sym sym;
>
> rec1 = &aggdesc->dtagd_rec[1];
> rec2 = &aggdesc->dtagd_rec[2];
> @@ -102,9 +102,8 @@ walk(const dtrace_aggdata_t *data, void
>
> } else if (strcmp(aggdesc->dtagd_name, "events_k") == 0) {
>
> - offender_addr = (uint64_t *)(data->dtada_data +
> - rec1->dtrd_offset);
> -
> + offender_addr = (uint64_t *)(data->dtada_data +
> rec1->dtrd_offset);
> +
> snprintf((char *)(p_event->offender_name), EVENT_NAME_MAX,
> "%s", "<kernel>");
>
> @@ -150,12 +149,12 @@ int
> int
> prepare_event_stats(void)
> {
> - dtrace_prog_t *prog;
> - dtrace_proginfo_t info;
> - int err, i;
> - char c;
> - hrtime_t last, now;
> - dtrace_optval_t statustime;
> + dtrace_prog_t *prog;
> + dtrace_proginfo_t info;
> + int err, i;
> + char c;
> + hrtime_t last, now;
> + dtrace_optval_t statustime;
>
> p_event = event_info;
>
> @@ -200,9 +199,8 @@ void
> void
> do_event_stats(void)
> {
> -
> - p_event = event_info;
> - top_events = 0;
> + p_event = event_info;
> + top_events = 0;
>
> (void) dtrace_status(g_dtp);
>
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/powertop.c
> --- a/usr/src/cmd/powertop/powertop.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/powertop.c Mon Mar 31 14:09:08 2008 +0100
> @@ -43,17 +43,17 @@
>
> #include "powertop.h"
>
> -uint_t features = 0;
> -int dump = 0;
> -void enumerate_cpus(void);
> -double displaytime = 0.0;
> +uint_t features = 0;
> +int dump = 0;
> +void enumerate_cpus(void);
> +double displaytime = 0.0;
>
> -int g_ncpus;
> -processorid_t *cpu_table;
> +int g_ncpus;
> +processorid_t *cpu_table;
> +static char *prog_name;
>
> -static char *prog_name;
> -
> -void usage()
> +void
> +usage()
> {
> printf("Usage: powertop [OPTION...]\n");
> printf(" -d, --dump read wakeups once and print list of
> top offenders\n");
> @@ -71,10 +71,18 @@ pt_prog()
> return (basename(prog_name));
> }
>
> -int main(int argc, char **argv)
> +int
> +main(int argc, char **argv)
> {
> - int ncursesinited=0;
> - hrtime_t last, now;
> + int ncursesinited = 0, index2 = 0, c;
> + hrtime_t last, now;
> +
> + static struct option opts[] = {
> + { "dump", 0, NULL, 'd' },
> + { "time", 1, NULL, 't' },
> + { "help", 0, NULL, 'h' },
> + { 0, 0, NULL, 0 }
> + };
>
> setlocale (LC_ALL, "");
> bindtextdomain ("powertop", "/usr/share/locale");
> @@ -82,32 +90,29 @@ int main(int argc, char **argv)
>
> pt_set_progname(argv[0]);
>
> - ticktime = 5.0;
> + ticktime = ticktime_usr = 5.0;
>
> - while (1) {
> - static struct option opts[] = {
> - { "dump", 0, NULL, 'd' },
> - { "time", 1, NULL, 't' },
> - { "help", 0, NULL, 'h' },
> - { 0, 0, NULL, 0 }
> - };
> - int index2 = 0, c;
> -
> - c = getopt_long(argc, argv, "dt:h", opts, &index2);
> - if (c == -1)
> + while ((c = getopt_long(argc, argv, "dt:h", opts, &index2)) != EOF) {
> + if (c == -1)
> break;
> +
> switch (c) {
> case 'd':
> dump = 1;
> break;
> case 't':
> - ticktime = strtod(optarg, NULL);
> + ticktime = ticktime_usr = strtod(optarg, NULL);
> + if (ticktime < 1) {
> + usage();
> + return -1;
> + }
> break;
> case 'h':
> usage();
> break;
> default:
> - ;
> + usage();
> + return -1;
> }
> }
>
> @@ -135,17 +140,15 @@ int main(int argc, char **argv)
> if (prepare_event_stats() != -1)
> features |= FEATURE_EVENTS;
>
> - printf(_("Collecting data for %i seconds \n"), (int)ticktime);
> + printf(_("Collecting data for %i second(s) \n"), (int)ticktime);
>
> last = gethrtime();
>
> while (1) {
> - fd_set rfds;
> - struct timeval tv;
> - int key;
> -
> - int i = 0;
> - char *c;
> + fd_set rfds;
> + struct timeval tv;
> + int key, i = 0;
> + char *c, keychar;
>
> /*
> * Sleep for a while waiting either for
> @@ -154,18 +157,18 @@ int main(int argc, char **argv)
> FD_ZERO(&rfds);
> FD_SET(0, &rfds);
>
> - tv.tv_sec = ticktime;
> - tv.tv_usec = (ticktime - tv.tv_sec) * 1000000;
> + tv.tv_sec = ticktime;
> + tv.tv_usec = (ticktime - tv.tv_sec) * 1000000;
>
> - key = select(1, &rfds, NULL, NULL, &tv);
> + key = select(1, &rfds, NULL, NULL, &tv);
> + now = gethrtime();
>
> - now = gethrtime();
> + g_interval = (double)(now - last)/NANOSEC;
> + last = now;
>
> - g_interval = (double)(now - last)/NANOSEC;
> - last = now;
> + top_events = 0;
> + total_events = 0;
>
> - top_events = 0;
> - total_events = 0;
> memset(event_info, EVENT_NUM_MAX * sizeof (event_info_t), 0);
> memset(cstate_info, 2 * sizeof(state_info_t), 0);
> /*
> @@ -174,7 +177,7 @@ int main(int argc, char **argv)
> */
> if (!dump) {
> if (!ncursesinited) {
> - initialize_curses();
> + initialize_curses();
> ncursesinited++;
> }
> setup_windows();
> @@ -206,9 +209,8 @@ int main(int argc, char **argv)
> displaytime = displaytime - ticktime;
>
> if (key) {
> - char keychar;
> -
> keychar = toupper(fgetc(stdin));
> +
> if (keychar == 'Q'){
> cleanup_curses();
> exit(EXIT_SUCCESS);
> @@ -249,6 +251,9 @@ int main(int argc, char **argv)
> tv.tv_usec = 0;
> key = select(1, &rfds, NULL, NULL, &tv);
> }
> +
> + if (keychar == 'R')
> + ticktime = ticktime_usr;
> }
> return 0;
> }
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/powertop.h
> --- a/usr/src/cmd/powertop/powertop.h Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/powertop.h Mon Mar 31 14:09:08 2008 +0100
> @@ -38,35 +38,38 @@ struct line {
>
> typedef void (suggestion_func)(void);
>
> -extern struct line *lines;
> +extern struct line *lines;
> extern int linehead;
> extern int linesize;
> extern int linectotal;
>
> -extern double displaytime;
> +extern double displaytime;
>
> -void suggest_process_death(char *process_match, char *process_name, struct
> line *slines, int linecount, double minwakeups, char *comment, int weight);
> -void suggest_kernel_config(char *string, int onoff, char *comment, int
> weight);
> -void suggest_laptop_mode(void);
> -void suggest_bluetooth_off(void);
> -void suggest_nmi_watchdog(void);
> -void suggest_hpet(void);
> -void suggest_ac97_powersave(void);
> -void suggest_wireless_powersave(void);
> -void suggest_ondemand_governor(void);
> -void suggest_noatime(void);
> -void suggest_sata_alpm(void);
> -void suggest_powersched(void);
> -void suggest_xrandr_TV_off(void);
> -void suggest_WOL_off(void);
> -void suggest_writeback_time(void);
> -void suggest_usb_autosuspend(void);
> -void suggest_p_state(void);
> +void suggest_process_death(char *process_match, char *process_name,
> + struct line *slines, int linecount, double minwakeups, char *comment,
> + int weight);
> +void suggest_kernel_config(char *string, int onoff, char *comment,
> + int weight);
> +void suggest_laptop_mode(void);
> +void suggest_bluetooth_off(void);
> +void suggest_nmi_watchdog(void);
> +void suggest_hpet(void);
> +void suggest_ac97_powersave(void);
> +void suggest_wireless_powersave(void);
> +void suggest_ondemand_governor(void);
> +void suggest_noatime(void);
> +void suggest_sata_alpm(void);
> +void suggest_powersched(void);
> +void suggest_xrandr_TV_off(void);
> +void suggest_WOL_off(void);
> +void suggest_writeback_time(void);
> +void suggest_usb_autosuspend(void);
> +void suggest_p_state(void);
>
> extern int g_ncpus;
>
> -#define EVENT_NAME_MAX 64
> -#define EVENT_NUM_MAX 100
> +#define EVENT_NAME_MAX 64
> +#define EVENT_NUM_MAX 100
>
> /*
> * PowerTop Features
> @@ -76,17 +79,21 @@ extern int g_ncpus;
> #define FEATURE_PSTATE 0x2
> #define FEATURE_EVENTS 0x4
>
> +static char default_conf[] = "/etc/power.conf";
> +static char default_pmconf[] = "/usr/sbin/pmconfig";
> +static char cpupm_enable[] = " echo cpupm enable >> /etc/power.conf";
> +static char cpupm_treshold[] = " echo cpu-threshold 1s >>
> /etc/power.conf";
>
> typedef struct event_info {
> - char offender_name[EVENT_NAME_MAX];
> - char offense_name[EVENT_NAME_MAX];
> - uint64_t total_count;
> + char offender_name[EVENT_NAME_MAX];
> + char offense_name[EVENT_NAME_MAX];
> + uint64_t total_count;
> } event_info_t;
>
> -int total_events;
> -int top_events; /* Number of events being tracked */
> -double ticktime;
> -double g_interval;
> +int total_events;
> +int top_events; /* Number of events being tracked */
> +double ticktime, ticktime_usr;
> +double g_interval;
>
> /*
> * Event info array
> @@ -100,8 +107,8 @@ event_info_t *p_event;
> * P/C state information
> */
> typedef struct state_info {
> - char name[STATE_NAME_MAX];
> - hrtime_t total_time;
> + char name[STATE_NAME_MAX];
> + hrtime_t total_time;
> } state_info_t;
>
> typedef struct pstate_info {
> @@ -118,15 +125,14 @@ typedef struct cpu_power_info {
> /*
> * Lookup table, sequential CPU id to Solaris CPU id
> */
> -processorid_t *cpu_table;
> -
> +processorid_t *cpu_table;
>
> #define NSTATES 8
>
> /*
> * Number of P states
> */
> -int npstates;
> +int npstates;
>
> /*
> * P/C state info arrays
> @@ -139,26 +145,24 @@ pstate_info_t pstate_info[NSTATES];
> */
> cpu_power_info_t *cpu_power_states;
>
> -extern int topcstate;
> -extern int topfreq;
> -extern int dump;
> +extern int topcstate;
> +extern int topfreq;
> +extern int dump;
>
> -extern char *prog;
> +extern char *prog;
>
> -extern char status_bar_slots[10][40];
> -extern char suggestion_key;
> -extern suggestion_func *suggestion_activate;
> +extern char status_bar_slots[10][40];
> +extern char suggestion_key;
> +extern suggestion_func *suggestion_activate;
>
> /* min definition borrowed from the Linux kernel */
> #define min(x,y) ({ \
> - typeof(x) _x = (x); \
> - typeof(y) _y = (y); \
> - (void) (&_x == &_y); \
> + typeof(x) _x = (x); \
> + typeof(y) _y = (y); \
> + (void) (&_x == &_y); \
> _x < _y ? _x : _y; })
>
> -
> -#define _(STRING) gettext(STRING)
> -
> +#define _(STRING) gettext(STRING)
>
> #define PT_COLOR_DEFAULT 1
> #define PT_COLOR_HEADER_BAR 2
> @@ -168,40 +172,43 @@ extern suggestion_func *suggestion_activ
> #define PT_COLOR_GREEN 6
> #define PT_COLOR_BRIGHT 7
> #define PT_COLOR_BLUE 8
> -extern int maxwidth;
>
> -extern void pt_error(char *, ...);
> -extern void pt_set_progname(char *);
> +extern int maxwidth;
>
> -void event_bubblesort(void);
> -void show_title_bar(void);
> -void setup_windows(void);
> -void initialize_curses(void);
> -void show_acpi_power_line(double rate, double cap, double capdelta, time_t
> time);
> -void show_cstates(double interval);
> -void show_wakeups(double interval);
> -void show_eventstats(double interval);
> -void show_interrupts(void);
> -void show_suggestion(char *sug);
> +extern void pt_error(char *, ...);
> +extern void pt_set_progname(char *);
>
> -void pick_suggestion(void);
> -void add_suggestion(char *text, int weight, char key, char *keystring,
> suggestion_func *func);
> -void reset_suggestions(void);
> -void print_all_suggestions(void);
> -void push_line(char *string, int count);
> -void print_battery(void);
> +void event_bubblesort(void);
> +void show_title_bar(void);
> +void setup_windows(void);
> +void initialize_curses(void);
> +void show_acpi_power_line(double rate, double cap, double capdelta,
> + time_t time);
> +void show_cstates(double interval);
> +void show_wakeups(double interval);
> +void show_eventstats(double interval);
> +void show_interrupts(void);
> +void show_suggestion(char *sug);
>
> -int pt_cpufreq_stat_prepare(void);
> -void pt_cpufreq_stat_collect(double interval);
> +void pick_suggestion(void);
> +void add_suggestion(char *text, int weight, char key, char *keystring,
> + suggestion_func *func);
> +void reset_suggestions(void);
> +void print_all_suggestions(void);
> +void push_line(char *string, int count);
> +void print_battery(void);
>
> -int pt_cpuidle_stat_prepare();
> -void pt_cpuidle_stat_collect(double interval);
> +int pt_cpufreq_stat_prepare(void);
> +void pt_cpufreq_stat_collect(double interval);
>
> -int prepare_event_stats(void);
> -void do_event_stats(void);
> -void count_usb_urbs(void);
> +int pt_cpuidle_stat_prepare();
> +void pt_cpuidle_stat_collect(double interval);
>
> -void cleanup_curses(void);
> -void enumerate_cpus(void);
> +int prepare_event_stats(void);
> +void do_event_stats(void);
> +void count_usb_urbs(void);
> +
> +void cleanup_curses(void);
> +void enumerate_cpus(void);
>
> #endif
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/suggestions.c
> --- a/usr/src/cmd/powertop/suggestions.c Thu Mar 06 16:39:06 2008
> -0800
> +++ b/usr/src/cmd/powertop/suggestions.c Mon Mar 31 14:09:08 2008
> +0100
> @@ -35,52 +35,55 @@
>
> #include "powertop.h"
>
> -
> -
> -char suggestion_key;
> -suggestion_func *suggestion_activate;
> +char suggestion_key;
> +suggestion_func *suggestion_activate;
>
> struct suggestion;
>
> struct suggestion {
> struct suggestion *next;
>
> - char *string;
> - int weight;
> -
> - char key;
> - char *keystring;
> + char *string;
> + int weight;
> + char key;
> + char *keystring;
>
> suggestion_func *func;
> };
>
> +static struct suggestion *suggestions;
> +static int total_weight;
>
> -static struct suggestion *suggestions;
> -static int total_weight;
> +static char previous[1024];
>
> -static char previous[1024];
> -
> -
> -void reset_suggestions(void)
> +void
> +reset_suggestions(void)
> {
> struct suggestion *ptr;
> +
> ptr = suggestions;
> +
> while (ptr) {
> struct suggestion *next;
> +
> next = ptr->next;
> free(ptr->string);
> free(ptr->keystring);
> free(ptr);
> ptr = next;
> }
> +
> suggestions = NULL;
> strcpy(status_bar_slots[8],"");
> - suggestion_key = 255;
> - suggestion_activate = NULL;
> - total_weight = 0;
> +
> + suggestion_key = 255;
> + suggestion_activate = NULL;
> + total_weight = 0;
> }
>
> -void add_suggestion(char *text, int weight, char key, char *keystring,
> suggestion_func *func)
> +void
> +add_suggestion(char *text, int weight, char key, char *keystring,
> + suggestion_func *func)
> {
> struct suggestion *new;
>
> @@ -88,51 +91,63 @@ void add_suggestion(char *text, int weig
> return;
>
> new = malloc(sizeof(struct suggestion));
> +
> if (!new)
> return;
> +
> memset(new, 0, sizeof(struct suggestion));
> +
> new->string = strdup(text);
> new->weight = weight;
> new->key = key;
> +
> if (keystring)
> new->keystring = strdup(keystring);
> - new->next = suggestions;
> - new->func = func;
> - suggestions = new;
> - total_weight += weight;
> +
> + new->next = suggestions;
> + new->func = func;
> + suggestions = new;
> + total_weight += weight;
> }
>
> -void pick_suggestion(void)
> +void
> +pick_suggestion(void)
> {
> - int value, running = 0;
> - struct suggestion *ptr;
> - int weight;
> + int weight, value, running = 0;
> + struct suggestion *ptr;
>
> strcpy(status_bar_slots[8],"");
> - suggestion_key = 255;
> - suggestion_activate = NULL;
> + suggestion_key = 255;
> + suggestion_activate = NULL;
>
> - if (total_weight==0 || suggestions==NULL) {
> - /* zero suggestions */
> + if (total_weight == 0 || suggestions == NULL) {
> show_suggestion("");
> return;
> }
> -
> +
> weight = total_weight;
> +
> if (strlen(previous) && displaytime > 0.0)
> - weight+=50;
> - value = rand() % weight;
> - ptr = suggestions;
> + weight += 50;
> +
> + value = rand() % weight;
> + ptr = suggestions;
> +
> while (ptr) {
> running += ptr->weight;
> - if (strcmp(ptr->string, previous)==0 && displaytime > 0.0)
> +
> + if (strcmp(ptr->string, previous) == 0 && displaytime > 0.0)
> running += 50;
> +
> if (running > value) {
> if (ptr->keystring)
> - strncpy(status_bar_slots[8],ptr->keystring,
> 40);
> - suggestion_key = ptr->key;
> - suggestion_activate = ptr->func;
> + strncpy(status_bar_slots[8], ptr->keystring,
> 40);
> +
> + suggestion_key = ptr->key;
> + suggestion_activate = ptr->func;
> +
> show_suggestion(ptr->string);
> +
> if (strcmp(ptr->string, previous)) {
> displaytime = 30.0;
> strcpy(previous, ptr->string);
> @@ -146,7 +161,8 @@ void pick_suggestion(void)
> displaytime = -1.0;
> }
>
> -void print_all_suggestions(void)
> +void
> +print_all_suggestions(void)
> {
> struct suggestion *ptr;
>
> diff -r aed5f2ae104f -r f6c64140a2a5 usr/src/cmd/powertop/util.c
> --- a/usr/src/cmd/powertop/util.c Thu Mar 06 16:39:06 2008 -0800
> +++ b/usr/src/cmd/powertop/util.c Mon Mar 31 14:09:08 2008 +0100
> @@ -40,9 +40,9 @@
>
> #include "powertop.h"
>
> -static char PROG_FMT[] = "%s: ";
> -static char ERR_FMT[] = ": %s";
> -static char *progname;
> +static char PROG_FMT[] = "%s: ";
> +static char ERR_FMT[] = ": %s";
> +static char *progname;
>
> void
> pt_set_progname(char *name)
> @@ -54,14 +54,16 @@ void
> void
> pt_error(char *format, ...)
> {
> - int err = errno;
> + int err = errno;
> va_list alist;
>
> if (progname != NULL)
> (void) fprintf(stderr, PROG_FMT, progname);
> +
> va_start(alist, format);
> (void) vfprintf(stderr, format, alist);
> va_end(alist);
> +
> if (strchr(format, '\n') == NULL)
> (void) fprintf(stderr, gettext(ERR_FMT), strerror(err));
> }
> @@ -73,8 +75,9 @@ enumerate_cpus()
> int ncpus = 0;
> int max;
>
> - max = sysconf(_SC_CPUID_MAX);
> - cpu_table = malloc(_SC_NPROCESSORS_CONF * sizeof(processorid_t));
> + max = sysconf(_SC_CPUID_MAX);
> + cpu_table = malloc(_SC_NPROCESSORS_CONF *
> sizeof(processorid_t));
> +
> for (cpuid = 0; cpuid < max; cpuid++) {
> if (p_online(cpuid, P_STATUS) != -1) {
> cpu_table[ncpus] = cpuid;
>
> _______________________________________________
> tesla-dev mailing list
> tesla-dev at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>
>