首页 > 系统相关 >Linux PM:wakeup count、wakelock、autosleep

Linux PM:wakeup count、wakelock、autosleep

时间:2024-06-15 19:45:31浏览次数:27  
标签:count -- Linux sys wakelock autosleep wakeup pm

 在进行wakeup count、wakelock、autosleep之前,先参考《Linux电源管理(7)_Wakeup events framework (wowotech.net)》。

下面简单跟一下,wakeup count、wakelock、autosleep,及其使用方法。

1 PM初始化

PM子系统初始化:

pm_init
  pm_start_workqueue
  hibernate_image_size_init
  hibernate_reserved_size_init
  pm_states_init
  kobject_create_and_add--创建/sys/power目录。
  sys_create_groups--在/sys/power下创建一系列属性。
  pm_print_times_init
  pm_autosleep_init
    wakeup_source_register--创建名为autosleep的wakeup source,在autosleep关键路径时,阻止系统睡眠。
    alloc_ordered_workqueue--创建名为autosleep的有序workqueue,用于触发休眠动作。

PM suspend调试统计节点:

pm_debugfs_init
    debugfs_create_file--创建suspend_stats节点。

查看/sys/kernel/debug/suspend_stats:

success: 1
fail: 0
failed_freeze: 0
failed_prepare: 0
failed_suspend: 0
failed_suspend_late: 0
failed_suspend_noirq: 0
failed_resume: 0
failed_resume_early: 0
failed_resume_noirq: 0
failures:
  last_failed_dev:

  last_failed_errno:    0
                        0
  last_failed_step:

2 wakeup_count

关于wakeup_count参考《Linux电源管理(8)_Wakeup count功能 (wowotech.net)》。

获取wakeup_count:

cat  /sys/power/wakeup_count

写入wakeup_count:

echo <count> > /sys/power/wakeup_count

如果写入的count和实际的wakeup_count不一致,则返回错误。

如果一致,说明可以操作/sys/power/state进行低功耗流程。

3 wakelock

关于wakelock参考《Linux电源管理(9)_wakelocks (wowotech.net)》。

3.1 wakelock使用方法

获取一个wakelock:

echo <lockname> > /sys/power/wake_lock

获取一个带超时的wakelock,超时后wakelock自动消失。时间单位是ns:

echo <lockname> <duration> > /sys/power/wake_unlock

查看当前生效的wakelock:

cat /sys/power/wake_lock

释放一个wakelock:

echo <lockname> > /sys/power/wake_unlock

查看非活跃wakelock:

cat /sys/power/wake_unlock

3.2 wakelock代码流程

wakelock获取代码流程:

wake_lock_show
  pm_show_wakelocks--遍历wakelocks_tree,输出活跃的wakelock名称。
wake_lock_store
  pm_wake_lock
    ->解析wakelock名称,以及是否有超时参数。
    ->wakelock_lookup_add--查找并添加wakelock。
    ->__pm_wakeup_event/__pm_stay_awake--保持唤醒一段时间,或者一直保持唤醒。
    ->wakelocks_lru_most_recent--加入wakelocks_lru_list。

wakelock释放代码流程:

wake_unlock_show
  pm_show_wakelocks--遍历wakelocks_tree,输出非活跃wakelock名称。
wake_unlock_store
  pm_wake_unlock
    wakelock_lookup_add--查找,如果没找到不添加wakelock。
    __pm_relax--找到wakelock后则释放。
    wakelocks_lru_most_recent
    wakelocks_gc--当释放wakelock时,不是立即销毁相关数据。而是启动一个work,保留last_time之后的WL_GC_TIME_SEC秒时间,默认为300秒。
      schedule_work--调度wakelock_work。
        __wakelocks_gc
          wakeup_source_unregister--对于非active,并且在last_time超过WL_GC_TIME_SEC时间后开始回收资源。
          rb_erase--从wakelocks_tree移除节点。

4 autosleep

关于autosleep参考《Linux电源管理(10)_autosleep (wowotech.net)》。

4.1 autosleep使用方法

对/sys/power/autosleep写入,触发sleep:

echo mem > /sys/power/autosleep

可能的值包括:freeze、standby、mem、disk、off。

4.2 autosleep代码流程

autosleep流程如下:

