public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
* better oopsing when frozen
@ 2011-07-25  8:43 Oliver Neukum
  0 siblings, 0 replies; 14+ messages in thread
From: Oliver Neukum @ 2011-07-25  8:43 UTC (permalink / raw)
  To: linux-pm, linux-kernel, rjw

Hi Rafael,

I had a problem with the kernel stopping the machine forever because I got an
oops while tasks were frozen. It seems to me that we should thaw when this
happens. How about this approach?

	Regards
		Oliver

>From 6f3b5e7a5c7ccf3564bdd2e703eba7eee753ecdc Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oliver@neukum.org>
Date: Fri, 22 Jul 2011 11:20:19 +0200
Subject: [PATCH] unfreeze tasks if an oops happens while tasks are frozen

If an oops kills the task suspending or snapshotting
is system, the system is dead because the action is
never completed and the tasks never thawed.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
---
 include/linux/freezer.h |    1 +
 kernel/panic.c          |    2 ++
 kernel/power/process.c  |   11 +++++++++++
 3 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/include/linux/freezer.h b/include/linux/freezer.h
index 1effc8b..9907cf6 100644
--- a/include/linux/freezer.h
+++ b/include/linux/freezer.h
@@ -50,6 +50,7 @@ extern int thaw_process(struct task_struct *p);
 extern void refrigerator(void);
 extern int freeze_processes(void);
 extern void thaw_processes(void);
+extern void thaw_in_oops(void);
 
 static inline int try_to_freeze(void)
 {
diff --git a/kernel/panic.c b/kernel/panic.c
index 6923167..255e662 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/nmi.h>
 #include <linux/dmi.h>
+#include <linux/freezer.h>
 
 #define PANIC_TIMER_STEP 100
 #define PANIC_BLINK_SPD 18
@@ -355,6 +356,7 @@ void oops_exit(void)
 	do_oops_enter_exit();
 	print_oops_end_marker();
 	kmsg_dump(KMSG_DUMP_OOPS);
+	thaw_in_oops();
 }
 
 #ifdef WANT_WARN_ON_SLOWPATH
diff --git a/kernel/power/process.c b/kernel/power/process.c
index 0cf3a27..20994cd 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -22,6 +22,9 @@
  */
 #define TIMEOUT	(20 * HZ)
 
+/* in case we oops while processes are frozen */
+static bool tasks_fozen = false;
+
 static inline int freezable(struct task_struct * p)
 {
 	if ((p == current) ||
@@ -131,6 +134,7 @@ static int try_to_freeze_tasks(bool sig_only)
 			elapsed_csecs % 100);
 	}
 
+	tasks_fozen = (todo == 0);
 	return todo ? -EBUSY : 0;
 }
 
@@ -189,7 +193,14 @@ void thaw_processes(void)
 	thaw_workqueues();
 	thaw_tasks(true);
 	thaw_tasks(false);
+	tasks_fozen = false;
 	schedule();
 	printk("done.\n");
 }
 
+void thaw_in_oops(void)
+{
+	if (tasks_fozen)
+		thaw_processes();
+}
+
-- 
1.7.1


-- 
- - - 
SUSE LINUX Products GmbH, GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer, HRB 16746 (AG Nürnberg) 
Maxfeldstraße 5                         
90409 Nürnberg 
Germany 
- - - 

^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-07-29 21:30 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <201107251043.19932.oneukum@suse.de>
2011-07-25 10:10 ` better oopsing when frozen Borislav Petkov
2011-07-26 22:24 ` Rafael J. Wysocki
     [not found] ` <201107270024.11194.rjw@sisk.pl>
2011-07-26 22:45   ` Andrew Morton
     [not found]   ` <20110726154502.14c7b51b.akpm@linux-foundation.org>
2011-07-27  9:21     ` Rafael J. Wysocki
     [not found]     ` <201107271121.21348.rjw@sisk.pl>
2011-07-27 10:23       ` Oliver Neukum
2011-07-29 19:54 ` Pavel Machek
     [not found] ` <20110729195430.GB1720@ucw.cz>
2011-07-29 20:27   ` Oliver Neukum
2011-07-29 20:27   ` Rafael J. Wysocki
2011-07-29 21:04     ` Oliver Neukum
     [not found]     ` <201107292304.10738.oliver@neukum.org>
2011-07-29 21:09       ` Rafael J. Wysocki
     [not found]       ` <201107292309.44877.rjw@sisk.pl>
2011-07-29 21:17         ` Oliver Neukum
     [not found]         ` <201107292317.42737.oliver@neukum.org>
2011-07-29 21:30           ` Rafael J. Wysocki
     [not found]   ` <201107292227.36424.oliver@neukum.org>
2011-07-29 20:29     ` Rafael J. Wysocki
2011-07-25  8:43 Oliver Neukum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox