From patchwork Mon Jul 25 08:43:19 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Neukum X-Patchwork-Id: 1003952 Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p6P8gSdP012290 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Mon, 25 Jul 2011 08:42:54 GMT Received: from daredevil.linux-foundation.org (localhost [127.0.0.1]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id p6P8egwx003520; Mon, 25 Jul 2011 01:40:43 -0700 Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id p6P8ebHR003505 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 25 Jul 2011 01:40:39 -0700 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 941628EE5B; Mon, 25 Jul 2011 10:40:34 +0200 (CEST) From: Oliver Neukum Organization: SUSE To: linux-pm@lists.linux-foundation.org, linux-kernel@vger.kernel.org, rjw@sisk.pl Date: Mon, 25 Jul 2011 10:43:19 +0200 User-Agent: KMail/1.13.5 (Linux/3.0.0-rc7-12-desktop+; KDE/4.4.4; x86_64; ; ) MIME-Version: 1.0 Message-Id: <201107251043.19932.oneukum@suse.de> Received-SPF: pass (localhost is always allowed.) X-Spam-Status: No, hits=-103.461 required=5 tests=AWL, BAYES_00, FRT_OFFER2, OSDL_HEADER_SUBJECT_BRACKETED, USER_IN_WHITELIST X-Spam-Checker-Version: SpamAssassin 3.2.4-osdl_revision__1.47__ X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.21 Subject: [linux-pm] better oopsing when frozen X-BeenThere: linux-pm@lists.linux-foundation.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux power management List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-pm-bounces@lists.linux-foundation.org Errors-To: linux-pm-bounces@lists.linux-foundation.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Mon, 25 Jul 2011 08:42:54 +0000 (UTC) X-MIME-Autoconverted: from quoted-printable to 8bit by demeter2.kernel.org id p6P8gSdP012290 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 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 --- 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 #include #include +#include #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(); +} +