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博客

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级依赖管理: 深入解读 Maven BOM

一、背景 当开发者在一个大型项目中使用 Maven 进行依赖管理时,项目往往会包含多个模块或子项目,并且这些模块会共享相同的依赖项。但是,不同模块可能会独立地指定各自的依赖版本,这可能导致以下问题: 依赖版本不一致…

头歌:实验十六 matplotlib数据可视化

第1关 各省gdp的和生成条状图 import pandas import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt matplotlib.rcParams[font.family]SimHei matplotlib.rcParams[font.sans-serif] [SimHei] datapandas.read_excel("test/各省GDP.xlsx",dtype…

在多Module项目中,给IDEA底部选项卡区域添加Services选项卡

一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时,如果要调试测需要依次启动各个项目比较麻烦。 idea其实提供了各module的启动管理工具了,可以快速启动和关闭各个服务,也能批量操作,比如一次…

25. 数组作为函数参数

写代码时,我们会将数组作为参数传给函数 冒泡排序: 两两相邻的元素进行比较,可能的话进行交换 一趟冒泡排序会将一个元素放在其最后应该在的位置 10个数字只需9趟,第一趟10个数字待排序,9对比较;第二趟…

计算机科学速成课【学习笔记】(1)——计算机早期历史

本集课程B站链接: 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili【计算机科学速成课】[40集全/精校] - Crash Course Computer Science共计40条视频,包括:1. 计算机早期历史-Early Computing、2. 电…

【2024最新版】neo4j安装配置

neo4j安装 写在最前面下载配置环境(还是不行?)启动neo4jpython中调用 写在最前面 之前我安装过,还写了一篇笔记 结果意外发现没有了,而且和之前安装的步骤不一样了,因此再次记录安装过程 下载 https://ne…

vue3安装vue-json-viewer实现json格式化

一、安装插件 直接看效果&#xff1a;json格式化 安装版本不宜过旧也不宜过新&#xff0c;针对vue3安装这个版本即可 yarn add vue-json-viewer;"dependencies": {"vue-json-viewer": "3",}, 二、使用插件 <script> import JsonViewe…

Vue中的keep-alive缓存组件的理解

<keep-alive> 是一个抽象组件&#xff0c;用于将其内部的组件保留在内存中&#xff0c;而不会重新渲染。这意味着当组件在<keep-alive> 内部切换时&#xff0c;其状态将被保留&#xff0c;而不是被销毁和重新创建。 <keep-alive>用来缓存不经常变化的组件&am…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…

机器学习笔记 - 基于Python的不平衡数据的欠采样技术

一、简述 随着从不同的来源生成和捕获大量数据。尽管信息量巨大,但它往往反映了现实世界现象的不平衡分布。数据不平衡的问题不仅仅是统计上的挑战,它对数据驱动模型的准确性和可靠性具有深远的影响。 以金融行业欺诈检测为例。尽管我们希望避免欺诈,因为其具有高度破坏性,…

在Mac上恢复SD卡数据的 6 个有效应用程序

慌&#xff01;SD卡里的照片和视频不小心删了&#xff0c;Mac设备上还恢复不了数据&#xff01; 遇到这种情况&#xff0c;你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表&#xff0c;并且还有详细的评论。另外&#xff0c;我们还会给…

深入解析 Spring 的 @Autowired:自动装配的魔法与细节

Autowired 是 Spring 框架中的一个重要注解&#xff0c;用于自动装配 bean 依赖。Spring 通过 Autowired 可以自动将匹配的 bean 注入到需要的地方&#xff0c;如属性、构造函数或 setter 方法等。 下面是 Autowired 注解的详细说明&#xff1a; 作用 自动装配&#xff1a;A…

FTP简介及搭建计算机端口的介绍

目录 一. FTP的简介 二. FTP的主要作用 三. 搭建FTP服务器 3.1 开启防火墙 3.2 创建组 3.3 创建用户 3.4 用户绑定组 3.5 安装FTP服务器 3.6 配置FTP服务器 3.7 配置FTP文件夹的权限 3.8 连接测试 3.8.1 服务器本机测试 3.8.2 外部服务器测试 3.8.3 借助工具MobalXterm 四…

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…

DNS域名查询过程

目录 DNS&#xff08;Domain Names System&#xff09; 域名转IP IP转域名 域名 域名查询流程 浏览器DNS缓存 操作系统缓存 本地host文件 完整流程 递归查询 迭代查询 DNS&#xff08;Domain Names System&#xff09; 域名系统&#xff0c;将域名和 IP 地址进行转…

【Spring】AOP的AspectJ开发

AOP基础不了解可以阅读&#xff1a;【Spring】AOP原来如此-CSDN博客 AspectJ是一个居于JAVA开发的AOP框架 基于XML的声明式AspectJ 基于XML的声明式AspectJ是通过XML文件来定义切面&#xff0c;切入点及通知&#xff0c;所有的切面、切入点和通知必须定义在内&#xff0c; 元…

【SpringBoot】常用注解

RequestBody&#xff1a;自动将请求体中的 json 数据转换为实体类对象。 这个例子凑巧传入的json属性键名和User键名一致&#xff0c;可以直接使用User实体类对象&#xff0c;如果键名不一致则需要用一个Map 类接收参数&#xff1a; PutMapping("/update")public R…

给多行文本的每行添加指定的前缀textwrap.indent()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给多行文本的每行添加指定的前缀 textwrap.indent() [太阳]选择题 请问以下代码输出的第一行结果是&#xff1f; import textwrap text welcome to China! print("【显示】text\n&quo…

基于单片机的公交车站自动报站器设计与实现

一、摘要 随着城市交通的快速发展&#xff0c;公交车作为城市公共交通的主要工具&#xff0c;其便捷性和高效性得到了广泛的认可。然而&#xff0c;由于公交车站的广播系统存在一定的局限性&#xff0c;如人工报站容易出现失误、音量大小不一等问题&#xff0c;给乘客带来了不…

Head First Design Patterns - 观察者模式

观察者模式 观察者模式定义了对象之间的一对多依赖&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。观察者模式是一种对象行为型模式。 场景 很多用户都订阅了某一公众号&#xff0c;当该公众号更新时&#xff0c;所以用户都会收到消息…