子系统跟踪点:电源

电源跟踪系统捕获内核中与电源转换相关的事件。 概括来说,主要有三个小标题

  • 电源状态切换,它报告与挂起(S 状态)、cpuidle(C 状态)和 cpufreq(P 状态)相关的事件

  • 系统时钟相关的更改

  • 电源域相关的更改和转换

本文档描述了每个跟踪点是什么以及它们为什么可能有用。

请参阅 include/trace/events/power.h 获取事件定义。

1. 电源状态切换事件

1.1 跟踪 API

“cpu”事件类收集与 CPU 相关的事件:cpuidle 和 cpufreq。

cpu_idle              "state=%lu cpu_id=%lu"
cpu_frequency         "state=%lu cpu_id=%lu"
cpu_frequency_limits  "min=%lu max=%lu cpu_id=%lu"

挂起事件用于指示系统进入和退出挂起模式

machine_suspend               "state=%lu"

注意:状态“-1”或“4294967295”的值表示退出当前状态,即 trace_cpu_idle(4, smp_processor_id()) 表示系统进入空闲状态 4,而 trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()) 表示系统退出之前的空闲状态。

跟踪中“state=4294967295”的事件对于使用它的用户空间工具非常重要,它可以检测当前状态的结束,从而正确绘制状态图并计算准确的统计数据等。

2. 时钟事件

时钟事件用于时钟启用/禁用以及时钟速率更改。

clock_enable          "%s state=%lu cpu_id=%lu"
clock_disable         "%s state=%lu cpu_id=%lu"
clock_set_rate                "%s state=%lu cpu_id=%lu"

第一个参数给出时钟名称(例如“gpio1_iclk”)。 第二个参数对于启用为“1”,禁用为“0”,对于 set_rate 为目标时钟速率。

3. 电源域事件

电源域事件用于电源域转换

power_domain_target   "%s state=%lu cpu_id=%lu"

第一个参数给出电源域名(例如“mpu_pwrdm”)。 第二个参数是电源域目标状态。

4. PM QoS 事件

PM QoS 事件用于 QoS 添加/更新/删除请求以及目标/标志更新。

pm_qos_update_target               "action=%s prev_value=%d curr_value=%d"
pm_qos_update_flags                "action=%s prev_value=0x%x curr_value=0x%x"

第一个参数给出 QoS 操作名称(例如“ADD_REQ”)。 第二个参数是之前的 QoS 值。 第三个参数是要更新的当前 QoS 值。

还有用于设备 PM QoS 添加/更新/删除请求的事件。

dev_pm_qos_add_request             "device=%s type=%s new_value=%d"
dev_pm_qos_update_request          "device=%s type=%s new_value=%d"
dev_pm_qos_remove_request          "device=%s type=%s new_value=%d"

第一个参数给出尝试添加/更新/删除 QoS 请求的设备名称。 第二个参数给出请求类型(例如“DEV_PM_QOS_RESUME_LATENCY”)。 第三个参数是要添加/更新/删除的值。

并且,还有用于 CPU 延迟 QoS 添加/更新/删除请求的事件。

pm_qos_add_request        "value=%d"
pm_qos_update_request     "value=%d"
pm_qos_remove_request     "value=%d"

参数是要添加/更新/删除的值。