From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Len Brown <len.brown@intel.com>
Subject: [PATCH 44/49] tools/power turbostat: add [-m MSR#] option
Date: Sat, 6 Oct 2012 22:43:14 -0400 [thread overview]
Message-ID: <2f32edf12c1eafc8e5b1b0337360993fde1b3565.1349554106.git.len.brown@intel.com> (raw)
In-Reply-To: <1349577799-566-1-git-send-email-lenb@kernel.org>
In-Reply-To: <a950c135e5b2be6ef7518d54d98a7901db1b377a.1349554105.git.len.brown@intel.com>
From: Len Brown <len.brown@intel.com>
-m MSR# prints the specified MSR in 32-bit format
-M MSR# prints the specified MSR in 64-bit format
Signed-off-by: Len Brown <len.brown@intel.com>
---
tools/power/x86/turbostat/turbostat.8 | 14 +++++++-
tools/power/x86/turbostat/turbostat.c | 68 +++++++++++++++++++++++++++--------
2 files changed, 66 insertions(+), 16 deletions(-)
diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8
index 74e4450..8e7b29af 100644
--- a/tools/power/x86/turbostat/turbostat.8
+++ b/tools/power/x86/turbostat/turbostat.8
@@ -6,12 +6,14 @@ turbostat \- Report processor frequency and idle statistics
.B turbostat
.RB [ "\-s" ]
.RB [ "\-v" ]
+.RB [ "\-m MSR#" ]
.RB [ "\-M MSR#" ]
.RB command
.br
.B turbostat
.RB [ "\-s" ]
.RB [ "\-v" ]
+.RB [ "\-m MSR#" ]
.RB [ "\-M MSR#" ]
.RB [ "\-i interval_sec" ]
.SH DESCRIPTION
@@ -35,7 +37,10 @@ The \fB-p\fP option limits output to the 1st thread in each package.
.PP
The \fB-v\fP option increases verbosity.
.PP
-The \fB-M MSR#\fP option dumps the specified MSR,
+The \fB-m MSR#\fP option dumps the specified 32-bit MSR,
+in addition to the usual frequency and idle statistics.
+.PP
+The \fB-M MSR#\fP option dumps the specified 64-bit MSR,
in addition to the usual frequency and idle statistics.
.PP
The \fB-i interval_sec\fP option prints statistics every \fiinterval_sec\fP seconds.
@@ -165,6 +170,13 @@ may work poorly on Linux-2.6.20 through 2.6.29,
as \fBacpi-cpufreq \fPperiodically cleared the APERF and MPERF
in those kernels.
+If the TSC column does not make sense, then
+the other numbers will also make no sense.
+Turbostat is lightweight, and its data collection is not atomic.
+These issues are usually caused by an extremely short measurement
+interval (much less than 1 second), or system activity that prevents
+turbostat from being able to run on all CPUS to quickly collect data.
+
The APERF, MPERF MSRs are defined to count non-halted cycles.
Although it is not guaranteed by the architecture, turbostat assumes
that they count at TSC rate, which is true on all processors tested to date.
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 5ce88dd..946e9ab 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -63,7 +63,8 @@ unsigned int has_invariant_tsc;
unsigned int do_nehalem_platform_info;
unsigned int do_nehalem_turbo_ratio_limit;
unsigned int do_ivt_turbo_ratio_limit;
-unsigned int extra_msr_offset;
+unsigned int extra_msr_offset32;
+unsigned int extra_msr_offset64;
double bclk;
unsigned int show_pkg;
unsigned int show_core;
@@ -84,7 +85,8 @@ struct thread_data {
unsigned long long aperf;
unsigned long long mperf;
unsigned long long c1; /* derived */
- unsigned long long extra_msr;
+ unsigned long long extra_msr64;
+ unsigned int extra_msr32;
unsigned int cpu_id;
unsigned int flags;
#define CPU_IS_FIRST_THREAD_IN_CORE 0x2
@@ -206,6 +208,24 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr)
return 0;
}
+/*
+ * Truncate the 8 bytes we read from /dev/cpu/.../msr
+ * to the 4 bytes requested
+ */
+
+int get_msr32(int cpu, off_t offset, unsigned int *msr)
+{
+ int retval;
+
+ unsigned long long msr64;
+
+ retval = get_msr(cpu, offset, &msr64);
+ *msr = (unsigned int) msr64;
+
+ return retval;
+}
+
+
void print_header(void)
{
if (show_pkg)
@@ -223,8 +243,10 @@ void print_header(void)
if (has_aperf)
outp += sprintf(outp, " GHz");
outp += sprintf(outp, " TSC");
- if (extra_msr_offset)
- outp += sprintf(outp, " MSR 0x%04X", extra_msr_offset);
+ if (extra_msr_offset32)
+ outp += sprintf(outp, " MSR 0x%04X", extra_msr_offset32);
+ if (extra_msr_offset64)
+ outp += sprintf(outp, " MSR 0x%04X", extra_msr_offset64);
if (do_nhm_cstates)
outp += sprintf(outp, " %%c1");
if (do_nhm_cstates)
@@ -256,8 +278,10 @@ int dump_counters(struct thread_data *t, struct core_data *c,
fprintf(stderr, "aperf: %016llX\n", t->aperf);
fprintf(stderr, "mperf: %016llX\n", t->mperf);
fprintf(stderr, "c1: %016llX\n", t->c1);
+ fprintf(stderr, "msr0x%x: %08X\n",
+ extra_msr_offset32, t->extra_msr32);
fprintf(stderr, "msr0x%x: %016llX\n",
- extra_msr_offset, t->extra_msr);
+ extra_msr_offset64, t->extra_msr64);
}
if (c) {
@@ -361,9 +385,13 @@ int format_counters(struct thread_data *t, struct core_data *c,
/* TSC */
outp += sprintf(outp, "%5.2f", 1.0 * t->tsc/units/interval_float);
+ /* msr */
+ if (extra_msr_offset32)
+ outp += sprintf(outp, " 0x%08x", t->extra_msr32);
+
/* MSR */
- if (extra_msr_offset)
- outp += sprintf(outp, " 0x%016llx", t->extra_msr);
+ if (extra_msr_offset64)
+ outp += sprintf(outp, " 0x%016llx", t->extra_msr64);
if (do_nhm_cstates) {
if (!skip_c1)
@@ -506,9 +534,10 @@ delta_thread(struct thread_data *new, struct thread_data *old,
}
/*
- * for "extra msr", just copy the latest w/o subtracting
+ * Extra MSR is a snapshot, simply copy latest w/o subtracting
*/
- old->extra_msr = new->extra_msr;
+ old->extra_msr32 = new->extra_msr32;
+ old->extra_msr64 = new->extra_msr64;
}
int delta_cpu(struct thread_data *t, struct core_data *c,
@@ -632,8 +661,12 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
return -4;
}
- if (extra_msr_offset)
- if (get_msr(cpu, extra_msr_offset, &t->extra_msr))
+ if (extra_msr_offset32)
+ if (get_msr32(cpu, extra_msr_offset32, &t->extra_msr32))
+ return -5;
+
+ if (extra_msr_offset64)
+ if (get_msr(cpu, extra_msr_offset64, &t->extra_msr64))
return -5;
/* collect core counters only for 1st thread in core */
@@ -1242,7 +1275,7 @@ void check_cpuid()
void usage()
{
- fprintf(stderr, "%s: [-v] [-M MSR#] [-i interval_sec | command ...]\n",
+ fprintf(stderr, "%s: [-v] [-m msr#] [-M MSR#] [-i interval_sec | command ...]\n",
progname);
exit(1);
}
@@ -1532,7 +1565,7 @@ void cmdline(int argc, char **argv)
progname = argv[0];
- while ((opt = getopt(argc, argv, "+cpsvi:M:")) != -1) {
+ while ((opt = getopt(argc, argv, "+cpsvi:m:M:")) != -1) {
switch (opt) {
case 'c':
show_core_only++;
@@ -1549,10 +1582,15 @@ void cmdline(int argc, char **argv)
case 'i':
interval_sec = atoi(optarg);
break;
+ case 'm':
+ sscanf(optarg, "%x", &extra_msr_offset32);
+ if (verbose > 1)
+ fprintf(stderr, "msr 0x%X\n", extra_msr_offset32);
+ break;
case 'M':
- sscanf(optarg, "%x", &extra_msr_offset);
+ sscanf(optarg, "%x", &extra_msr_offset64);
if (verbose > 1)
- fprintf(stderr, "MSR 0x%X\n", extra_msr_offset);
+ fprintf(stderr, "MSR 0x%X\n", extra_msr_offset64);
break;
default:
usage();
--
1.8.0.rc0.18.gf84667d
next prev parent reply other threads:[~2012-10-07 2:44 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-06 20:09 ACPI & PM queue for 3.7-merge Len Brown
2012-10-06 20:09 ` [PATCH 01/49] ACPI: delelte more BFS/GTS related definition and code Len Brown
2012-10-06 20:09 ` [PATCH 02/49] ACPICA: Enable Scope change to root during module-level code execution Len Brown
2012-10-06 20:09 ` [PATCH 03/49] ACPICA: Split ACPICA initialization functions to new file, utxfinit.c Len Brown
2012-10-06 20:09 ` [PATCH 04/49] ACPICA: Comment update: Fix some typos in actble.h Len Brown
2012-10-06 20:09 ` [PATCH 05/49] ACPICA: Add Windows8/Server2012 string for _OSI method Len Brown
2012-10-06 20:09 ` [PATCH 06/49] ACPICA: GPE Support: Update debug info for GPE tracing Len Brown
2012-10-06 20:09 ` [PATCH 07/49] ACPICA: Debug output: Update output for Processor object Len Brown
2012-10-06 20:09 ` [PATCH 08/49] ACPICA: GPE support: Remove extraneous parameter from low-level function Len Brown
2012-10-06 20:09 ` [PATCH 09/49] ACPICA: Headers: Add support for CSRT and DBG2 ACPI tables Len Brown
2012-10-06 20:09 ` [PATCH 10/49] ACPICA: Add support for complex _PLD buffers Len Brown
2012-10-06 20:09 ` [PATCH 11/49] ACPICA: Add struct header support for _FDE, _GRT, _GTM, and _SRT names Len Brown
2012-10-06 20:09 ` [PATCH 12/49] ACPICA: Update version to 20120816 Len Brown
2012-10-06 20:09 ` [PATCH 13/49] ACPI: Use ACPICA native way to decode the PLD buffer Len Brown
2012-10-06 20:09 ` [PATCH 14/49] usb-acpi: Comply with the ACPI API change Len Brown
2012-10-06 20:09 ` [PATCH 15/49] ACPICA: Headers: Add new ACPI 5 HEST notify type values Len Brown
2012-10-06 20:09 ` [PATCH 16/49] ACPICA: Table Manager: Merge duplicate code (root table) Len Brown
2012-10-06 20:09 ` [PATCH 17/49] ACPICA: Update version to 20120913 Len Brown
2012-10-06 20:09 ` [PATCH 18/49] ACPI: Allow ACPI binding with USB-3.0 hub Len Brown
2012-10-06 20:09 ` [PATCH 19/49] ACPI: introduce module_acpi_driver() helper macro Len Brown
2012-10-06 20:09 ` [PATCH 20/49] ACPI/button: convert to module_acpi_driver() Len Brown
2012-10-06 20:09 ` [PATCH 21/49] ACPI/fan: " Len Brown
2012-10-06 20:09 ` [PATCH 22/49] ACPI/hed: " Len Brown
2012-10-06 20:09 ` [PATCH 23/49] ACPI/sbshc: " Len Brown
2012-10-06 20:09 ` [PATCH 24/49] i2c-scmi: " Len Brown
2012-10-06 20:09 ` [PATCH 25/49] Input: atlas_btns - " Len Brown
2012-10-06 20:09 ` [PATCH 26/49] hp_accel: " Len Brown
2012-10-06 20:09 ` [PATCH 27/49] ideapad: " Len Brown
2012-10-06 20:09 ` [PATCH 28/49] topstar-laptop: " Len Brown
2012-10-06 20:09 ` [PATCH 29/49] toshiba_bluetooth: " Len Brown
2012-10-06 20:09 ` [PATCH 30/49] xo15-ebook: " Len Brown
2012-10-06 20:09 ` [PATCH 31/49] tools/power/acpi/acpidump: version 20051111 Len Brown
2012-10-06 20:09 ` [PATCH 32/49] tools/power/acpi/acpidump: version 20060606 Len Brown
2012-10-06 20:09 ` [PATCH 33/49] tools/power/acpi/acpidump: version 20070714 Len Brown
2012-10-06 20:09 ` [PATCH 34/49] tools/power/acpi/acpidump: version 20071116 Len Brown
2012-10-06 20:09 ` [PATCH 35/49] tools/power/acpi/acpidump: version 20101221 - find dynamic tables in sysfs Len Brown
2012-10-06 20:09 ` [PATCH 36/49] tools/power/acpi/acpidump: create acpidump(8), local make install targets Len Brown
2012-10-06 20:09 ` [PATCH 37/49] ACPI: run _OSC after ACPI_FULL_INITIALIZATION Len Brown
2012-10-06 20:09 ` [PATCH 38/49] tools/power/acpi/acpidump: version 20101221 - find dynamic tables in sysfs Len Brown
2012-10-06 20:10 ` [PATCH 39/49] tools/power/acpi/acpidump: create acpidump(8), local make install targets Len Brown
2012-10-06 20:10 ` [PATCH 40/49] tools/power turbostat: run on IVB Xeon Len Brown
2012-10-06 20:10 ` [PATCH 41/49] tools/power turbostat: delete unused line Len Brown
2012-10-07 2:43 ` [PATCH 42/49] tools/power turbostat: print more turbo-limit information Len Brown
2012-10-07 2:43 ` [PATCH 43/49] tools/power turbostat: make -M output pretty Len Brown
2012-10-07 2:43 ` Len Brown [this message]
2012-10-07 2:43 ` [PATCH 45/49] intel_idle: enable IVB Xeon support Len Brown
2012-10-07 2:43 ` [PATCH 46/49] tools/power turbostat: add [-d MSR#][-D MSR#] options to print counter deltas Len Brown
2012-10-07 2:43 ` [PATCH 47/49] tools/power/turbostat: add option to count SMIs, re-name some options Len Brown
2012-10-07 2:43 ` [PATCH 48/49] ACPI: Harden acpi_table_parse_entries() against BIOS bug Len Brown
2012-10-07 2:43 ` [PATCH 49/49] ACPI: Add new sysfs interface to export device description Len Brown
2012-10-09 14:23 ` [PATCH 01/49] ACPI: delelte more BFS/GTS related definition and code Konrad Rzeszutek Wilk
2012-10-07 2:43 ACPI & PM queue for 3.7-merge - part 2 Len Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2f32edf12c1eafc8e5b1b0337360993fde1b3565.1349554106.git.len.brown@intel.com \
--to=lenb@kernel.org \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®