23 PC is at dpm_wd_handler+0x2c/0x30

异常现场

__exp_main.txt和SYS_KERNEL_LOG里看到如下log:

死机位置在函数dpm_wd_handler()中,是这里的BUG()触发了Exception 

<4>[  341.525222] 2)PC is at dpm_wd_handler+0x2c/0x30

<7>[  328.440667] 2)[57] bus device_suspend
<7>[  328.440674] 2)dev->driver->name=mtk-msdc
<3>[  328.440714] 2)msdc1 -> PM Suspend
<4>[  328.440741] 2)msdc1 select card<0x00000000>
<4>[  328.440776] 2)msdc LDO<2> power off
<4>[  328.440796] 2)msdc LDO<3> power off
<3>[  328.450820] 2)msdc1 -> set mclk to 0
<7>[  328.451843] 2)[58] bus device_suspend
<7>[  328.451850] 2)dev->driver->name=mtk-msdc
<3>[  328.451863] 2)msdc0 -> PM Suspend
<4>[  328.451880] 2)msdc0 select card<0x00000000>
<4>[  328.451933] 2)msdc LDO<4> power off
<7>[  328.451973] 2)[59] bus device_suspend
<7>[  328.451988] 2)[60] bus device_suspend
<7>[  328.452001] 2)[61] bus device_suspend
<7>[  328.452008] 2)dev->driver->name=akm8963

。。。。。。

<0>[  340.489412] 2)akm8963 2-000c: **** DPM device timeout ****
<4>[  340.489421] 2)Backtrace:

。。。。。。

代码位置:

kernel-3.10/drivers/base/power/main.c

 /**
411 * dpm_wd_handler - Driver suspend / resume watchdog handler.
412 *
413 * Called when a driver has timed out suspending or resuming.
414 * There's not much we can do here to recover so BUG() out for
415 * a crash-dump
416 */
417static void dpm_wd_handler(unsigned long data)
418{
419	struct dpm_watchdog *wd = (void *)data;
420	struct device *dev      = wd->dev;
421	struct task_struct *tsk = wd->tsk;
422
423	dev_emerg(dev, "**** DPM device timeout ****\n");
424	show_stack(tsk, NULL);
425
426	BUG();
427}

问题分析:

系统在call每个Module驱动的suspend/resume callback function的时候,会设定一个timer 来监控回调函数的执行;如果回调函数长时间没有执行完毕,定时器函数会调用BUG()让系统挂掉,
 
所以在客制化回调函数时,要确保不能长时间阻塞,否则就会走到dpm_wdt_handler()函数,如上log,先打出 "**** DPM device timeout ****",接着会将相关驱动的 Backtrace印出来
 
程序如何跑入dpm_wdt_handler() ?
 
__device_suspend()函数中,可以看到在函数开始位置会调用dpm_wd_set(&wd,dev),此处会设置一个timer,在suspend函数结尾处,会调用dpm_wd_clear(&wd),用于清除timer ,在start timer 和clear timer 之间的code 是做device suspend 的动作,这个过程必须在一定时间内完成,否则就会导致timer到期,触发dpm_wdt_handler()

问题解决:

第一,根据上述log中Backtrace 找到是哪个device导致,如是自己添加的device驱动,特别是客制化的部分,需自己查看一下是否存在device suspend太久的情况。

第二,如这部分code没有做任何修改,请提交e-service并注明是哪部分驱动引起的问题,以便我们迅速处理问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值