diff options
author | Benoit Goby <benoit@android.com> | 2011-01-21 15:53:44 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2011-06-14 09:09:50 -0700 |
commit | 34dcf173c5f6256210741c0c83bbebf4e017d5ad (patch) | |
tree | 12a8ea05b17a897c5013a36b1e30de98a366f610 /drivers/base/power | |
parent | 0ee5695f24a1629c4147ed44650fe8847891efde (diff) |
PM: Dump suspend thread stack on dpm suspend timeout
When a driver takes more than 3 seconds to suspend, dump the suspend
thread stack since BUG() might only dump the idle thread stack.
Change-Id: If854db355fdcf3b773ea20b1b5e031def6d4b114
Signed-off-by: Benoit Goby <benoit@android.com>
Diffstat (limited to 'drivers/base/power')
-rw-r--r-- | drivers/base/power/main.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index abd3e56b2fa..3e4d364d854 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -52,6 +52,10 @@ static pm_message_t pm_transition; static void dpm_drv_timeout(unsigned long data); static DEFINE_TIMER(dpm_drv_wd, dpm_drv_timeout, 0, 0); +static struct { + struct device *dev; + struct task_struct *tsk; +} dpm_drv_wd_data; static int async_error; @@ -588,10 +592,15 @@ static bool is_async(struct device *dev) */ static void dpm_drv_timeout(unsigned long data) { - struct device *dev = (struct device *) data; + struct device *dev = dpm_drv_wd_data.dev; + struct task_struct *tsk = dpm_drv_wd_data.tsk; printk(KERN_EMERG "**** DPM device timeout: %s (%s)\n", dev_name(dev), (dev->driver ? dev->driver->name : "no driver")); + + printk(KERN_EMERG "dpm suspend stack:\n"); + show_stack(tsk, NULL); + BUG(); } @@ -602,7 +611,9 @@ static void dpm_drv_timeout(unsigned long data) */ static void dpm_drv_wdset(struct device *dev) { - dpm_drv_wd.data = (unsigned long) dev; + dpm_drv_wd_data.dev = dev; + dpm_drv_wd_data.tsk = get_current(); + dpm_drv_wd.data = (unsigned long) &dpm_drv_wd_data; mod_timer(&dpm_drv_wd, jiffies + (HZ * 3)); } |