linux 监控驱动suspend/resume的执行

本文探讨了Linux内核在调用驱动的suspend和resume回调时如何设置定时器进行监控。如果回调函数执行超过12秒,系统会触发BUG()导致重启。因此,开发者在编写相关回调时需要注意避免长时间阻塞,以防止出现意外的系统崩溃。
摘要由CSDN通过智能技术生成

当pm核心去调用驱动的suspend/resume的回调函数时,它会设置一个定时器来监视回调函数的执行,如果回调长时间没有执行完毕的话(当前定时为12S), 定时器函数会调用BUG()让系统挂掉重启,所以在写pm相关的回调函数时,要确保不能长时间阻塞,否则后果你是知道的, 可以看下dpm_wd_handler这个函数

/* kernel/drivers/base/power/main.c **/
static void dpm_wd_handler(unsigned long data)
{
   struct dpm_watchdog *wd = (void *)data;
   struct device *dev - wd->dev;
   struct task_struct *tsk = wd->tsk;

   dev_emerg(dev, "***DPM device timeout ***\n"); 
   show_stack(tsk, NULL);

   BUG();
}


除了这个问题,在遇到的bug中, log会不断地打印"bad: scheduing from the idle thread!" ,  从函数堆栈上可以看出, 在定时器函数运行之前, CPU上跑得是cpu_idle线程, 这个线程的调度类(sched_class)是 idle_sched_class,  BUG()这个宏会 调用msleep函数, 最终通过schedule()函数调用到idle_sched_class的dequeue_task_idle这个回调, 然后会打出上面的log.   除此之外, 由于执行BUG这个宏是在定时器处理函数里面调用的, 是运行在中断上下文的, 是不允许调用ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值