summaryrefslogtreecommitdiffstats
path: root/tools/power/x86/turbostat/turbostat.c
Commit message (Collapse)AuthorAgeFilesLines
* tools/power turbostat: version 18.06.20Len Brown2018-06-201-1/+1
| | | | Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add the missing command line switchesNathan Ciobanu2018-06-201-0/+14
| | | | | | | Document the missing command line tokens in the help() function. Signed-off-by: Nathan Ciobanu <nathan.d.ciobanu@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add single character tokens to helpNathan Ciobanu2018-06-201-11/+14
| | | | | | | | Improve the help() output by adding the single character tokens (e.g -a). Signed-off-by: Nathan Ciobanu <nathan.d.ciobanu@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: alphabetize the help outputNathan Ciobanu2018-06-201-2/+2
| | | | | | | | Sort the command line arguments output of help() in alphabetical order in line with other linux tools. Signed-off-by: Nathan Ciobanu <nathan.d.ciobanu@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix segfault on 'no node' machinesNathan Ciobanu2018-06-201-0/+13
| | | | | | | | | | | | Running turbostat on machines that don't expose nodes in sysfs (no /sys/bus/node) causes a segfault or a -nan value diesplayed in the log. This is caused by physical_node_id being reported as -1 and logical_node_id being calculated as a negative number resulting in the new GET_THREAD/GET_CORE returning an incorrect address. Signed-off-by: Nathan Ciobanu <nathan.d.ciobanu@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add optional APIC X2APIC columnsLen Brown2018-06-201-8/+67
| | | | | | | | | | | Add APIC and X2APIC columns to the topology section. They are disabled-by-default -- enable like so: --debug or --enable APIC,X2APIC Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: decode cpuid.1.HTLen Brown2018-06-201-1/+2
| | | | | | | eg. the "HT" here: CPUID(1): SSE3 MONITOR - EIST TM2 TSC MSR ACPI-TM HT TM Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix show/hide issues resulting from mis-mergeLen Brown2018-06-201-52/+54
| | | | | | | | The --show and --hide options failed on "Node", which was listed as "Node%". The --show and --hide options were generally fouled-up do due to come content merges that scrambled the list of column name indexes. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: update version numberLen Brown2018-06-011-1/+1
| | | | Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Add Node in outputPrarit Bhargava2018-06-011-0/+16
| | | | | | | Output a Node column if there is more than one node/socket. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add node information into turbostat calculationsPrarit Bhargava2018-06-011-58/+85
| | | | | | | | | | | The previous patches have added node information to turbostat, but the counters code does not take it into account. Add node information from cpu_topology calculations to turbostat counters. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: remove num_ from cpu_topology structPrarit Bhargava2018-06-011-25/+23
| | | | | | | | Cleanup, remove num_ from num_nodes_per_pkg, num_cores_per_node, and num_threads_per_node. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: rename num_cores_per_pkg to num_cores_per_nodePrarit Bhargava2018-06-011-12/+14
| | | | | | | | | | | turbostat incorrectly assumes that there is one node per package. As a result num_cores_per_pkg is not correctly named and is actually num_cores_per_node. Rename num_cores_per_pkg to num_cores_per_node. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: track thread ID in cpu_topologyPrarit Bhargava2018-06-011-66/+39
| | | | | | | | | | | | | | The code can be simplified if the cpu_topology *cpus tracks the thread IDs. This removes an additional file lookup and simplifies the counter initialization code. Add thread ID to cpu_topology information and cleanup the counter initialization code. v2: prevent thread_id from being overwritten Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Calculate additional node information for a packagePrarit Bhargava2018-06-011-4/+61
| | | | | | | | | | | | | | | | The code currently assumes each package has exactly one node. This is not the case for AMD systems and Intel systems with COD. AMD systems also may re-enumerate each node's core IDs starting at 0 (for example, an AMD processor may have two nodes, each with core IDs from 0 to 7). In order to properly enumerate the cores we need to track both the physical and logical node IDs. Add physical_node_id to track the node ID assigned by the kernel, and logical_node_id used by turbostat to track the nodes per package ie) a 0-based count within the package. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Fix node and siblings lookup dataLen Brown2018-06-011-35/+82
| | | | | | | | | | | | | | | | | | | | | The turbostat code only looks at thread_siblings_list to determine if processing units/threads are on the same the core. This works well on Intel systems which have a shared L1 instruction and data cache. This does not work on AMD systems which have shared L1 instruction cache but separate L1 data caches. Other utilities also check sibling's core ID to determine if the processing unit shares the same core. Additionally, the cpu_topology *cpus list used in topology_probe() can be used elsewhere in the code to simplify things. Export *cpus to the entire turbostat code, and add Processing Unit/Thread IDs information to each cpu_topology struct. Confirm that the thread is on the same core as indicated by thread_siblings_list. [v2]: Fixup CPU_* usage that caused gcc malloc error. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: set max_num_cpus equal to the cpumask lengthPrarit Bhargava2018-06-011-5/+16
| | | | | | | | | | | | | Future fixes will use sysfs files that contain cpumask output. The code needs to know the length of the cpumask in order to determine which cpus are set in a cpumask. Currently topo.max_cpu_num is the maximum cpu number. It can be increased the the maximum value of cpus represented in cpumasks. Set max_num_cpus to the length of a cpumask. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: if --num_iterations, print for specific number of ↵Chen Yu2018-06-011-1/+19
| | | | | | | | | | | | | | | | | iterations There's a use case during test to only print specific round of iterations if --num_iterations is specified, for example, with this patch applied: turbostat -i 5 -n 4 will capture 4 samples with 5 seconds interval. [lenb: renamed to --num_iterations from --iterations] Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Reviewed-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Add Cannon Lake supportSrinivas Pandruvada2018-06-011-3/+24
| | | | | | | | | | All MSRs related to turbostat are same as Kabylake. Even though SDM claims that core C3 residency can be read from MSR 0x662, the read on this MSR fails on CNL platform. Hence disabled C3 MSR read and display. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: delete duplicate #definesLen Brown2018-06-011-3/+0
| | | | | | | | The SNB_C1_AUTO_UNDEMOTE definition should have been deleted once it was copied into msr-index.h. One copy of the truth is better -- particularly when Matt needs to fix it:-) Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Correct SNB_C1/C3_AUTO_UNDEMOTE definesMatt Turner2018-06-011-2/+2
| | | | | | | | | According to the Intel Software Developers' Manual, Vol. 4, Order No. 335592, these macros have been reversed since they were added. Fixes: 889facbee3e6 ("tools/power turbostat: v3.0: monitor Watts and Temperature") Signed-off-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add POLL and POLL% columnLen Brown2018-06-011-5/+6
| | | | | | | | | | Like the "C1" and "C1%" column, the new POLL and POLL% columns show invocations and residency% during the measurement interval. While it didn't seem important to track in the past, we've recently found some Linux cpuidle bugs related to POLL%. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Fix --hide Pk%pc10Len Brown2018-06-011-1/+1
| | | | | | | | | | | | The column header for PC10 residency is "Pk%pc10" This is missing the 'g' that others have, eg Pkg%pc6, to allow tab-delimited columns to fit into 8-columns. However, --hide Pk%pc10 did not work, it was still looking for the 'g'. This was confusing, because --list shows the correct "Pk%pc10" Reported-by: Wendy Wang <wendy.wang@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: Build-in "Low Power Idle" counters supportLen Brown2018-06-011-0/+95
| | | | | | | | | | | | | | | | | | | | | | | | | Linux 4.15 exports the ACPI Low Power Idle Table's counters in /sys/devices/system/cpu/cpuidle/ low_power_idle_cpu_residency_us Show this in the "CPU%LPI" column. Today this reflects the "North Complex" residency in PC10, so expect it to closely follow "Pk%pc10". low_power_idle_system_residency_us Show this in the "SYS%LPI" column. Today, this reflects the North is in PC10, plus the PCH is sufficiently quiescent to save additional power via the "S0ix" system state, as measured by the PCH SLP_S0 counter. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: remove blank linesLen Brown2018-06-011-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the user reuests to collect and show columns that are not present on every row (eg. for every CPU) turbostat still prints an (empty) line for every CPU. Update so no blank lines are printed. old: # turbostat --quiet --show Pkg%pc6 Pkg%pc6 9.12 9.12 Pkg%pc6 9.12 9.12 new: # turbostat --quiet --show Pkg%pc6 Pkg%pc6 9.12 9.12 Pkg%pc6 9.12 9.12 Reported-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: a small C-states dump readability immprovementArtem Bityutskiy2018-06-011-1/+1
| | | | | | | | | | | | | Improve readability a little bit by changing this output: MSR_PKG_CST_CONFIG_CONTROL: 0x00008407 (locked: pkg-cstate-limit=7: unlimited, automatic-c-state-conversion=off) with this output: MSR_PKG_CST_CONFIG_CONTROL: 0x00008407 (locked, pkg-cstate-limit=7 (unlimited), automatic-c-state-conversion=off) Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: dump BDX, SKX automatic C-state conversion bitArtem Bityutskiy2018-06-011-1/+18
| | | | | | | | | | BDX and SKX have a bit that tells them to PROMOTE shallow C-states requests to MWAIT(C6). It is generally a BIOS bug if this bit is set. As we have encountered that BIOS bug, let's print this bit in turbostat debug output. Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: do not hard-code 25MHz crystal on SKXLen Brown2018-06-011-1/+0
| | | | | | | | | Some SKX use a 24 MHz crystal, so do not hard code 25 MHz. Also, SKX crystal is not exact, because SKX uses an EMI reduction circuit that costs a fraction of a percent. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix possible sprintf buffer overflowLen Brown2018-06-011-1/+1
| | | | Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix MSR_IA32_MISC_ENABLE MWAIT printoutLen Brown2018-06-011-1/+1
| | | | | | | | | | | | | | MSR_IA32_MISC_ENABLE[18] is the MWAIT ENABLE bit, not DISABLE bit... so MSR_IA32_MISC_ENABLE: 0x00850089 (TCC EIST No-MWAIT PREFETCH TURBO) should print as: MSR_IA32_MISC_ENABLE: 0x00850089 (TCC EIST MWAIT PREFETCH TURBO) Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix printing on inputArtem Bityutskiy2018-06-011-6/+10
| | | | | | | | | | | | | | | | | | | | | | The recent patch that implements table printing on a keypress introduced a regression - turbostat prints the table almost continuously if it is run from a daemon program. The problem is also easy to reproduce like this: echo | turbostat The reason is that we cannot assume that stdin is always a TTY. It can be many things. This patch adds fixes the problem by limiting the new keypress functionality to TTYs only. If stdin is not a TTY, we just sleep for the full interval time. While on it, clean-up 'do_sleep()' to return no value, as callers do not expect that anyway. Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: end current interval upon newline inputLen Brown2018-06-011-6/+37
| | | | | | | | | | | | In turbostat interval mode, a newline typed on standard input will now conclude the current interval. Data will immediately be collected and printed for that interval, and the next interval will be started. This is similar to the recently added SIGUSR1 feature. But that is for use by programs, while this is for interactive use. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: on SIGUSR1: sample, print and continueLen Brown2018-06-011-0/+6
| | | | | | | | | | | | | | | | | | Interval-mode turbostat now catches and discards SIGUSR1. Thus, SIGUSR1 can be used to tell turbostat to cut short the current measurement interval. Turbostat will then start the next measurement interval using the regular interval length. This can be used to give turbostat variable intervals. Invoke turbostat with --interval LARGE_NUMBER_SEC and have a program that has permission to send it a SIGUSR1 always before LARGE_NUMBER_SEC expires. It may also be useful to use "--enable Time_Of_Day_Seconds" to observe the actual interval length. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: on SIGINT: sample, print and exitLen Brown2018-06-011-0/+30
| | | | | | | When running in interval-mode, catch interrupts and print a final data record before exiting. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: add --enable Time_Of_Day_SecondsLen Brown2018-06-011-80/+111
| | | | | | | | | | | | | | | | | | | | | | Add a Time_Of_Day_Seconds column showing when measurement for each row was completed. Units are [sec.subsec] since Epoch, as reported by gettimeofday(2). While useful to correlate turbostat output with other tools, this built-in column is disabled, by default. Add the "--enable" option to enable such disabled-by-default built-in columns: "--enable Time_Of_Day_Seconds" "--enable usec" "--enable all", will enable all disabled-by-defauilt built-in counters. When "--debug" is used, all disabled-by-default columns are enabled, unless explicitly skipped using "--hide" Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix Skylake Xeon package C-state displayArtem Bityutskiy2018-06-011-1/+1
| | | | | | | | | | | | Turbostat neglects to display all package C-states for some Skylake Xeon BIOS configurations. This is due to a typo in the table decoding MSR_PKG_CST_CONFIG_CONTROL (0x000000e2) Here we fix that typo, according to Intel SDM, vol 4, Table 2-41 - "MSRs Supported by Intel® Xeon® Processor Scalable Family with DisplayFamily_DisplayModel 06_55H". Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
* Revert "tools/power turbostat: stop migrating, unless '-m'"Len Brown2017-10-181-9/+1
| | | | | | | | | | | | | | This reverts commit c91fc8519d87715a3a173475ea3778794c139996. That change caused a C6 and PC6 residency regression on large idle systems. Users also complained about new output indicating jitter: turbostat: cpu6 jitter 3794 9142 Signed-off-by: Len Brown <len.brown@intel.com> Cc: 4.13+ <stable@vger.kernel.org> # v4.13+ Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
* tools/power turbostat: update version numberLen Brown2017-06-241-1/+1
| | | | Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: decode MSR_IA32_MISC_ENABLE only on IntelLen Brown2017-06-241-0/+3
| | | | | | | | | otherwise, turbostat bails on on AMD Opteron boxes: turbostat: cpu26: msr offset 0x1a0 read failed: Input/output error Reported-by: Kamil Kolakowski <kkolakow@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: stop migrating, unless '-m'Len Brown2017-06-241-1/+9
| | | | | | | | | | | Turbostat has the capability to set its own affinity to each CPU so that its MSR accesses are on the local CPU. However, using the in-kernel cross-call in the msr driver tends to be less invasive, so do that -- by-default. '-m' remains to get the old behaviour. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: if --debug, print sampling overheadLen Brown2017-06-231-2/+19
| | | | | | | | The --debug option now pre-pends each row with the number of micro-seconds [usec] to collect the finishing snapshot for that row. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: hide SKL counters, when not requestedLen Brown2017-06-231-13/+45
| | | | | | | | | | | | | | | | | | | | | | | | | | Skylake has some new counters, and they were erroneously exempt from --show and --hide eg. turbostat --quiet --show CPU CPU Totl%C0 Any%C0 GFX%C0 CPUGFX% - 116.73 90.56 85.69 79.00 0 117.78 91.38 86.47 79.71 2 1 3 is now CPU - 0 2 1 3 Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: update version numberLen Brown2017-04-121-1/+1
| | | | Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: fix impossibly large CPU%c1 valueLen Brown2017-04-121-1/+1
| | | | | | | | | | | | | | | | | | | | | | Most CPUs do not have a hardware c1 counter, and so turbostat derives c1 residency: c1 = TSC - MPERF - other_core_cstate_counters As it is not possible to atomically read these coutners, measurement jitter can case this calcuation to "go negative" when very close to 0. Turbostat detect that case and simply prints c1 = 0.00% But that check neglected to account for systems where the TSC crystal clock domain and the MPERF BCLK domain are differ by a small amount. That allowed very small negative c1 numbers to escape this check and be printed as huge positve numbers. This code begs for a bit of cleanup, but this patch is the minimal change to fix the issue. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: update HWP dump to decimal from hexLen Brown2017-04-121-3/+3
| | | | | | | | | | | | | | | | | Syntax only. The HWP CAPABILTIES and REQUEST ratios are more easily viewed in decimal -- just multiply by 100 and you get MHz... new: cpu0: MSR_HWP_CAPABILITIES: 0x010c1b23 (high 35 guar 27 eff 12 low 1) cpu0: MSR_HWP_REQUEST: 0x80002301 (min 1 max 35 des 0 epp 0x80 window 0x0 pkg 0x0) old: cpu0: MSR_HWP_CAPABILITIES: 0x010c1b23 (high 0x23 guar 0x1b eff 0xc low 0x1) cpu0: MSR_HWP_REQUEST: 0x80002301 (min 0x1 max 0x23 des 0x0 epp 0x80 window 0x0 pkg 0x0) Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: enable package THERM_INTERRUPT dumpLen Brown2017-04-121-6/+2
| | | | | | | | | | | cpu0: MSR_IA32_TEMPERATURE_TARGET: 0x00641400 (100 C) cpu0: MSR_IA32_PACKAGE_THERM_STATUS: 0x884b0800 (25 C) cpu0: MSR_IA32_PACKAGE_THERM_INTERRUPT: 0x00000003 (100 C, 100 C) Enable the same per-core output, but hide it behind --debug because it is too verbose on big systems. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: show missing Core and GFX power on SKL and KBLLen Brown2017-04-121-1/+3
| | | | | | | | While the current SDM is silent on the matter, the Core and GFX RAPL power meters on SKL and KBL appear to work -- so show them. Reported-by: Yaroslav Isakov <yaroslav.isakov@gmail.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: bugfix: GFXMHz column not changingLen Brown2017-03-041-1/+3
| | | | | | | | | | | | | | | turbostat displays a GFXMHz column, which comes from reading /sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz But GFXMHz was not changing, even when a manual cat /sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz showed a new value. It turns out that a rewind() on the open file is not sufficient, fflush() (or a close/open) is needed to read fresh values. Reported-by: Yaroslav Isakov <yaroslav.isakov@gmail.com> Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: version 17.02.24Len Brown2017-03-011-1/+1
| | | | | | | | | The turbostat before this last set of changes is obsolete. This new version can do a lot more, but it also has some different defaults, that might catch some off-guard. So it seems a good time to give a new version number. Signed-off-by: Len Brown <len.brown@intel.com>
* tools/power turbostat: bugfix: --add u32 was printed as u64Len Brown2017-03-011-19/+7
| | | | | | | | | | | | | | | | | When the "u32" keyword is used with --add, it means that the output should be truncated to 32-bits. This was not happening and all 64-bits were printed. Also, when no column name was used for an added MSR, The default column name was in deximal, eg. MSR16. Users report that they tend to use hex MSR numbers, so print them in hex. To always fit into the columns, use the syntax M0x10. Note that the user can always supply any column header that they want. eg --add msr0x10,MY_TSC Signed-off-by: Len Brown <len.brown@intel.com>
OpenPOWER on IntegriCloud