autosleep_show
  pm_autosleep_state--获取autosleep_state值,根据状态从pm_states[]获取字符串。 autosleep_store decode_state--根据字符串匹配对应的state。 pm_autosleep_set_state     __pm_stay_awake--获取autosleep wakesource。
    __pm_relax--释放autosleep wakesource。
    pm_wakeup_autosleep_enabled
    queue_up_suspend_work
      queue_work--将suspend_work放到autosleep_wq上。
        try_to_suspend--根据autosleep_state进入hibernate或者suspemd。
          hibernate
          pm_suspend
          queue_up_suspend_work--再次进行suspend队列。

 

标签:count,--,Linux,sys,wakelock,autosleep,wakeup,pm
From: https://www.cnblogs.com/arnoldlu/p/18244679

相关文章

  • Linux:vim
    目录1、vim简单介绍2、vim使用2.1、进入vim2.2、模式切换2.3、常用命令2.3.1、进出vim2.3.2、定位2.3.3、查找字符串:2.3.4、替换字符串2.3.5、复制粘贴2.3.6、撤销1、vim简单介绍超强的文本编辑器,在Linux中编写代码比较常用,可以根据不同的语言提供高亮,类似notepad+......
  • Linux 虚拟网络 host gw
    hostgw把host作为网关,通过网关进行数据包传输。使用Containerlab模拟网络a|拓扑b|网络拓扑文件#host-gw.clab.ymlname:host-gwtopology:nodes:gw1:kind:linuximage:vyos/vyos:1.2.8cmd:/sbin/initbinds:-/......
  • Linux下Nginx安装并开启SSL
    Linux下Nginx安装并开启SSL一.下载nginxNginxdownload下载后上传至服务器。PS:博主使用的Nginx版本为:nginx-1.23.4.tar.gz二.安装Nginx所需要的环境1.安装gcc-c++yuminstallgcc-c++yuminstall-yopensslopenssl-devel2.安装pcre包yuminstall-ypcrepcre......
  • Linux文件系统【真的很详细】
    目录 一.认识磁盘1.1磁盘的物理结构1.2磁盘的存储结构1.3磁盘的逻辑存储结构二.理解文件系统 2.1如何管理磁盘2.2如何在磁盘中找到文件 2.3关于文件名哈喽,大家好。今天我们学习文件系统,我们之前在Linux基础IO中研究的是进程和被打开文件之间的关系,以及如何管理被......
  • Linux项目部署套餐
    第一步准备工作创建一个目录用于存放要用到的工具并上传所需要用到的文件#下载上传需要用到的工具yuminstalllrzsz#创建目录mkdir-p/usr/local/mytools#进入mytools目录下cd/usr/local/mytools#上传可一次性上传jdk,mysql,tomcat,redis压缩包rz第二步安装jd......
  • Linux下Java环境安装
    Linux下open-jdk1.8安装教程一.下载安装包Javadownload下载后上传到服务器二.安装1.解压安装包tar-zxvfjdk-8u341-linux-x64.tar.gz2.配置环境变量在/etc/profile文件中,新增Java的环境变量vi/etc/profileexportJAVA_HOME=/usr/local/jdk/jdk1.8.0_341export......
  • 【Linux】生产者消费者模型——阻塞队列BlockQueue
    >作者:დ旧言~>座右铭:松树千年终是朽,槿花一日自为荣。>目标:理解【Linux】生产者消费者模型——阻塞队列BlockQueue。>毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!>专栏选自:Linux初阶>望小伙伴们点赞......
  • Linux下Redis安装教程
    Linux下Redis安装教程一.下载Redis安装包官网下载地址:Redisdownloads推荐下载redis-7.0.0.tar.gz教程是以这个版本安装的二.安装1.下载Redis环境支持#安装GCC,Redis是基于C语言开发的,需要GCC支持yuminstallgcc-c++2.上传至服务器上传工具可以使用XFTPXFTP......
  • Linux Shell基础命令
    pwd功能:显示当前目录的绝对地址cd功能:切换目录绝对路径:以/为起点,遍历到子目录相对路径:以当前目录为起点,遍历到子目录常用目录:.当前目录..上层目录-上次操作所在路径~相当于/home/用户名的路径示例用途:cd/home/linux/Desktop#绝对路径的用法cd/home/......
  • 006-使用buildroot构建一个完整的Linux操作系统
    原文:https://www.bilibili.com/read/cv31634226/实验介绍 之前的实验中介绍了如何使用buildroot构建一个易于使用的完整文件系统,但是buildroot的功能不止于此。 本实验准备使用buildroot构建一个完整的Linux操作系统。 本实验还会将编译好的固件烧录到U盘中,然后在......