mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  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®