Merge branch 'pm-tools'

Merge power management utilities updates for 6.13-rc1:

 - Update pm-graph to v5.13 (Todd Brandt).

 - Add documentation for some recently introduced cpupower utility
   options (Tor Vic).

 - Make cpupower inform users where cpufreq-bench.conf should be located
   when opening it fails (Peng Fan).

 - Allow overriding cross-compiling env params in cpupower (Peng Fan).

 - Add compile_commands.json to .gitignore in cpupower (John B. Wyatt
   IV).

 - Improve disable c_state block in cpupower bindings and add a test to
   confirm that CPU state is disabled to it (John B. Wyatt IV).

 - Add Chinese Simplified translation to cpupower (Kieran Moy).

 - Add checks for xgettext and msgfmt to cpupower (Siddharth Menon).

* pm-tools:
  cpupower: add checks for xgettext and msgfmt
  cpupower: Add Chinese Simplified translation
  pm-graph v5.13
  pm: cpupower: bindings: Add test to confirm cpu state is disabled
  pm: cpupower: bindings: Improve disable c_state block
  pm: cpupower: gitignore: Add compile_commands.json
  pm: cpupower: Makefile: Allow overriding cross-compiling env params
  pm: cpupower: bench: print config file path when open cpufreq-bench.conf fails
  tools/power/cpupower: Add documentation for some recently introduced options
This commit is contained in:
Rafael J. Wysocki 2024-11-15 19:57:57 +01:00
commit c6e2a4c9ee
8 changed files with 1073 additions and 33 deletions

View File

@ -27,3 +27,6 @@ debug/i386/intel_gsic
debug/i386/powernow-k8-decode debug/i386/powernow-k8-decode
debug/x86_64/centrino-decode debug/x86_64/centrino-decode
debug/x86_64/powernow-k8-decode debug/x86_64/powernow-k8-decode
# Clang's compilation database file
compile_commands.json

View File

@ -57,7 +57,7 @@ LIB_MIN= 1
PACKAGE = cpupower PACKAGE = cpupower
PACKAGE_BUGREPORT = linux-pm@vger.kernel.org PACKAGE_BUGREPORT = linux-pm@vger.kernel.org
LANGUAGES = de fr it cs pt ka LANGUAGES = de fr it cs pt ka zh_CN
# Directory definitions. These are default and most probably # Directory definitions. These are default and most probably
@ -86,12 +86,12 @@ INSTALL_SCRIPT = ${INSTALL} -m 644
# If you are running a cross compiler, you may want to set this # If you are running a cross compiler, you may want to set this
# to something more interesting, like "arm-linux-". If you want # to something more interesting, like "arm-linux-". If you want
# to compile vs uClibc, that can be done here as well. # to compile vs uClibc, that can be done here as well.
CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc- CROSS ?= #/usr/i386-linux-uclibc/usr/bin/i386-uclibc-
CC = $(CROSS)gcc CC ?= $(CROSS)gcc
LD = $(CROSS)gcc LD ?= $(CROSS)gcc
AR = $(CROSS)ar AR ?= $(CROSS)ar
STRIP = $(CROSS)strip STRIP ?= $(CROSS)strip
RANLIB = $(CROSS)ranlib RANLIB ?= $(CROSS)ranlib
HOSTCC = gcc HOSTCC = gcc
MKDIR = mkdir MKDIR = mkdir
@ -218,17 +218,28 @@ else
endif endif
$(QUIET) $(STRIPCMD) $@ $(QUIET) $(STRIPCMD) $@
ifeq (, $(shell which xgettext))
$(warning "Install xgettext to extract translatable strings.")
else
$(OUTPUT)po/$(PACKAGE).pot: $(UTIL_SRC) $(OUTPUT)po/$(PACKAGE).pot: $(UTIL_SRC)
$(ECHO) " GETTEXT " $@ $(ECHO) " GETTEXT " $@
$(QUIET) xgettext --default-domain=$(PACKAGE) --add-comments \ $(QUIET) xgettext --default-domain=$(PACKAGE) --add-comments \
--keyword=_ --keyword=N_ $(UTIL_SRC) -p $(@D) -o $(@F) --keyword=_ --keyword=N_ $(UTIL_SRC) -p $(@D) -o $(@F)
endif
ifeq (, $(shell which msgfmt))
$(warning "Install msgfmt to generate binary message catalogs.")
else
$(OUTPUT)po/%.gmo: po/%.po $(OUTPUT)po/%.gmo: po/%.po
$(ECHO) " MSGFMT " $@ $(ECHO) " MSGFMT " $@
$(QUIET) msgfmt -o $@ po/$*.po $(QUIET) msgfmt -o $@ po/$*.po
endif
create-gmo: ${GMO_FILES} create-gmo: ${GMO_FILES}
ifeq (, $(shell which msgmerge))
$(warning "Install msgmerge to merge translations.")
else
update-po: $(OUTPUT)po/$(PACKAGE).pot update-po: $(OUTPUT)po/$(PACKAGE).pot
$(ECHO) " MSGMRG " $@ $(ECHO) " MSGMRG " $@
$(QUIET) @for HLANG in $(LANGUAGES); do \ $(QUIET) @for HLANG in $(LANGUAGES); do \
@ -241,6 +252,7 @@ update-po: $(OUTPUT)po/$(PACKAGE).pot
rm -f $(OUTPUT)po/$$HLANG.new.po; \ rm -f $(OUTPUT)po/$$HLANG.new.po; \
fi; \ fi; \
done; done;
endif
compile-bench: $(OUTPUT)libcpupower.so.$(LIB_MAJ) compile-bench: $(OUTPUT)libcpupower.so.$(LIB_MAJ)
@V=$(V) confdir=$(confdir) $(MAKE) -C bench O=$(OUTPUT) @V=$(V) confdir=$(confdir) $(MAKE) -C bench O=$(OUTPUT)

View File

@ -4,6 +4,7 @@
* Copyright (C) 2008 Christian Kornacker <ckornacker@suse.de> * Copyright (C) 2008 Christian Kornacker <ckornacker@suse.de>
*/ */
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
@ -165,8 +166,8 @@ int prepare_config(const char *path, struct config *config)
configfile = fopen(path, "r"); configfile = fopen(path, "r");
if (configfile == NULL) { if (configfile == NULL) {
perror("fopen"); fprintf(stderr, "error: unable to read configfile: %s, %s\n",
fprintf(stderr, "error: unable to read configfile\n"); path, strerror(errno));
free(config); free(config);
return 1; return 1;
} }

View File

