Re: Machine crashes right *after* ~successful resume

From: Yinghai Lu
Date: Sat Oct 18 2014 - 17:29:02 EST


On Thu, Oct 16, 2014 at 2:08 PM, Wilmer van der Gaast <wilmer@xxxxxxxxx> wrote:
> Did that on this run, no difference either. For full completeness, I
> reproduced this problem with no modules loaded (done from initramfs) at all,
> with a kernel with your workaround included, logs are here:
> http://gaast.net/~wilmer/.lkml/bad3.17-patched-debug-initramfs.txt

Yes, those output are good.

Please apply attached debug patch on top of v3.17 and boot with
"debug ignore_loglevel initcall_debug no_console_suspend".

Hope we can find out which nb notifier cause problem.

Thanks

Yinghai
---
kernel/notifier.c | 9 +++++++++
kernel/power/main.c | 4 +++-
2 files changed, 12 insertions(+), 1 deletion(-)

Index: linux-2.6/kernel/power/main.c
===================================================================
--- linux-2.6.orig/kernel/power/main.c
+++ linux-2.6/kernel/power/main.c
@@ -24,16 +24,18 @@ DEFINE_MUTEX(pm_mutex);

/* Routines for PM-transition notifications */

-static BLOCKING_NOTIFIER_HEAD(pm_chain_head);
+BLOCKING_NOTIFIER_HEAD(pm_chain_head);

int register_pm_notifier(struct notifier_block *nb)
{
+ pr_info("PM: registering nb %pF\n", nb->notifier_call);
return blocking_notifier_chain_register(&pm_chain_head, nb);
}
EXPORT_SYMBOL_GPL(register_pm_notifier);

int unregister_pm_notifier(struct notifier_block *nb)
{
+ pr_info("PM: unregistering nb %pF\n", nb->notifier_call);
return blocking_notifier_chain_unregister(&pm_chain_head, nb);
}
EXPORT_SYMBOL_GPL(unregister_pm_notifier);
Index: linux-2.6/kernel/notifier.c
===================================================================
--- linux-2.6.orig/kernel/notifier.c
+++ linux-2.6/kernel/notifier.c
@@ -59,6 +59,9 @@ static int notifier_chain_unregister(str
return -ENOENT;
}

+extern struct blocking_notifier_head pm_chain_head;
+#define PM_POST_SUSPEND 0x0004 /* Suspend finished */
+
/**
* notifier_call_chain - Informs the registered notifiers about an event.
* @nl: Pointer to head of the blocking notifier chain
@@ -90,8 +93,14 @@ static int notifier_call_chain(struct no
continue;
}
#endif
+ if (nl == &pm_chain_head.head && val == PM_POST_SUSPEND)
+ pr_info("PM: calling nb %pF\n", nb->notifier_call);
+
ret = nb->notifier_call(nb, val, v);

+ if (nl == &pm_chain_head.head && val == PM_POST_SUSPEND)
+ pr_info("PM: ... nb %pF done\n", nb->notifier_call);
+
if (nr_calls)
(*nr_calls)++;