基于MTK Linux-5.10
一、相关文件接口
1. parameters文件接口
/sys/module/mtk_core_ctl/parameters # ls -l -rw------- 1 root root debug_enable //控制 core_ctl.c 中 core_ctl_debug() 的打印,TAG为"core_ctl" -rw-rw---- 1 system system policy_enable
(1) debug_enable
默认为false, 控制 core_ctl.c 中 core_ctl_debug() 的打印,TAG为"core_ctl"
(2) policy_enable
默认为false, 从 demand_eval() 来看,若 policy_enable 文件没有使能的话,那么 need_cpus 直接取 cluster->max_cpus,此时cpu核的isolate/ioslate只受用户空间通过core_ctl下面的文件节点和是否boost进行设置了。
2. core_ctl文件接口
/sys/devices/system/cpu/cpu0/core_ctl # ls -l -rw------- 1 root root core_ctl_boost -rw------- 1 root root enable -r-------- 1 root root global_state -rw-rw-r-- 1 root root max_cpus -rw-rw-r-- 1 root root min_cpus -rw------- 1 root root not_preferred -rw------- 1 root root offline_throttle_ms -r-------- 1 root root ppm_state //显示一个表 -r-------- 1 root root thermal_up_thres -rw------- 1 root root up_thres
(1) core_ctl_boost
对应 cluster_data::boost 成员,默认是false,设置为1是对所有cluster进行boost,在 demand_eval() 中判断,若是boot状态的话,need_cpus 直接取 cluster->max_cpus,也就是不再执行实际的isolate动作了,若是有isolate的cpu,需要unisolate。
(2) enable
对应 cluster_data::enable 成员,默认是true,在 demand_eval() 中判断,若是没有enable的话,need_cpus 直接取 cluster->max_cpus,也就是不再执行实际的isolate动作了,若是有isolate的cpu,需要unisolate。
(3) global_state
打印cluster中cpu的Active cpu个数,Need cpu个数,Paused cpu个数,以及cluster内各个cpu的 oneline、pause、busy、prefer 状态,见下面cat的内容。
(4) max_cpus
对应 cluster_data::max_cpus 成员,线程do_core_ctl()中在执行实际isolate/unisolate之前会先执行 apply_limits(cluster, cluster->need_cpus) 将 need_cpus 钳制在 cluster->min_cpus 和 cluster->max_cpus 之间,也就是说默认逻辑会尊重用户空间对cpu核数的限制,用户空间的限制优先级最高,高于 core_ctl_tick() 执行逻辑中预估的核数。但是通过 eas_ioctl 文件设置下来的不在尊重用户空间对cpu的限制了。
(5) min_cpus
对应 cluster_data::min_cpus 成员,各个cluster默认取值default_min_cpus[MAX_CLUSTERS] = {4, 2, 0}。设置后立即唤醒"core_ctl_v2/X"线程执行isolate/unisolate操作。
(6) not_preferred
对应 cluster_data::not_preferred 成员,如果标记了某些CPU是not_preferred,那么在 try_to_pause() 中 isolate CPU的时候就会优先isolate这些not_preferred的CPU,若是not_preferred的CPU都已经isolated了还没达到 active_cpus == need 这个条件,那么就继续isolate没有被标记为not_preferred的CPU。