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
>
>

Reply via email to