Wakelocks 框架设计与实现
Wakelocks 框架是基于 Wakeup Source 实现的为 Android 系统上层提供投票机制,以阻止系统进入休眠。
1.功能说明
该模块的支持受宏CONFIG_PM_WAKELOCKS
控制。在使能该宏的情况下,PM Core 初始化过程中会在 sysfs 下创建两个属性节点:/sys/power/wake_lock
:用户程序可以向其写入一个字符串来创建一个 wakelock,该字符创即为 wakelock 的名字,该 wakelock 可阻止系统进入低功耗模式/sys/power/wake_unlock
:用户程序向其写入相同的字符串,即可注销该 wakelock
配置宏CONFIG_PM_WAKELOCKS_LIMIT
可以限制系统所能创建的 wakelock 的数量。使能宏CONFIG_PM_WAKELOCKS_GC
能打开 wakelock 的回收机制,使得 wakelock 在积累一定的数量后再去清除(释放空间),从而不需要在每次释放 wakelock 时都去清除。
2.主要数据结构和接口
2.1 wakelock
结构体
2.2 模块重要变量
2.3 主要接口
2.3.1 pm_wake_lock()
接口
该接口是在向/sys/power/wake_lock
写入字符串时调用,主要实现:
查找同名 wakelock,找不到时创建 wakelock,并持(超时)锁
配置
CONFIG_PM_WAKELOCKS_LIMIT > 0
的情况下,对 wakelock 数量计数并限制将该 wakelock 移到回收链表前端,以防被优先回收
2.3.2 pm_wake_unlock()
接口
该接口是在向/sys/power/wake_unlock
写入字符串时调用,主要实现:
查找同名 wakelock,找不到时返回错误
配置
CONFIG_PM_WAKELOCKS_GC
开启回收机制的情况下,对 wakelock 数量计数并在超过上限时触发回收处理 work
2.3.3 __wakelocks_gc()
回收处理 work
该接口在已解锁的 wakelock 数量超过上限WL_GC_COUNT_MAX(100)
时调用,用于处理回收已创建的 wakelock,释放空间。
使能回收机制的好处是:1.上层频繁操作 wakelock 时,不用每次 unlock 时都耗时去释放资源;2.如果频繁操作的是同一个 wakelock,也不用反复创建/释放资源。
3. 工作时序
wakelock 的工作时序如下:1)应用程序在处理数据前不希望系统进入休眠状态,通过向/sys/power/wake_lock
写入一个字符串作为 wakelock 名字,此时pm_wake_lock()
被调用 2)在pm_wake_lock()
里,会查找是否已存在同名 wakelock,已存在则持锁,不存在则创建锁并持锁 3)应用程序在处理完数据后允许系统进入休眠状态时,通过向/sys/power/wake_unlock
写入已持锁的 wakelock 名字,此时pm_wake_unlock()
被调用 4)在pm_wake_unlock()
里,会查找是否已存在同名 wakelock,并释放该锁,同时判断此时是否要触发 wakelock 的回收机制 5)当 wakelock 回收链表里的 wakelock 数量达到上限后,触发 wakelock 的回收机制,将长时间未使用且已经解锁的 wakelock 注销,释放资源
关于 wakelock 的发展变化以及使用,强烈建议拜读:http://www.wowotech.net/pm_subsystem/wakelocks.html注:此源码分析基于 kernel-5.10。
文章转载自:Jayfan_Ma
评论