当前位置: 首页 > news >正文

linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程

一、suspending consoles打印

代码位置:Kernel/power/suspend.c

函数调用流程:devices_and_enter(suspend_state_t state)  --> suspend_console();

void suspend_console(void)

{

if (!console_suspend_enabled)   注释这一行,可以看到休眠后printk的打印

    return;

printk("Suspending console(s) (use no_console_suspend to debug)\n");

console_lock();

console_suspended = 1;

up(&console_sem);

}

 

二、打印linux 内核 bus总线休眠唤醒流程

代码位置:Kernel/drivers/base/power/main.c

dpm_suspend() --> device_suspend() --> __device_suspend()

修改位置:

static void pm_dev_dbg(struct device *dev, pm_message_t state, char *info)
{dev_printk(KERN_ERR,dev, "%s%s%s\n", info, pm_verb(state.event),((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ?", may wakeup" : "");
}

内核 log如下:

bus suspend:

[  329.576315] reg-fixed-voltage soc:emac_lan_vreg: bus suspend
[  329.581997] reg-fixed-voltage soc:rome_vreg: bus suspend
[  329.587245] reg-fixed-voltage soc:sdcard_ext_vreg: bus suspend
[  329.593177] qcom,mem-acc-regulator 1942131.regulator: bus suspend
[  329.599144] pps-gpio soc:pps: bus suspend
[  329.603183] platform 7c50000.qcom,emac: bus suspend

 

bus resume:

[  331.355074] msm_serial_hs 98b1000.uart: noirq driver resume
[  331.361022] PM: noirq resume of devices complete after 17.017 msecs
[  331.367635] PM: early resume of devices complete after 0.543 msecs
[  331.372985] reg-dummy reg-dummy: bus resume

三、设备休眠唤醒流程打印

代码位置:driver/base/platform.c

3.1 linux设备休眠流程:

int platform_pm_suspend(struct device *dev)
{
struct device_driver *drv = dev->driver;
int ret = 0;
...
...if (drv->pm) {
if (drv->pm->suspend)
ret = drv->pm->suspend(dev);
+pr_info("%s called name = %s\n", __func__, drv->name); //此处添加suspend 设备调试打印
} else {
ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
}

3.2 linux设备唤醒流程

int platform_pm_resume(struct device *dev)
{
struct device_driver *drv = dev->driver;
int ret = 0;...
...if (drv->pm) {
if (drv->pm->resume)
ret = drv->pm->resume(dev);
pr_info("%s called name = %s\n", __func__, drv->name);//此处添加设备resume打印
} else {
ret = platform_legacy_resume(dev);
}

四、linux内核线程和进程休眠过程打印

函数调用流程:

enter_state(suspend.c)--->suspend_prepare--->suspend_freeze_processes()--->freeze_processes(--->try_to_freeze_tasks--->freeze_task)--->freeze_kernel_processes

可以在kernel/power/process.c中添加如下打印:

for_each_process_thread(g,p)...pr_info("userspace pid %d, %d\n", p->pid, current->pid);...

打印效果如下:

[  327.812216] PM: suspend entry 2018-09-18 11:53:17.879150194 UTC
[  327.817117] PM: Syncing filesystems ... done.
[  327.823632] Freezing user space processes ... userspace pid 1
[  327.828524] userspace pid 6
[  327.831545] userspace pid 124
[  327.834264] userspace pid 1345
[  327.837216] userspace pid 2150

对于内核线程休眠的打印可以参考上面在freeze_kernel_processes中添加打印。

五、late_resume和earlysuspend.c加打印

在部分内核版本中可以添加如下log分析问题:

late_resume函数中:

list_for_each_entry_reverse(pos, &early_suspend_handlers, link)
if (pos->resume != NULL) {
pos->resume(pos);
+pr_info("late_resume: func %p\n",pos->resume);

}

early_suspend late_resume添加log
在earlysuspend.c中
static int debug_mask = DEBUG_USER_STATE;
->
static int debug_mask = DEBUG_USER_STATE | DEBUG_SUSPEND |
DEBUG_VERBOSE;

六、休眠唤醒时间长问题排查

参见之前调试文档说明,链接如下:

休眠唤醒(suspend/resume)时长问题分析思路_sched_clock_suspend-CSDN博客

 

 

 

 

 

 

相关文章:

  • arkts中@Watch监听的使用
  • [年终总结]人生就是大闹一场
  • 为什么不应该在 SAN/NAS 设备上运行 MinIO(还有一个例外)
  • 【机器学习】人工智能概述
  • Mysql 高级语句
  • P5729 【深基5.例7】工艺品制作题解
  • 数据资源将被视为资产 明天起纳入财务报表
  • 防火墙双机热备配置步骤
  • ubuntu22.04 安装jdk8,jdk11,jdk17,jdk21 并且便于切换
  • Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性
  • 继续声明 | 连声明都抄,谁抄袭谁,一目了然,现在竟然恬不知耻的反咬一口。
  • c语言实现得到某数的某方(n^k)的值
  • IntelliJ IDEA Apache Dubbo,IDEA 官方插件正式发布!
  • C语言之整型提升
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • Google 是如何开发 Web 框架的
  • .pyc 想到的一些问题
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译]Python中的类属性与实例属性的区别
  • 345-反转字符串中的元音字母
  • C++入门教程(10):for 语句
  • Django 博客开发教程 16 - 统计文章阅读量
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • interface和setter,getter
  • Java方法详解
  • maven工程打包jar以及java jar命令的classpath使用
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • vue-router 实现分析
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 我的面试准备过程--容器(更新中)
  • 一个完整Java Web项目背后的密码
  • 再谈express与koa的对比
  • 自定义函数
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #define,static,const,三种常量的区别
  • (第二周)效能测试
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (接口封装)
  • (十六)一篇文章学会Java的常用API
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Unity3DUnity3D在android下调试
  • (转载)Google Chrome调试JS
  • .NET : 在VS2008中计算代码度量值
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net mvc部分视图
  • .net连接MySQL的方法
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [20170728]oracle保留字.txt
  • [android] 天气app布局练习