@ -15,22 +15,38 @@ else:
print(f"cstate count error: return code: {cpu_cstates_count}") print(f"cstate count error: return code: {cpu_cstates_count}")
""" """
Disable cstate (will fail if the above is 0, ex: a virtual machine) Disable cstate (will fail if the above returns is under 1, ex: a virtual machine)
""" """
cstate_disabled = p.cpuidle_state_disable(0, 0, 1) cstate_disabled = p.cpuidle_state_disable(0, 0, 1)
if cpu_cstates_count == 0:
print(f"CPU 0 has {cpu_cstates_count} c-states")
else:
print(f"cstate count error: return code: {cpu_cstates_count}")
match cstate_disabled: match cstate_disabled:
case 0: case 0:
print(f"CPU state disabled") print(f"CPU state disabled")
case -1: case -1:
print(f"Idlestate not available") print(f"Idlestate not available")
case -2:
print(f"Disabling is not supported by the kernel")
case -3:
print(f"No write access to disable/enable C-states: try using sudo")
case _: case _:
print(f"Not documented") print(f"Not documented: {cstate_disabled}")
"""
Test cstate is disabled
"""
is_cstate_disabled = p.cpuidle_is_state_disabled(0, 0)
match is_cstate_disabled:
case 1:
print(f"CPU is disabled")
case 0:
print(f"CPU is enabled")
case -1:
print(f"Idlestate not available")
case -2:
print(f"Disabling is not supported by kernel")
case _:
print(f"Not documented: {is_cstate_disabled}")
# Pointer example # Pointer example

View File

@ -3,7 +3,7 @@
cpupower\-set \- Set processor power related kernel or hardware configurations cpupower\-set \- Set processor power related kernel or hardware configurations
.SH SYNOPSIS .SH SYNOPSIS
.ft B .ft B
.B cpupower set [ \-b VAL ] .B cpupower set [ \-b VAL | \-e POLICY | \-m MODE | \-t BOOL ]
.SH DESCRIPTION .SH DESCRIPTION
@ -19,7 +19,7 @@ described in the Options sections.
Use \fBcpupower info \fP to read out current settings and whether they are Use \fBcpupower info \fP to read out current settings and whether they are
supported on the system at all. supported on the system at all.
.SH Options .SH OPTIONS
.PP .PP
\-\-perf-bias, \-b \-\-perf-bias, \-b
.RS 4 .RS 4
@ -56,6 +56,40 @@ Use \fBcpupower -c all info -b\fP to verify.
This options needs the msr kernel driver (CONFIG_X86_MSR) loaded. This options needs the msr kernel driver (CONFIG_X86_MSR) loaded.
.RE .RE
.PP
\-\-epp, \-e
.RS 4
Sets the energy performance policy preference on supported Intel or AMD
processors which use the Intel or AMD P-State cpufreq driver respectively.
Available policies can be found with
\fBcat /sys/devices/system/cpu/cpufreq/policy0/energy_performance_available_preferences\fP :
.RS 4
default performance balance_performance balance_power power
.RE
.RE
.PP
\-\-amd\-pstate\-mode, \-m
.RS 4
Sets the AMD P-State mode for supported AMD processors.
Available modes are "active", "guided" or "passive".
Refer to the AMD P-State kernel documentation for further information.
.RE
.PP
\-\-turbo\-boost, \-t
.RS 4
This option is used to enable or disable the turbo boost feature on
supported Intel and AMD processors.
This option takes as parameter either \fB1\fP to enable, or \fB0\fP to disable the feature.
.RE
.SH "SEE ALSO" .SH "SEE ALSO"
cpupower-info(1), cpupower-monitor(1), powertop(1) cpupower-info(1), cpupower-monitor(1), powertop(1)
.PP .PP

View File

