diff --git a/[refs] b/[refs] index 5d2f75bba588..94f113e4d328 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 15aaa34654831e98dd76f7738b6c7f5d05a66430 +refs/heads/master: ea9f8856bd6d4ed45885b06a338f7362cd6c60e5 diff --git a/trunk/drivers/acpi/video.c b/trunk/drivers/acpi/video.c index eaef02afc7cf..462486b9f9b2 100644 --- a/trunk/drivers/acpi/video.c +++ b/trunk/drivers/acpi/video.c @@ -548,27 +548,27 @@ acpi_video_device_EDID(struct acpi_video_device *device, * 1. The system BIOS should NOT automatically control the brightness * level of the LCD when the power changes from AC to DC. * Return Value: - * -1 wrong arg. + * -EINVAL wrong arg. */ static int acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) { - u64 status = 0; + acpi_status status; union acpi_object arg0 = { ACPI_TYPE_INTEGER }; struct acpi_object_list args = { 1, &arg0 }; - if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) { - status = -1; - goto Failed; - } + if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) + return -EINVAL; arg0.integer.value = (lcd_flag << 2) | bios_flag; video->dos_setting = arg0.integer.value; - acpi_evaluate_object(video->device->handle, "_DOS", &args, NULL); + status = acpi_evaluate_object(video->device->handle, "_DOS", + &args, NULL); + if (ACPI_FAILURE(status)) + return -EIO; - Failed: - return status; + return 0; } /* @@ -1343,15 +1343,17 @@ static int acpi_video_bus_get_devices(struct acpi_video_bus *video, struct acpi_device *device) { - int status = 0; + int status; struct acpi_device *dev; - acpi_video_device_enumerate(video); + status = acpi_video_device_enumerate(video); + if (status) + return status; list_for_each_entry(dev, &device->children, node) { status = acpi_video_bus_get_one_device(dev, video); - if (ACPI_FAILURE(status)) { + if (status) { printk(KERN_WARNING PREFIX "Can't attach device\n"); continue; @@ -1653,8 +1655,12 @@ static int acpi_video_bus_add(struct acpi_device *device) mutex_init(&video->device_list_lock); INIT_LIST_HEAD(&video->video_device_list); - acpi_video_bus_get_devices(video, device); - acpi_video_bus_start_devices(video); + error = acpi_video_bus_get_devices(video, device); + if (error) + goto err_free_video; + error = acpi_video_bus_start_devices(video); + if (error) + goto err_put_video; video->input = input = input_allocate_device(); if (!input) { @@ -1692,14 +1698,19 @@ static int acpi_video_bus_add(struct acpi_device *device) video->pm_nb.notifier_call = acpi_video_resume; video->pm_nb.priority = 0; - register_pm_notifier(&video->pm_nb); + error = register_pm_notifier(&video->pm_nb); + if (error) + goto err_unregister_input_dev; return 0; + err_unregister_input_dev: + input_unregister_device(input); err_free_input_dev: input_free_device(input); err_stop_video: acpi_video_bus_stop_devices(video); + err_put_video: acpi_video_bus_put_devices(video); kfree(video->attached_array); err_free_video: diff --git a/trunk/tools/power/x86/turbostat/turbostat.8 b/trunk/tools/power/x86/turbostat/turbostat.8 index adf175f61496..555c69a5592a 100644 --- a/trunk/tools/power/x86/turbostat/turbostat.8 +++ b/trunk/tools/power/x86/turbostat/turbostat.8 @@ -4,13 +4,11 @@ turbostat \- Report processor frequency and idle statistics .SH SYNOPSIS .ft B .B turbostat -.RB [ "\-s" ] .RB [ "\-v" ] .RB [ "\-M MSR#" ] .RB command .br .B turbostat -.RB [ "\-s" ] .RB [ "\-v" ] .RB [ "\-M MSR#" ] .RB [ "\-i interval_sec" ] @@ -27,8 +25,6 @@ supports an "invariant" TSC, plus the APERF and MPERF MSRs. on processors that additionally support C-state residency counters. .SS Options -The \fB-s\fP option prints only a 1-line summary for each sample interval. -.PP The \fB-v\fP option increases verbosity. .PP The \fB-M MSR#\fP option dumps the specified MSR, @@ -43,14 +39,13 @@ displays the statistics gathered since it was forked. .SH FIELD DESCRIPTIONS .nf \fBpk\fP processor package number. -\fBcor\fP processor core number. +\fBcr\fP processor core number. \fBCPU\fP Linux CPU (logical processor) number. -Note that multiple CPUs per core indicate support for Intel(R) Hyper-Threading Technology. \fB%c0\fP percent of the interval that the CPU retired instructions. \fBGHz\fP average clock rate while the CPU was in c0 state. \fBTSC\fP average GHz that the TSC ran during the entire interval. -\fB%c1, %c3, %c6, %c7\fP show the percentage residency in hardware core idle states. -\fB%pc2, %pc3, %pc6, %pc7\fP percentage residency in hardware package idle states. +\fB%c1, %c3, %c6\fP show the percentage residency in hardware core idle states. +\fB%pc3, %pc6\fP percentage residency in hardware package idle states. .fi .PP .SH EXAMPLE @@ -58,37 +53,25 @@ Without any parameters, turbostat prints out counters ever 5 seconds. (override interval with "-i sec" option, or specify a command for turbostat to fork). -The first row of statistics is a summary for the entire system. -Note that the summary is a weighted average. +The first row of statistics reflect the average for the entire system. Subsequent rows show per-CPU statistics. .nf [root@x980]# ./turbostat -cor CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 - 0.60 1.63 3.38 2.91 0.00 96.49 0.00 76.64 - 0 0 0.59 1.62 3.38 4.51 0.00 94.90 0.00 76.64 - 0 6 1.13 1.64 3.38 3.97 0.00 94.90 0.00 76.64 - 1 2 0.08 1.62 3.38 0.07 0.00 99.85 0.00 76.64 - 1 8 0.03 1.62 3.38 0.12 0.00 99.85 0.00 76.64 - 2 4 0.01 1.62 3.38 0.06 0.00 99.93 0.00 76.64 - 2 10 0.04 1.62 3.38 0.02 0.00 99.93 0.00 76.64 - 8 1 2.85 1.62 3.38 11.71 0.00 85.44 0.00 76.64 - 8 7 1.98 1.62 3.38 12.58 0.00 85.44 0.00 76.64 - 9 3 0.36 1.62 3.38 0.71 0.00 98.93 0.00 76.64 - 9 9 0.09 1.62 3.38 0.98 0.00 98.93 0.00 76.64 - 10 5 0.03 1.62 3.38 0.09 0.00 99.87 0.00 76.64 - 10 11 0.07 1.62 3.38 0.06 0.00 99.87 0.00 76.64 -.fi -.SH SUMMARY EXAMPLE -The "-s" option prints the column headers just once, -and then the one line system summary for each sample interval. - -.nf -[root@x980]# ./turbostat -s - %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 - 0.61 1.89 3.38 5.95 0.00 93.44 0.00 66.33 - 0.52 1.62 3.38 6.83 0.00 92.65 0.00 61.11 - 0.62 1.92 3.38 5.47 0.00 93.91 0.00 67.31 +cr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 + 0.04 1.62 3.38 0.11 0.00 99.85 0.00 95.07 + 0 0 0.04 1.62 3.38 0.06 0.00 99.90 0.00 95.07 + 0 6 0.02 1.62 3.38 0.08 0.00 99.90 0.00 95.07 + 1 2 0.10 1.62 3.38 0.29 0.00 99.61 0.00 95.07 + 1 8 0.11 1.62 3.38 0.28 0.00 99.61 0.00 95.07 + 2 4 0.01 1.62 3.38 0.01 0.00 99.98 0.00 95.07 + 2 10 0.01 1.61 3.38 0.02 0.00 99.98 0.00 95.07 + 8 1 0.07 1.62 3.38 0.15 0.00 99.78 0.00 95.07 + 8 7 0.03 1.62 3.38 0.19 0.00 99.78 0.00 95.07 + 9 3 0.01 1.62 3.38 0.02 0.00 99.98 0.00 95.07 + 9 9 0.01 1.62 3.38 0.02 0.00 99.98 0.00 95.07 + 10 5 0.01 1.62 3.38 0.13 0.00 99.86 0.00 95.07 + 10 11 0.08 1.62 3.38 0.05 0.00 99.86 0.00 95.07 .fi .SH VERBOSE EXAMPLE The "-v" option adds verbosity to the output: @@ -118,33 +101,33 @@ until ^C while the other CPUs are mostly idle: .nf [root@x980 lenb]# ./turbostat cat /dev/zero > /dev/null -^C -cor CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 - 8.63 3.64 3.38 14.46 0.49 76.42 0.00 0.00 - 0 0 0.34 3.36 3.38 99.66 0.00 0.00 0.00 0.00 - 0 6 99.96 3.64 3.38 0.04 0.00 0.00 0.00 0.00 - 1 2 0.14 3.50 3.38 1.75 2.04 96.07 0.00 0.00 - 1 8 0.38 3.57 3.38 1.51 2.04 96.07 0.00 0.00 - 2 4 0.01 2.65 3.38 0.06 0.00 99.93 0.00 0.00 - 2 10 0.03 2.12 3.38 0.04 0.00 99.93 0.00 0.00 - 8 1 0.91 3.59 3.38 35.27 0.92 62.90 0.00 0.00 - 8 7 1.61 3.63 3.38 34.57 0.92 62.90 0.00 0.00 - 9 3 0.04 3.38 3.38 0.20 0.00 99.76 0.00 0.00 - 9 9 0.04 3.29 3.38 0.20 0.00 99.76 0.00 0.00 - 10 5 0.03 3.08 3.38 0.12 0.00 99.85 0.00 0.00 - 10 11 0.05 3.07 3.38 0.10 0.00 99.85 0.00 0.00 -4.907015 sec + +^Ccr CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 + 8.49 3.63 3.38 16.23 0.66 74.63 0.00 0.00 + 0 0 1.22 3.62 3.38 32.18 0.00 66.60 0.00 0.00 + 0 6 0.40 3.61 3.38 33.00 0.00 66.60 0.00 0.00 + 1 2 0.11 3.14 3.38 0.19 3.95 95.75 0.00 0.00 + 1 8 0.05 2.88 3.38 0.25 3.95 95.75 0.00 0.00 + 2 4 0.00 3.13 3.38 0.02 0.00 99.98 0.00 0.00 + 2 10 0.00 3.09 3.38 0.02 0.00 99.98 0.00 0.00 + 8 1 0.04 3.50 3.38 14.43 0.00 85.54 0.00 0.00 + 8 7 0.03 2.98 3.38 14.43 0.00 85.54 0.00 0.00 + 9 3 0.00 3.16 3.38 100.00 0.00 0.00 0.00 0.00 + 9 9 99.93 3.63 3.38 0.06 0.00 0.00 0.00 0.00 + 10 5 0.01 2.82 3.38 0.08 0.00 99.91 0.00 0.00 + 10 11 0.02 3.36 3.38 0.06 0.00 99.91 0.00 0.00 +6.950866 sec .fi -Above the cycle soaker drives cpu6 up 3.6 Ghz turbo limit +Above the cycle soaker drives cpu9 up 3.6 Ghz turbo limit while the other processors are generally in various states of idle. -Note that cpu0 is an HT sibling sharing core0 -with cpu6, and thus it is unable to get to an idle state -deeper than c1 while cpu6 is busy. +Note that cpu3 is an HT sibling sharing core9 +with cpu9, and thus it is unable to get to an idle state +deeper than c1 while cpu9 is busy. -Note that turbostat reports average GHz of 3.64, while -the arithmetic average of the GHz column above is lower. +Note that turbostat reports average GHz of 3.61, while +the arithmetic average of the GHz column above is 3.24. This is a weighted average, where the weight is %c0. ie. it is the total number of un-halted cycles elapsed per time divided by the number of CPUs. .SH NOTES @@ -184,6 +167,6 @@ http://www.intel.com/products/processor/manuals/ .SH "SEE ALSO" msr(4), vmstat(8) .PP -.SH AUTHOR +.SH AUTHORS .nf Written by Len Brown diff --git a/trunk/tools/power/x86/turbostat/turbostat.c b/trunk/tools/power/x86/turbostat/turbostat.c index ab2f682fd44c..310d3dd5e547 100644 --- a/trunk/tools/power/x86/turbostat/turbostat.c +++ b/trunk/tools/power/x86/turbostat/turbostat.c @@ -2,7 +2,7 @@ * turbostat -- show CPU frequency and C-state residency * on modern Intel turbo-capable processors. * - * Copyright (c) 2012 Intel Corporation. + * Copyright (c) 2010, Intel Corporation. * Len Brown * * This program is free software; you can redistribute it and/or modify it @@ -19,7 +19,6 @@ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #include #include #include @@ -33,7 +32,6 @@ #include #include #include -#include #define MSR_TSC 0x10 #define MSR_NEHALEM_PLATFORM_INFO 0xCE @@ -51,7 +49,6 @@ char *proc_stat = "/proc/stat"; unsigned int interval_sec = 5; /* set with -i interval_sec */ unsigned int verbose; /* set with -v */ -unsigned int summary_only; /* set with -s */ unsigned int skip_c0; unsigned int skip_c1; unsigned int do_nhm_cstates; @@ -71,10 +68,9 @@ unsigned int show_cpu; int aperf_mperf_unstable; int backwards_count; char *progname; +int need_reinitialize; int num_cpus; -cpu_set_t *cpu_mask; -size_t cpu_mask_size; struct counters { unsigned long long tsc; /* per thread */ @@ -103,76 +99,44 @@ struct timeval tv_even; struct timeval tv_odd; struct timeval tv_delta; -/* - * cpu_mask_init(ncpus) - * - * allocate and clear cpu_mask - * set cpu_mask_size - */ -void cpu_mask_init(int ncpus) -{ - cpu_mask = CPU_ALLOC(ncpus); - if (cpu_mask == NULL) { - perror("CPU_ALLOC"); - exit(3); - } - cpu_mask_size = CPU_ALLOC_SIZE(ncpus); - CPU_ZERO_S(cpu_mask_size, cpu_mask); -} - -void cpu_mask_uninit() -{ - CPU_FREE(cpu_mask); - cpu_mask = NULL; - cpu_mask_size = 0; -} - -int cpu_migrate(int cpu) -{ - CPU_ZERO_S(cpu_mask_size, cpu_mask); - CPU_SET_S(cpu, cpu_mask_size, cpu_mask); - if (sched_setaffinity(0, cpu_mask_size, cpu_mask) == -1) - return -1; - else - return 0; -} - -int get_msr(int cpu, off_t offset, unsigned long long *msr) +unsigned long long get_msr(int cpu, off_t offset) { ssize_t retval; + unsigned long long msr; char pathname[32]; int fd; sprintf(pathname, "/dev/cpu/%d/msr", cpu); fd = open(pathname, O_RDONLY); - if (fd < 0) - return -1; - - retval = pread(fd, msr, sizeof *msr, offset); - close(fd); + if (fd < 0) { + perror(pathname); + need_reinitialize = 1; + return 0; + } - if (retval != sizeof *msr) - return -1; + retval = pread(fd, &msr, sizeof msr, offset); + if (retval != sizeof msr) { + fprintf(stderr, "cpu%d pread(..., 0x%zx) = %jd\n", + cpu, offset, retval); + exit(-2); + } - return 0; + close(fd); + return msr; } void print_header(void) { if (show_pkg) fprintf(stderr, "pk"); - if (show_pkg) - fprintf(stderr, " "); if (show_core) - fprintf(stderr, "cor"); + fprintf(stderr, " cr"); if (show_cpu) fprintf(stderr, " CPU"); - if (show_pkg || show_core || show_cpu) - fprintf(stderr, " "); if (do_nhm_cstates) - fprintf(stderr, " %%c0"); + fprintf(stderr, " %%c0 "); if (has_aperf) - fprintf(stderr, " GHz"); + fprintf(stderr, " GHz"); fprintf(stderr, " TSC"); if (do_nhm_cstates) fprintf(stderr, " %%c1"); @@ -183,13 +147,13 @@ void print_header(void) if (do_snb_cstates) fprintf(stderr, " %%c7"); if (do_snb_cstates) - fprintf(stderr, " %%pc2"); + fprintf(stderr, " %%pc2"); if (do_nhm_cstates) - fprintf(stderr, " %%pc3"); + fprintf(stderr, " %%pc3"); if (do_nhm_cstates) - fprintf(stderr, " %%pc6"); + fprintf(stderr, " %%pc6"); if (do_snb_cstates) - fprintf(stderr, " %%pc7"); + fprintf(stderr, " %%pc7"); if (extra_msr_offset) fprintf(stderr, " MSR 0x%x ", extra_msr_offset); @@ -223,15 +187,6 @@ void dump_list(struct counters *cnt) dump_cnt(cnt); } -/* - * column formatting convention & formats - * package: "pk" 2 columns %2d - * core: "cor" 3 columns %3d - * CPU: "CPU" 3 columns %3d - * GHz: "GHz" 3 columns %3.2 - * TSC: "TSC" 3 columns %3.2 - * percentage " %pc3" %6.2 - */ void print_cnt(struct counters *p) { double interval_float; @@ -241,45 +196,39 @@ void print_cnt(struct counters *p) /* topology columns, print blanks on 1st (average) line */ if (p == cnt_average) { if (show_pkg) - fprintf(stderr, " "); - if (show_pkg && show_core) fprintf(stderr, " "); if (show_core) - fprintf(stderr, " "); + fprintf(stderr, " "); if (show_cpu) - fprintf(stderr, " " " "); + fprintf(stderr, " "); } else { if (show_pkg) - fprintf(stderr, "%2d", p->pkg); - if (show_pkg && show_core) - fprintf(stderr, " "); + fprintf(stderr, "%d", p->pkg); if (show_core) - fprintf(stderr, "%3d", p->core); + fprintf(stderr, "%4d", p->core); if (show_cpu) - fprintf(stderr, " %3d", p->cpu); + fprintf(stderr, "%4d", p->cpu); } /* %c0 */ if (do_nhm_cstates) { - if (show_pkg || show_core || show_cpu) - fprintf(stderr, " "); if (!skip_c0) - fprintf(stderr, "%6.2f", 100.0 * p->mperf/p->tsc); + fprintf(stderr, "%7.2f", 100.0 * p->mperf/p->tsc); else - fprintf(stderr, " ****"); + fprintf(stderr, " ****"); } /* GHz */ if (has_aperf) { if (!aperf_mperf_unstable) { - fprintf(stderr, " %3.2f", + fprintf(stderr, "%5.2f", 1.0 * p->tsc / units * p->aperf / p->mperf / interval_float); } else { if (p->aperf > p->tsc || p->mperf > p->tsc) { - fprintf(stderr, " ***"); + fprintf(stderr, " ****"); } else { - fprintf(stderr, "%3.1f*", + fprintf(stderr, "%4.1f*", 1.0 * p->tsc / units * p->aperf / p->mperf / interval_float); @@ -292,7 +241,7 @@ void print_cnt(struct counters *p) if (do_nhm_cstates) { if (!skip_c1) - fprintf(stderr, " %6.2f", 100.0 * p->c1/p->tsc); + fprintf(stderr, "%7.2f", 100.0 * p->c1/p->tsc); else fprintf(stderr, " ****"); } @@ -303,13 +252,13 @@ void print_cnt(struct counters *p) if (do_snb_cstates) fprintf(stderr, " %6.2f", 100.0 * p->c7/p->tsc); if (do_snb_cstates) - fprintf(stderr, " %6.2f", 100.0 * p->pc2/p->tsc); + fprintf(stderr, " %5.2f", 100.0 * p->pc2/p->tsc); if (do_nhm_cstates) - fprintf(stderr, " %6.2f", 100.0 * p->pc3/p->tsc); + fprintf(stderr, " %5.2f", 100.0 * p->pc3/p->tsc); if (do_nhm_cstates) - fprintf(stderr, " %6.2f", 100.0 * p->pc6/p->tsc); + fprintf(stderr, " %5.2f", 100.0 * p->pc6/p->tsc); if (do_snb_cstates) - fprintf(stderr, " %6.2f", 100.0 * p->pc7/p->tsc); + fprintf(stderr, " %5.2f", 100.0 * p->pc7/p->tsc); if (extra_msr_offset) fprintf(stderr, " 0x%016llx", p->extra_msr); putc('\n', stderr); @@ -318,20 +267,12 @@ void print_cnt(struct counters *p) void print_counters(struct counters *counters) { struct counters *cnt; - static int printed; - - if (!printed || !summary_only) - print_header(); + print_header(); if (num_cpus > 1) print_cnt(cnt_average); - printed = 1; - - if (summary_only) - return; - for (cnt = counters; cnt != NULL; cnt = cnt->next) print_cnt(cnt); @@ -499,51 +440,31 @@ void compute_average(struct counters *delta, struct counters *avg) free(sum); } -int get_counters(struct counters *cnt) +void get_counters(struct counters *cnt) { for ( ; cnt; cnt = cnt->next) { - - if (cpu_migrate(cnt->cpu)) - return -1; - - if (get_msr(cnt->cpu, MSR_TSC, &cnt->tsc)) - return -1; - - if (has_aperf) { - if (get_msr(cnt->cpu, MSR_APERF, &cnt->aperf)) - return -1; - if (get_msr(cnt->cpu, MSR_MPERF, &cnt->mperf)) - return -1; - } - - if (do_nhm_cstates) { - if (get_msr(cnt->cpu, MSR_CORE_C3_RESIDENCY, &cnt->c3)) - return -1; - if (get_msr(cnt->cpu, MSR_CORE_C6_RESIDENCY, &cnt->c6)) - return -1; - } - + cnt->tsc = get_msr(cnt->cpu, MSR_TSC); + if (do_nhm_cstates) + cnt->c3 = get_msr(cnt->cpu, MSR_CORE_C3_RESIDENCY); + if (do_nhm_cstates) + cnt->c6 = get_msr(cnt->cpu, MSR_CORE_C6_RESIDENCY); if (do_snb_cstates) - if (get_msr(cnt->cpu, MSR_CORE_C7_RESIDENCY, &cnt->c7)) - return -1; - - if (do_nhm_cstates) { - if (get_msr(cnt->cpu, MSR_PKG_C3_RESIDENCY, &cnt->pc3)) - return -1; - if (get_msr(cnt->cpu, MSR_PKG_C6_RESIDENCY, &cnt->pc6)) - return -1; - } - if (do_snb_cstates) { - if (get_msr(cnt->cpu, MSR_PKG_C2_RESIDENCY, &cnt->pc2)) - return -1; - if (get_msr(cnt->cpu, MSR_PKG_C7_RESIDENCY, &cnt->pc7)) - return -1; - } + cnt->c7 = get_msr(cnt->cpu, MSR_CORE_C7_RESIDENCY); + if (has_aperf) + cnt->aperf = get_msr(cnt->cpu, MSR_APERF); + if (has_aperf) + cnt->mperf = get_msr(cnt->cpu, MSR_MPERF); + if (do_snb_cstates) + cnt->pc2 = get_msr(cnt->cpu, MSR_PKG_C2_RESIDENCY); + if (do_nhm_cstates) + cnt->pc3 = get_msr(cnt->cpu, MSR_PKG_C3_RESIDENCY); + if (do_nhm_cstates) + cnt->pc6 = get_msr(cnt->cpu, MSR_PKG_C6_RESIDENCY); + if (do_snb_cstates) + cnt->pc7 = get_msr(cnt->cpu, MSR_PKG_C7_RESIDENCY); if (extra_msr_offset) - if (get_msr(cnt->cpu, extra_msr_offset, &cnt->extra_msr)) - return -1; + cnt->extra_msr = get_msr(cnt->cpu, extra_msr_offset); } - return 0; } void print_nehalem_info(void) @@ -554,7 +475,7 @@ void print_nehalem_info(void) if (!do_nehalem_platform_info) return; - get_msr(0, MSR_NEHALEM_PLATFORM_INFO, &msr); + msr = get_msr(0, MSR_NEHALEM_PLATFORM_INFO); ratio = (msr >> 40) & 0xFF; fprintf(stderr, "%d * %.0f = %.0f MHz max efficiency\n", @@ -570,7 +491,7 @@ void print_nehalem_info(void) if (!do_nehalem_turbo_ratio_limit) return; - get_msr(0, MSR_NEHALEM_TURBO_RATIO_LIMIT, &msr); + msr = get_msr(0, MSR_NEHALEM_TURBO_RATIO_LIMIT); ratio = (msr >> 24) & 0xFF; if (ratio) @@ -636,8 +557,7 @@ void insert_counters(struct counters **list, return; } - if (!summary_only) - show_cpu = 1; /* there is more than one CPU */ + show_cpu = 1; /* there is more than one CPU */ /* * insert on front of list. @@ -655,15 +575,13 @@ void insert_counters(struct counters **list, while (prev->next && (prev->next->pkg < new->pkg)) { prev = prev->next; - if (!summary_only) - show_pkg = 1; /* there is more than 1 package */ + show_pkg = 1; /* there is more than 1 package */ } while (prev->next && (prev->next->pkg == new->pkg) && (prev->next->core < new->core)) { prev = prev->next; - if (!summary_only) - show_core = 1; /* there is more than 1 core */ + show_core = 1; /* there is more than 1 core */ } while (prev->next && (prev->next->pkg == new->pkg) @@ -763,7 +681,7 @@ int get_core_id(int cpu) } /* - * run func(pkg, core, cpu) on every cpu in /proc/stat + * run func(index, cpu) on every cpu in /proc/stat */ int for_all_cpus(void (func)(int, int, int)) @@ -799,18 +717,18 @@ int for_all_cpus(void (func)(int, int, int)) void re_initialize(void) { + printf("turbostat: topology changed, re-initializing.\n"); free_all_counters(); num_cpus = for_all_cpus(alloc_new_counters); - cpu_mask_uninit(); - cpu_mask_init(num_cpus); - printf("turbostat: re-initialized with num_cpus %d\n", num_cpus); + need_reinitialize = 0; + printf("num_cpus is now %d\n", num_cpus); } void dummy(int pkg, int core, int cpu) { return; } /* * check to see if a cpu came on-line */ -int verify_num_cpus(void) +void verify_num_cpus(void) { int new_num_cpus; @@ -820,9 +738,8 @@ int verify_num_cpus(void) if (verbose) printf("num_cpus was %d, is now %d\n", num_cpus, new_num_cpus); - return -1; + need_reinitialize = 1; } - return 0; } void turbostat_loop() @@ -832,25 +749,25 @@ void turbostat_loop() gettimeofday(&tv_even, (struct timezone *)NULL); while (1) { - if (verify_num_cpus()) { + verify_num_cpus(); + if (need_reinitialize) { re_initialize(); goto restart; } sleep(interval_sec); - if (get_counters(cnt_odd)) { - re_initialize(); - goto restart; - } + get_counters(cnt_odd); gettimeofday(&tv_odd, (struct timezone *)NULL); + compute_delta(cnt_odd, cnt_even, cnt_delta); timersub(&tv_odd, &tv_even, &tv_delta); compute_average(cnt_delta, cnt_average); print_counters(cnt_delta); - sleep(interval_sec); - if (get_counters(cnt_even)) { + if (need_reinitialize) { re_initialize(); goto restart; } + sleep(interval_sec); + get_counters(cnt_even); gettimeofday(&tv_even, (struct timezone *)NULL); compute_delta(cnt_even, cnt_odd, cnt_delta); timersub(&tv_even, &tv_odd, &tv_delta); @@ -1036,7 +953,6 @@ void turbostat_init() check_super_user(); num_cpus = for_all_cpus(alloc_new_counters); - cpu_mask_init(num_cpus); if (verbose) print_nehalem_info(); @@ -1089,11 +1005,8 @@ void cmdline(int argc, char **argv) progname = argv[0]; - while ((opt = getopt(argc, argv, "+svi:M:")) != -1) { + while ((opt = getopt(argc, argv, "+vi:M:")) != -1) { switch (opt) { - case 's': - summary_only++; - break; case 'v': verbose++; break;