@ -0,0 +1,942 @@
# Chinese Simplified translations for cpufrequtils package
# Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the cpufrequtils package.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: cpufrequtils 006\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-08 17:03+0100\n"
"PO-Revision-Date: 2024-05-22 15:36+0000\n"
"Last-Translator: Kieran Moy <kfatyuip@gmail.com>\n"
"Language-Team: NONE\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4.2\n"
#: utils/idle_monitor/nhm_idle.c:36
msgid "Processor Core C3"
msgstr "处理器 Core C3"
#: utils/idle_monitor/nhm_idle.c:43
msgid "Processor Core C6"
msgstr "处理器 Core C6"
#: utils/idle_monitor/nhm_idle.c:51
msgid "Processor Package C3"
msgstr "处理器套件 C3"
#: utils/idle_monitor/nhm_idle.c:58 utils/idle_monitor/amd_fam14h_idle.c:70
msgid "Processor Package C6"
msgstr "处理器套件 C6"
#: utils/idle_monitor/snb_idle.c:33
msgid "Processor Core C7"
msgstr "处理器 Core C7"
#: utils/idle_monitor/snb_idle.c:40
msgid "Processor Package C2"
msgstr "处理器套件 C2"
#: utils/idle_monitor/snb_idle.c:47
msgid "Processor Package C7"
msgstr "处理器套件 C7"
#: utils/idle_monitor/amd_fam14h_idle.c:56
msgid "Package in sleep state (PC1 or deeper)"
msgstr "Package in sleep state PC1 或更深)"
#: utils/idle_monitor/amd_fam14h_idle.c:63
msgid "Processor Package C1"
msgstr "处理器套件 C1"
#: utils/idle_monitor/amd_fam14h_idle.c:77
msgid "North Bridge P1 boolean counter (returns 0 or 1)"
msgstr "北桥 P1 布尔计数器(返回 0 或 1"
#: utils/idle_monitor/mperf_monitor.c:35
msgid "Processor Core not idle"
msgstr "处理器 Core不空闲"
#: utils/idle_monitor/mperf_monitor.c:42
msgid "Processor Core in an idle state"
msgstr "处理器 Core处于空闲状态"
#: utils/idle_monitor/mperf_monitor.c:50
msgid "Average Frequency (including boost) in MHz"
msgstr "平均频率(包括增加频率),单位 MHz"
#: utils/idle_monitor/cpupower-monitor.c:66
#, c-format
msgid ""
"cpupower monitor: [-h] [ [-t] | [-l] | [-m <mon1>,[<mon2>] ] ] [-i "
"interval_sec | -c command ...]\n"
msgstr ""
"cpupower monitor[-h] [ [-t] | [-l] | [-m <mon1>,[<mon2>] ] ] [-i "
"interval_sec | -c command...]\n"
#: utils/idle_monitor/cpupower-monitor.c:69
#, c-format
msgid ""
"cpupower monitor: [-v] [-h] [ [-t] | [-l] | [-m <mon1>,[<mon2>] ] ] [-i "
"interval_sec | -c command ...]\n"
msgstr ""
"cpupower monitor[-v] [-h] [ [-t] | [-l] | [-m <mon1>,[<mon2>] ] ] [-i "
"interval_sec | -c command...]\n"
#: utils/idle_monitor/cpupower-monitor.c:71
#, c-format
msgid "\t -v: be more verbose\n"
msgstr "-v更详细\n"
#: utils/idle_monitor/cpupower-monitor.c:73
#, c-format
msgid "\t -h: print this help\n"
msgstr "-h打印此帮助\n"
#: utils/idle_monitor/cpupower-monitor.c:74
#, c-format
msgid "\t -i: time interval to measure for in seconds (default 1)\n"
msgstr "-i测量的时间间隔以秒为单位默认 1\n"
#: utils/idle_monitor/cpupower-monitor.c:75
#, c-format
msgid "\t -t: show CPU topology/hierarchy\n"
msgstr "-t显示CPU拓扑/层次结构\n"
#: utils/idle_monitor/cpupower-monitor.c:76
#, c-format
msgid "\t -l: list available CPU sleep monitors (for use with -m)\n"
msgstr "-l列出可用的 CPU 睡眠监视器(与 -m 一起使用)\n"
#: utils/idle_monitor/cpupower-monitor.c:77
#, c-format
msgid "\t -m: show specific CPU sleep monitors only (in same order)\n"
msgstr "-m仅显示特定的CPU睡眠监视器按相同顺序\n"
#: utils/idle_monitor/cpupower-monitor.c:79
#, c-format
msgid ""
"only one of: -t, -l, -m are allowed\n"
"If none of them is passed,"
msgstr ""
"仅允许以下之一:-t、-l、-m\n"
"如果都没有通过的话"
#: utils/idle_monitor/cpupower-monitor.c:80
#, c-format
msgid " all supported monitors are shown\n"
msgstr " 显示所有支持的显示器\n"
#: utils/idle_monitor/cpupower-monitor.c:197
#, c-format
msgid "Monitor %s, Counter %s has no count function. Implementation error\n"
msgstr "监视器 %s、计数器 %s 无计数功能。 执行错误\n"
#: utils/idle_monitor/cpupower-monitor.c:207
#, c-format
msgid " *is offline\n"
msgstr " *离线\n"
#: utils/idle_monitor/cpupower-monitor.c:236
#, c-format
msgid "%s: max monitor name length (%d) exceeded\n"
msgstr "%s超出最大监视器名称长度 (%d)\n"
#: utils/idle_monitor/cpupower-monitor.c:250
#, c-format
msgid "No matching monitor found in %s, try -l option\n"
msgstr "在 %s 中找不到匹配的监视器,请尝试 -l 选项\n"
#: utils/idle_monitor/cpupower-monitor.c:266
#, c-format
msgid "Monitor \"%s\" (%d states) - Might overflow after %u s\n"
msgstr "监视器“%s”%d 状态)- 可能会在 %u 秒后溢出\n"
#: utils/idle_monitor/cpupower-monitor.c:319
#, c-format
msgid "%s took %.5f seconds and exited with status %d\n"
msgstr "%s 用了 %.5f 秒并退出,状态为 %d\n"
#: utils/idle_monitor/cpupower-monitor.c:406
#, c-format
msgid "Cannot read number of available processors\n"
msgstr "无法读取可用处理器的数量\n"
#: utils/idle_monitor/cpupower-monitor.c:417
#, c-format
msgid "Available monitor %s needs root access\n"
msgstr "可用监视器 %s 需要 root 访问权限\n"
#: utils/idle_monitor/cpupower-monitor.c:428
#, c-format
msgid "No HW Cstate monitors found\n"
msgstr "未找到 HW Cstate 监视器\n"
#: utils/cpupower.c:78
#, c-format
msgid "cpupower [ -c cpulist ] subcommand [ARGS]\n"
msgstr "cpupower [ -c cpulist ] subcommand [ARGS]\n"
#: utils/cpupower.c:79
#, c-format
msgid "cpupower --version\n"
msgstr "cpupower --version\n"
#: utils/cpupower.c:80
#, c-format
msgid "Supported subcommands are:\n"
msgstr "支持的子命令有:\n"
#: utils/cpupower.c:83
#, c-format
msgid ""
"\n"
"Some subcommands can make use of the -c cpulist option.\n"
msgstr ""
"\n"
"某些子命令可以使用 -c cpulist 选项。\n"
#: utils/cpupower.c:84
#, c-format
msgid "Look at the general cpupower manpage how to use it\n"
msgstr "看看一般的cpupower manpage如何使用它\n"
#: utils/cpupower.c:85
#, c-format
msgid "and read up the subcommand's manpage whether it is supported.\n"
msgstr "并阅读子命令的manpage是否受支持。\n"
#: utils/cpupower.c:86
#, c-format
msgid ""
"\n"
"Use cpupower help subcommand for getting help for above subcommands.\n"
msgstr ""
"\n"
"使用 cpupower help subcommand获取上述子命令的帮助。\n"
#: utils/cpupower.c:91
#, c-format
msgid "Report errors and bugs to %s, please.\n"
msgstr "请向 %s 报告错误和错误。\n"
#: utils/cpupower.c:114
#, c-format
msgid "Error parsing cpu list\n"
msgstr "解析cpu列表时出错\n"
#: utils/cpupower.c:172
#, c-format
msgid "Subcommand %s needs root privileges\n"
msgstr "子命令 %s 需要 root 权限\n"
#: utils/cpufreq-info.c:31
#, c-format
msgid "Couldn't count the number of CPUs (%s: %s), assuming 1\n"
msgstr "无法计算 CPU 数量(%s%s假设为 1\n"
#: utils/cpufreq-info.c:63
#, c-format
msgid ""
" minimum CPU frequency - maximum CPU frequency - governor\n"
msgstr "最低 CPU 频率 - 最高 CPU 频率 - 调速器\n"
#: utils/cpufreq-info.c:151
#, c-format
msgid "Error while evaluating Boost Capabilities on CPU %d -- are you root?\n"
msgstr "评估 CPU %d 上的 Boost 功能时出错 - 您是 root 吗?\n"
#. P state changes via MSR are identified via cpuid 80000007
#. on Intel and AMD, but we assume boost capable machines can do that
#. if (cpuid_eax(0x80000000) >= 0x80000007
#. && (cpuid_edx(0x80000007) & (1 << 7)))
#.
#: utils/cpufreq-info.c:161
#, c-format
msgid " boost state support: \n"
msgstr " 升压状态支持:\n"
#: utils/cpufreq-info.c:163
#, c-format
msgid " Supported: %s\n"
msgstr " 支持:%s\n"
#: utils/cpufreq-info.c:163 utils/cpufreq-info.c:164
msgid "yes"
msgstr "是"
#: utils/cpufreq-info.c:163 utils/cpufreq-info.c:164
msgid "no"
msgstr "不是"
#: utils/cpufreq-info.c:164
#, c-format
msgid " Active: %s\n"
msgstr " 活跃:%s\n"
#: utils/cpufreq-info.c:177
#, c-format
msgid " Boost States: %d\n"
msgstr " 提升状态:%d\n"
#: utils/cpufreq-info.c:178
#, c-format
msgid " Total States: %d\n"
msgstr " 状态总数:%d\n"
#: utils/cpufreq-info.c:181
#, c-format
msgid " Pstate-Pb%d: %luMHz (boost state)\n"
msgstr " Pstate-Pb%d%luMHz升压状态\n"
#: utils/cpufreq-info.c:184
#, c-format
msgid " Pstate-P%d: %luMHz\n"
msgstr " Pstate-P%d%luMHz\n"
#: utils/cpufreq-info.c:211
#, c-format
msgid " no or unknown cpufreq driver is active on this CPU\n"
msgstr " 该 CPU 上没有或未知的 cpufreq 驱动程序处于活动状态\n"
#: utils/cpufreq-info.c:213
#, c-format
msgid " driver: %s\n"
msgstr " 驱动程序:%s\n"
#: utils/cpufreq-info.c:219
#, c-format
msgid " CPUs which run at the same hardware frequency: "
msgstr " 以相同硬件频率运行的 CPU"
#: utils/cpufreq-info.c:230
#, c-format
msgid " CPUs which need to have their frequency coordinated by software: "
msgstr " 需要通过软件协调频率的 CPU"
#: utils/cpufreq-info.c:241
#, c-format
msgid " maximum transition latency: "
msgstr " 最大转换延迟:"
#: utils/cpufreq-info.c:247
#, c-format
msgid " hardware limits: "
msgstr " 硬件限制:"
#: utils/cpufreq-info.c:256
#, c-format
msgid " available frequency steps: "
msgstr " 可用频率范围:"
#: utils/cpufreq-info.c:269
#, c-format
msgid " available cpufreq governors: "
msgstr " 可用的cpufreq调节器"
#: utils/cpufreq-info.c:280
#, c-format
msgid " current policy: frequency should be within "
msgstr " 当前政策:频率应在"
#: utils/cpufreq-info.c:282
#, c-format
msgid " and "
msgstr "和"
#: utils/cpufreq-info.c:286
#, c-format
msgid ""
"The governor \"%s\" may decide which speed to use\n"
" within this range.\n"
msgstr ""
"调速器“%s”可以决定使用哪种速度\n"
" 在这个范围内。\n"
#: utils/cpufreq-info.c:293
#, c-format
msgid " current CPU frequency is "
msgstr " 当前CPU频率是"
#: utils/cpufreq-info.c:296
#, c-format
msgid " (asserted by call to hardware)"
msgstr " (通过调用硬件来断言)"
#: utils/cpufreq-info.c:304
#, c-format
msgid " cpufreq stats: "
msgstr " cpu频率统计"
#: utils/cpufreq-info.c:472
#, c-format
msgid "Usage: cpupower freqinfo [options]\n"
msgstr "用法cpupower freqinfo [选项]\n"
#: utils/cpufreq-info.c:473 utils/cpufreq-set.c:26 utils/cpupower-set.c:23
#: utils/cpupower-info.c:22 utils/cpuidle-info.c:148
#, c-format
msgid "Options:\n"
msgstr "选项:\n"
#: utils/cpufreq-info.c:474
#, c-format
msgid " -e, --debug Prints out debug information [default]\n"
msgstr " -e, --debug 打印出调试信息[默认]\n"
#: utils/cpufreq-info.c:475
#, c-format
msgid ""
" -f, --freq Get frequency the CPU currently runs at, according\n"
" to the cpufreq core *\n"
msgstr ""
" -f, --freq 获取CPU当前运行的频率根据\n"
" 到 cpufreq 核心 *\n"
#: utils/cpufreq-info.c:477
#, c-format
msgid ""
" -w, --hwfreq Get frequency the CPU currently runs at, by reading\n"
" it from hardware (only available to root) *\n"
msgstr ""
" -w, --hwfreq 通过读取获取CPU当前运行的频率\n"
" 它来自硬件仅适用于root*\n"
#: utils/cpufreq-info.c:479
#, c-format
msgid ""
" -l, --hwlimits Determine the minimum and maximum CPU frequency "
"allowed *\n"
msgstr " -l, --hwlimits 确定允许的最小和最大 CPU 频率 *\n"
#: utils/cpufreq-info.c:480
#, c-format
msgid " -d, --driver Determines the used cpufreq kernel driver *\n"
msgstr " -d, --driver 确定使用的 cpufreq 内核驱动程序 *\n"
#: utils/cpufreq-info.c:481
#, c-format
msgid " -p, --policy Gets the currently used cpufreq policy *\n"
msgstr " -p, --policy 获取当前使用的cpufreq策略 *\n"
#: utils/cpufreq-info.c:482
#, c-format
msgid " -g, --governors Determines available cpufreq governors *\n"
msgstr " -g, --governors 确定可用的 cpufreq 调节器 *\n"
#: utils/cpufreq-info.c:483
#, c-format
msgid ""
" -r, --related-cpus Determines which CPUs run at the same hardware "
"frequency *\n"
msgstr " -r, --lated-cpus 确定哪些 CPU 以相同的硬件频率运行 *\n"
#: utils/cpufreq-info.c:484
#, c-format
msgid ""
" -a, --affected-cpus Determines which CPUs need to have their frequency\n"
" coordinated by software *\n"
msgstr ""
" -a, --affected-cpus 确定哪些 CPU 需要其频率\n"
" 由软件协调*\n"
#: utils/cpufreq-info.c:486
#, c-format
msgid " -s, --stats Shows cpufreq statistics if available\n"
msgstr " -s, --stats 显示 cpufreq 统计信息(如果有)\n"
#: utils/cpufreq-info.c:487
#, c-format
msgid ""
" -y, --latency Determines the maximum latency on CPU frequency "
"changes *\n"
msgstr " -y, --latency 确定 CPU 频率变化的最大延迟*\n"
#: utils/cpufreq-info.c:488
#, c-format
msgid " -b, --boost Checks for turbo or boost modes *\n"
msgstr " -b, --boost 检查 Turbo 或 boost 模式 *\n"
#: utils/cpufreq-info.c:489
#, c-format
msgid ""
" -o, --proc Prints out information like provided by the /proc/"
"cpufreq\n"
" interface in 2.4. and early 2.6. kernels\n"
msgstr ""
" -o, --proc 打印 /proc/cpufreq 提供的信息\n"
" 2.4 中的接口。 以及 2.6 之前的内核。\n"
#: utils/cpufreq-info.c:491
#, c-format
msgid ""
" -m, --human human-readable output for the -f, -w, -s and -y "
"parameters\n"
msgstr " -m, -- human -f, -w, -s 和 -y 参数的人类可读输出\n"
#: utils/cpufreq-info.c:492 utils/cpuidle-info.c:152
#, c-format
msgid " -h, --help Prints out this screen\n"
msgstr " -h, --help 打印此屏幕\n"
#: utils/cpufreq-info.c:495
#, c-format
msgid ""
"If no argument or only the -c, --cpu parameter is given, debug output "
"about\n"
"cpufreq is printed which is useful e.g. for reporting bugs.\n"
msgstr ""
"screen如果没有参数或仅给出了 -c, --cpu 参数,则调试输出有关\n"
"cpufreq 被打印出来,这很有用,例如 用于报告错误。\n"
#: utils/cpufreq-info.c:497
#, c-format
msgid ""
"For the arguments marked with *, omitting the -c or --cpu argument is\n"
"equivalent to setting it to zero\n"
msgstr ""
"对于标有 * 的参数,省略 -c 或 --cpu 参数是\n"
"相当于将其设置为零\n"
#: utils/cpufreq-info.c:580
#, c-format
msgid ""
"The argument passed to this tool can't be combined with passing a --cpu "
"argument\n"
msgstr "传递给此工具的参数不能与传递 --cpu 参数结合使用\n"
#: utils/cpufreq-info.c:596
#, c-format
msgid ""
"You can't specify more than one --cpu parameter and/or\n"
"more than one output-specific argument\n"
msgstr ""
"您不能指定多个 --cpu 参数和/或\n"
"多个特定于输出的参数\n"
#: utils/cpufreq-info.c:600 utils/cpufreq-set.c:82 utils/cpupower-set.c:42
#: utils/cpupower-info.c:42 utils/cpuidle-info.c:213
#, c-format
msgid "invalid or unknown argument\n"
msgstr "无效或未知的参数\n"
#: utils/cpufreq-info.c:617
#, c-format
msgid "couldn't analyze CPU %d as it doesn't seem to be present\n"
msgstr "无法分析 CPU %d因为它似乎不存在\n"
#: utils/cpufreq-info.c:620 utils/cpupower-info.c:142
#, c-format
msgid "analyzing CPU %d:\n"
msgstr "分析 CPU %d\n"
#: utils/cpufreq-set.c:25
#, c-format
msgid "Usage: cpupower frequency-set [options]\n"
msgstr "用法cpupower frequency-set [选项]\n"
#: utils/cpufreq-set.c:27
#, c-format
msgid ""
" -d FREQ, --min FREQ new minimum CPU frequency the governor may "
"select\n"
msgstr " -d FREQ, --min FREQ 调控器可以选择的新的最小 CPU 频率\n"
#: utils/cpufreq-set.c:28
#, c-format
msgid ""
" -u FREQ, --max FREQ new maximum CPU frequency the governor may "
"select\n"
msgstr " -u FREQ, --max FREQ 调控器可以选择的新的最大 CPU 频率\n"
#: utils/cpufreq-set.c:29
#, c-format
msgid " -g GOV, --governor GOV new cpufreq governor\n"
msgstr " -g GOV, --governor GOV 新的 cpufreq 调节器\n"
#: utils/cpufreq-set.c:30
#, c-format
msgid ""
" -f FREQ, --freq FREQ specific frequency to be set. Requires "
"userspace\n"
" governor to be available and loaded\n"
msgstr ""
" -f FREQ, --freq FREQ 要设置的特定频率。 需要用户空间\n"
" 调速器可用并已加载\n"
#: utils/cpufreq-set.c:32
#, c-format
msgid " -r, --related Switches all hardware-related CPUs\n"
msgstr " -r, --related 切换所有与硬件相关的CPU\n"
#: utils/cpufreq-set.c:33 utils/cpupower-set.c:28 utils/cpupower-info.c:27
#, c-format
msgid " -h, --help Prints out this screen\n"
msgstr " -h, --help 打印此屏幕\n"
#: utils/cpufreq-set.c:35
#, c-format
msgid ""
"Notes:\n"
"1. Omitting the -c or --cpu argument is equivalent to setting it to "
"\"all\"\n"
msgstr ""
"注意:\n"
"1.省略-c或--cpu参数相当于将其设置为“all”\n"
#: utils/cpufreq-set.c:37
#, c-format
msgid ""
"2. The -f FREQ, --freq FREQ parameter cannot be combined with any other "
"parameter\n"
" except the -c CPU, --cpu CPU parameter\n"
"3. FREQuencies can be passed in Hz, kHz (default), MHz, GHz, or THz\n"
" by postfixing the value with the wanted unit name, without any space\n"
" (FREQuency in kHz =^ Hz * 0.001 =^ MHz * 1000 =^ GHz * 1000000).\n"
msgstr ""
"2. -f FREQ、--freq FREQ参数不能与任何其他参数组合使用\n"
" 除了 -c CPU、--cpu CPU 参数\n"
"3. 频率可以以 Hz、kHz默认、MHz、GHz 或 THz 为单位传递\n"
" 通过在值后面添加所需的单位名称,不带任何空格\n"
" (以 kHz 为单位的频率 =^ Hz * 0.001 =^ MHz * 1000 =^ GHz * 1000000。\n"
#: utils/cpufreq-set.c:57
#, c-format
msgid ""
"Error setting new values. Common errors:\n"
"- Do you have proper administration rights? (super-user?)\n"
"- Is the governor you requested available and modprobed?\n"
"- Trying to set an invalid policy?\n"
"- Trying to set a specific frequency, but userspace governor is not "
"available,\n"
" for example because of hardware which cannot be set to a specific "
"frequency\n"
" or because the userspace governor isn't loaded?\n"
msgstr ""
"设置新值时出错。 常见错误:\n"
"- 您有适当的管理权吗? (超级用户?)\n"
"- 您请求的调控器是否可用并已进行 modprobed\n"
"- 尝试设置无效的策略?\n"
"- 尝试设置特定频率,但用户空间调控器不可用,\n"
" 例如由于硬件无法设置为特定频率\n"
" 或者因为用户空间调控器未加载?\n"
#: utils/cpufreq-set.c:170
#, c-format
msgid "wrong, unknown or unhandled CPU?\n"
msgstr "错误、未知或未处理的CPU\n"
#: utils/cpufreq-set.c:302
#, c-format
msgid ""
"the -f/--freq parameter cannot be combined with -d/--min, -u/--max or\n"
"-g/--governor parameters\n"
msgstr ""
"-f/--freq 参数不能与 -d/--min、-u/--max 或\n"
"-g/--调速器参数\n"
#: utils/cpufreq-set.c:308
#, c-format
msgid ""
"At least one parameter out of -f/--freq, -d/--min, -u/--max, and\n"
"-g/--governor must be passed\n"
msgstr ""
"-f/--freq、-d/--min、-u/--max 和 -f/--freq 中的至少一个参数\n"
"-g/--governor 必须通过\n"
#: utils/cpufreq-set.c:347
#, c-format
msgid "Setting cpu: %d\n"
msgstr "设置CPU%d\n"
#: utils/cpupower-set.c:22
#, c-format
msgid "Usage: cpupower set [ -b val ] [ -m val ] [ -s val ]\n"
msgstr "用法: cpupower set [ -b val ] [ -m val ] [ -s val ]\n"
#: utils/cpupower-set.c:24
#, c-format
msgid ""
" -b, --perf-bias [VAL] Sets CPU's power vs performance policy on some\n"
" Intel models [0-15], see manpage for details\n"
msgstr ""
" -b, --perf-bias [VAL] 设置 CPU 的功耗与性能策略\n"
" Intel 型号 [0-15]请参阅manpage了解详细信息\n"
#: utils/cpupower-set.c:26
#, c-format
msgid ""
" -m, --sched-mc [VAL] Sets the kernel's multi core scheduler policy.\n"
msgstr " -m, --sched-mc [VAL] 设置内核的多核调度程序策略。\n"
#: utils/cpupower-set.c:27
#, c-format
msgid ""
" -s, --sched-smt [VAL] Sets the kernel's thread sibling scheduler "
"policy.\n"
msgstr " -s, --sched-smt [VAL] 设置内核的线程同级调度程序策略。\n"
#: utils/cpupower-set.c:80
#, c-format
msgid "--perf-bias param out of range [0-%d]\n"
msgstr "--perf-bias 参数超出范围 [0-%d]\n"
#: utils/cpupower-set.c:91
#, c-format
msgid "--sched-mc param out of range [0-%d]\n"
msgstr "--sched-mc 参数超出范围 [0-%d]\n"
#: utils/cpupower-set.c:102
#, c-format
msgid "--sched-smt param out of range [0-%d]\n"
msgstr "--sched-smt 参数超出范围 [0-%d]\n"
#: utils/cpupower-set.c:121
#, c-format
msgid "Error setting sched-mc %s\n"
msgstr "设置 sched-mc %s 时出错\n"
#: utils/cpupower-set.c:127
#, c-format
msgid "Error setting sched-smt %s\n"
msgstr "设置 sched-smt %s 时出错\n"
#: utils/cpupower-set.c:146
#, c-format
msgid "Error setting perf-bias value on CPU %d\n"
msgstr "在 CPU %d 上设置性能偏差值时出错\n"
#: utils/cpupower-info.c:21
#, c-format
msgid "Usage: cpupower info [ -b ] [ -m ] [ -s ]\n"
msgstr "用法cpupower info [-b][-m][-s]\n"
#: utils/cpupower-info.c:23
#, c-format
msgid ""
" -b, --perf-bias Gets CPU's power vs performance policy on some\n"
" Intel models [0-15], see manpage for details\n"
msgstr ""
" -b, --perf-bias 获取 CPU 在某些方面的功耗与性能策略\n"
" Intel 型号 [0-15],请参阅联机帮助页了解详细信"
"息\n"
#: utils/cpupower-info.c:25
#, c-format
msgid " -m, --sched-mc Gets the kernel's multi core scheduler policy.\n"
msgstr " -m, --sched-mc 获取内核的多核调度程序策略。\n"
#: utils/cpupower-info.c:26
#, c-format
msgid ""
" -s, --sched-smt Gets the kernel's thread sibling scheduler policy.\n"
msgstr " -s, --sched-smt 获取内核的线程同级调度程序策略。\n"
#: utils/cpupower-info.c:28
#, c-format
msgid ""
"\n"
"Passing no option will show all info, by default only on core 0\n"
msgstr ""
"\n"
"不传递任何选项将显示所有信息,默认情况下仅在核心 0 上\n"
#: utils/cpupower-info.c:102
#, c-format
msgid "System's multi core scheduler setting: "
msgstr "系统的多核调度器设置:"
#. if sysfs file is missing it's: errno == ENOENT
#: utils/cpupower-info.c:105 utils/cpupower-info.c:114
#, c-format
msgid "not supported\n"
msgstr "不支持\n"
#: utils/cpupower-info.c:111
#, c-format
msgid "System's thread sibling scheduler setting: "
msgstr "系统的线程兄调度程序设置:"
#: utils/cpupower-info.c:126
#, c-format
msgid "Intel's performance bias setting needs root privileges\n"
msgstr "Intel的性能偏差设置需要root权限\n"
#: utils/cpupower-info.c:128
#, c-format
msgid "System does not support Intel's performance bias setting\n"
msgstr "系统不支持Intel的性能偏差设置\n"
#: utils/cpupower-info.c:147
#, c-format
msgid "Could not read perf-bias value\n"
msgstr "无法读取性能偏差值\n"
#: utils/cpupower-info.c:150
#, c-format
msgid "perf-bias: %d\n"
msgstr "性能偏差:%d\n"
#: utils/cpuidle-info.c:28
#, c-format
msgid "Analyzing CPU %d:\n"
msgstr "正在分析 CPU %d\n"
#: utils/cpuidle-info.c:32
#, c-format
msgid "CPU %u: No idle states\n"
msgstr "CPU %u无空闲状态\n"
#: utils/cpuidle-info.c:36
#, c-format
msgid "CPU %u: Can't read idle state info\n"
msgstr "CPU %u无法读取空闲状态信息\n"
#: utils/cpuidle-info.c:41
#, c-format
msgid "Could not determine max idle state %u\n"
msgstr "无法确定最大空闲状态 %u\n"
#: utils/cpuidle-info.c:46
#, c-format
msgid "Number of idle states: %d\n"
msgstr "空闲状态数:%d\n"
#: utils/cpuidle-info.c:48
#, c-format
msgid "Available idle states:"
msgstr "可用的空闲状态:"
#: utils/cpuidle-info.c:71
#, c-format
msgid "Flags/Description: %s\n"
msgstr "标志/描述:%s\n"
#: utils/cpuidle-info.c:74
#, c-format
msgid "Latency: %lu\n"
msgstr "延迟:%lu\n"
#: utils/cpuidle-info.c:76
#, c-format
msgid "Usage: %lu\n"
msgstr "用法:%lu\n"
#: utils/cpuidle-info.c:78
#, c-format
msgid "Duration: %llu\n"
msgstr "持续时间:%llu\n"
#: utils/cpuidle-info.c:90
#, c-format
msgid "Could not determine cpuidle driver\n"
msgstr "无法确定 cpuidle 驱动程序\n"
#: utils/cpuidle-info.c:94
#, c-format
msgid "CPUidle driver: %s\n"
msgstr "CPU 空闲驱动程序:%s\n"
#: utils/cpuidle-info.c:99
#, c-format
msgid "Could not determine cpuidle governor\n"
msgstr "无法确定 cpuidle 调控器\n"
#: utils/cpuidle-info.c:103
#, c-format
msgid "CPUidle governor: %s\n"
msgstr "CPU 空闲调节器:%s\n"
#: utils/cpuidle-info.c:122
#, c-format
msgid "CPU %u: Can't read C-state info\n"
msgstr "CPU %u无法读取 C 状态信息\n"
#. printf("Cstates: %d\n", cstates);
#: utils/cpuidle-info.c:127
#, c-format
msgid "active state: C0\n"
msgstr "活动状态: C0\n"
#: utils/cpuidle-info.c:128
#, c-format
msgid "max_cstate: C%u\n"
msgstr "最大c状态: C%u\n"
#: utils/cpuidle-info.c:129
#, c-format
msgid "maximum allowed latency: %lu usec\n"
msgstr "允许的最大延迟:%lu usec\n"
#: utils/cpuidle-info.c:130
#, c-format
msgid "states:\t\n"
msgstr "状态:\t\n"
#: utils/cpuidle-info.c:132
#, c-format
msgid " C%d: type[C%d] "
msgstr " C%d: 类型[C%d]"
#: utils/cpuidle-info.c:134
#, c-format
msgid "promotion[--] demotion[--] "
msgstr "晋升[--] 降级[--]"
#: utils/cpuidle-info.c:135
#, c-format
msgid "latency[%03lu] "
msgstr "延迟[%03lu]"
#: utils/cpuidle-info.c:137
#, c-format
msgid "usage[%08lu] "
msgstr "使用情况[%08lu]"
#: utils/cpuidle-info.c:139
#, c-format
msgid "duration[%020Lu] \n"
msgstr "持续时间[%020Lu]\n"
#: utils/cpuidle-info.c:147
#, c-format
msgid "Usage: cpupower idleinfo [options]\n"
msgstr "用法cpupower idleinfo [选项]\n"
#: utils/cpuidle-info.c:149
#, c-format
msgid " -s, --silent Only show general C-state information\n"
msgstr " -s, --silent 只显示一般C状态信息\n"
#: utils/cpuidle-info.c:150
#, c-format
msgid ""
" -o, --proc Prints out information like provided by the /proc/"
"acpi/processor/*/power\n"
" interface in older kernels\n"
msgstr ""
" -o, --proc 打印 /proc/acpi/processor/*/power 提供的信息\n"
" 旧内核中的接口\n"
#: utils/cpuidle-info.c:209
#, c-format
msgid "You can't specify more than one output-specific argument\n"
msgstr "您不能指定多个特定于输出的参数\n"
#~ msgid ""
#~ " -c CPU, --cpu CPU CPU number which information shall be determined "
#~ "about\n"
#~ msgstr ""
#~ " -c CPU, --cpu CPU Numéro du CPU pour lequel l'information sera "
#~ "affichée\n"
#~ msgid ""
#~ " -c CPU, --cpu CPU number of CPU where cpufreq settings shall be "
#~ "modified\n"
#~ msgstr ""
#~ " -c CPU, --cpu CPU numéro du CPU à prendre en compte pour les\n"
#~ " changements\n"

View File

@ -81,6 +81,9 @@ as resume failures.
.TP .TP
\fB-wifitrace\fR \fB-wifitrace\fR
Trace through the wifi reconnect time and include it in the timeline. Trace through the wifi reconnect time and include it in the timeline.
.TP
\fB-debugtiming\fR
Add timestamp to each printed output line, accurate to the millisecond.
.SS "advanced" .SS "advanced"
.TP .TP

View File

@ -18,7 +18,7 @@
# #
# Links: # Links:
# Home Page # Home Page
# https://01.org/pm-graph # https://www.intel.com/content/www/us/en/developer/topic-technology/open/pm-graph/overview.html
# Source repo # Source repo
# git@github.com:intel/pm-graph # git@github.com:intel/pm-graph
# #
@ -65,6 +65,7 @@ import gzip
from threading import Thread from threading import Thread
from subprocess import call, Popen, PIPE from subprocess import call, Popen, PIPE
import base64 import base64
import traceback
debugtiming = False debugtiming = False
mystarttime = time.time() mystarttime = time.time()
@ -86,7 +87,7 @@ def ascii(text):
# store system values and test parameters # store system values and test parameters
class SystemValues: class SystemValues:
title = 'SleepGraph' title = 'SleepGraph'
version = '5.12' version = '5.13'
ansi = False ansi = False
rs = 0 rs = 0
display = '' display = ''
@ -236,7 +237,11 @@ class SystemValues:
'msleep': { 'args_x86_64': {'time':'%di:s32'}, 'ub': 1 }, 'msleep': { 'args_x86_64': {'time':'%di:s32'}, 'ub': 1 },
'schedule_timeout': { 'args_x86_64': {'timeout':'%di:s32'}, 'ub': 1 }, 'schedule_timeout': { 'args_x86_64': {'timeout':'%di:s32'}, 'ub': 1 },
'udelay': { 'func':'__const_udelay', 'args_x86_64': {'loops':'%di:s32'}, 'ub': 1 }, 'udelay': { 'func':'__const_udelay', 'args_x86_64': {'loops':'%di:s32'}, 'ub': 1 },
'usleep_range': { 'args_x86_64': {'min':'%di:s32', 'max':'%si:s32'}, 'ub': 1 }, 'usleep_range': {
'func':'usleep_range_state',
'args_x86_64': {'min':'%di:s32', 'max':'%si:s32'},
'ub': 1
},
'mutex_lock_slowpath': { 'func':'__mutex_lock_slowpath', 'ub': 1 }, 'mutex_lock_slowpath': { 'func':'__mutex_lock_slowpath', 'ub': 1 },
'acpi_os_stall': {'ub': 1}, 'acpi_os_stall': {'ub': 1},
'rt_mutex_slowlock': {'ub': 1}, 'rt_mutex_slowlock': {'ub': 1},
@ -342,15 +347,21 @@ class SystemValues:
if self.verbose or msg.startswith('WARNING:'): if self.verbose or msg.startswith('WARNING:'):
pprint(msg) pprint(msg)
def signalHandler(self, signum, frame): def signalHandler(self, signum, frame):
if not self.result:
return
signame = self.signames[signum] if signum in self.signames else 'UNKNOWN' signame = self.signames[signum] if signum in self.signames else 'UNKNOWN'
msg = 'Signal %s caused a tool exit, line %d' % (signame, frame.f_lineno) if signame in ['SIGUSR1', 'SIGUSR2', 'SIGSEGV']:
traceback.print_stack()
stack = traceback.format_list(traceback.extract_stack())
self.outputResult({'stack':stack})
if signame == 'SIGUSR1':
return
msg = '%s caused a tool exit, line %d' % (signame, frame.f_lineno)
pprint(msg)
self.outputResult({'error':msg}) self.outputResult({'error':msg})
os.kill(os.getpid(), signal.SIGKILL)
sys.exit(3) sys.exit(3)
def signalHandlerInit(self): def signalHandlerInit(self):
capture = ['BUS', 'SYS', 'XCPU', 'XFSZ', 'PWR', 'HUP', 'INT', 'QUIT', capture = ['BUS', 'SYS', 'XCPU', 'XFSZ', 'PWR', 'HUP', 'INT', 'QUIT',
'ILL', 'ABRT', 'FPE', 'SEGV', 'TERM'] 'ILL', 'ABRT', 'FPE', 'SEGV', 'TERM', 'USR1', 'USR2']
self.signames = dict() self.signames = dict()
for i in capture: for i in capture:
s = 'SIG'+i s = 'SIG'+i
@ -859,6 +870,11 @@ class SystemValues:
# files needed for any trace data # files needed for any trace data
files = ['buffer_size_kb', 'current_tracer', 'trace', 'trace_clock', files = ['buffer_size_kb', 'current_tracer', 'trace', 'trace_clock',
'trace_marker', 'trace_options', 'tracing_on'] 'trace_marker', 'trace_options', 'tracing_on']
# legacy check for old systems
if not os.path.exists(self.tpath+'trace'):
self.tpath = '/sys/kernel/debug/tracing/'
if not os.path.exists(self.epath):
self.epath = '/sys/kernel/debug/tracing/events/power/'
# files needed for callgraph trace data # files needed for callgraph trace data
tp = self.tpath tp = self.tpath
if(self.usecallgraph): if(self.usecallgraph):
@ -911,6 +927,13 @@ class SystemValues:
if num > 0: if num > 0:
n = '%d' % num n = '%d' % num
fp = open(self.result, 'a') fp = open(self.result, 'a')
if 'stack' in testdata:
fp.write('Printing stack trace:\n')
for line in testdata['stack']:
fp.write(line)
fp.close()
self.sudoUserchown(self.result)
return
if 'error' in testdata: if 'error' in testdata:
fp.write('result%s: fail\n' % n) fp.write('result%s: fail\n' % n)
fp.write('error%s: %s\n' % (n, testdata['error'])) fp.write('error%s: %s\n' % (n, testdata['error']))
@ -1980,7 +2003,7 @@ class Data:
length = -1.0 length = -1.0
if(start >= 0 and end >= 0): if(start >= 0 and end >= 0):
length = end - start length = end - start
if pid == -2 or name not in sysvals.tracefuncs.keys(): if pid >= -2:
i = 2 i = 2
origname = name origname = name
while(name in list): while(name in list):
@ -2753,7 +2776,8 @@ class Timeline:
def createHeader(self, sv, stamp): def createHeader(self, sv, stamp):
if(not stamp['time']): if(not stamp['time']):
return return
self.html += '<div class="version"><a href="https://01.org/pm-graph">%s v%s</a></div>' \ self.html += '<div class="version"><a href="https://www.intel.com/content/www/'+\
'us/en/developer/topic-technology/open/pm-graph/overview.html">%s v%s</a></div>' \
% (sv.title, sv.version) % (sv.title, sv.version)
if sv.logmsg and sv.testlog: if sv.logmsg and sv.testlog:
self.html += '<button id="showtest" class="logbtn btnfmt">log</button>' self.html += '<button id="showtest" class="logbtn btnfmt">log</button>'
@ -5238,12 +5262,16 @@ def addScriptCode(hf, testruns):
} }
var info = dev[i].title.split(" "); var info = dev[i].title.split(" ");
var pname = info[info.length-1]; var pname = info[info.length-1];
pd[pname] = parseFloat(info[info.length-3].slice(1)); var length = parseFloat(info[info.length-3].slice(1));
total[0] += pd[pname]; if (pname in pd)
if(pname.indexOf("suspend") >= 0) pd[pname] += length;
total[tidx] += pd[pname];
else else
total[tidx+1] += pd[pname]; pd[pname] = length;
total[0] += length;
if(pname.indexOf("suspend") >= 0)
total[tidx] += length;
else
total[tidx+1] += length;
} }
} }
var devname = deviceTitle(this.title, total, cpu); var devname = deviceTitle(this.title, total, cpu);
@ -5262,7 +5290,7 @@ def addScriptCode(hf, testruns):
phases[i].style.left = left+"%"; phases[i].style.left = left+"%";
phases[i].title = phases[i].id+" "+pd[phases[i].id]+" ms"; phases[i].title = phases[i].id+" "+pd[phases[i].id]+" ms";
left += w; left += w;
var time = "<t4 style=\"font-size:"+fs+"px\">"+pd[phases[i].id]+" ms<br></t4>"; var time = "<t4 style=\"font-size:"+fs+"px\">"+pd[phases[i].id].toFixed(3)+" ms<br></t4>";
var pname = "<t3 style=\"font-size:"+fs2+"px\">"+phases[i].id.replace(new RegExp("_", "g"), " ")+"</t3>"; var pname = "<t3 style=\"font-size:"+fs2+"px\">"+phases[i].id.replace(new RegExp("_", "g"), " ")+"</t3>";
phases[i].innerHTML = time+pname; phases[i].innerHTML = time+pname;
} else { } else {
@ -6742,6 +6770,7 @@ def printHelp():
' -wifi If a wifi connection is available, check that it reconnects after resume.\n'\ ' -wifi If a wifi connection is available, check that it reconnects after resume.\n'\
' -wifitrace Trace kernel execution through wifi reconnect.\n'\ ' -wifitrace Trace kernel execution through wifi reconnect.\n'\
' -netfix Use netfix to reset the network in the event it fails to resume.\n'\ ' -netfix Use netfix to reset the network in the event it fails to resume.\n'\
' -debugtiming Add timestamp to each printed line\n'\
' [testprep]\n'\ ' [testprep]\n'\
' -sync Sync the filesystems before starting the test\n'\ ' -sync Sync the filesystems before starting the test\n'\
' -rs on/off Enable/disable runtime suspend for all devices, restore all after test\n'\ ' -rs on/off Enable/disable runtime suspend for all devices, restore all after test\n'\
@ -7047,7 +7076,6 @@ if __name__ == '__main__':
except: except:
doError('No result file supplied', True) doError('No result file supplied', True)
sysvals.result = val sysvals.result = val
sysvals.signalHandlerInit()
else: else:
doError('Invalid argument: '+arg, True) doError('Invalid argument: '+arg, True)
@ -7057,6 +7085,7 @@ if __name__ == '__main__':
if(sysvals.usecallgraph and sysvals.useprocmon): if(sysvals.usecallgraph and sysvals.useprocmon):
doError('-proc is not compatible with -f') doError('-proc is not compatible with -f')
sysvals.signalHandlerInit()
if sysvals.usecallgraph and sysvals.cgskip: if sysvals.usecallgraph and sysvals.cgskip:
sysvals.vprint('Using cgskip file: %s' % sysvals.cgskip) sysvals.vprint('Using cgskip file: %s' % sysvals.cgskip)
sysvals.setCallgraphBlacklist(sysvals.cgskip) sysvals.setCallgraphBlacklist(sysvals.cgskip)