netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Colin Cross <ccross@android.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Michael Leun <lkml20130126@newton.leun.net>,
	lkml <linux-kernel@vger.kernel.org>, Pavel Machek <pavel@ucw.cz>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Mandeep Singh Baines <msb@chromium.org>,
	Oleg Nesterov <oleg@redhat.com>,
	linux-nfs <linux-nfs@vger.kernel.org>,
	Linux PM list <linux-pm@vger.kernel.org>,
	netdev <netdev@vger.kernel.org>, Tejun Heo <tj@kernel.org>,
	Darren Hart <dvhart@linux.intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Randy Dunlap <rdunlap@infradead.org>,
	Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: 3.11-rc regression bisected: s2disk does not work (was Re: [PATCH v3 13/16] futex: use freezable blocking call)
Date: Tue, 23 Jul 2013 13:31:49 -0700	[thread overview]
Message-ID: <CAMbhsRSRcQ-CgCTkRGJJSVSArPqmGRjgxeRBUY0zE94Osxa-nA@mail.gmail.com> (raw)
In-Reply-To: <CAMbhsRSsq0pgS6KvCjiFGneDEJd6zSXsYB_2MCV=sh+6F2muog@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 2505 bytes --]

On Mon, Jul 22, 2013 at 11:28 PM, Colin Cross <ccross@android.com> wrote:
> On Mon, Jul 22, 2013 at 6:41 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
>> On Monday, July 22, 2013 05:42:49 PM Colin Cross wrote:
>>> On Mon, Jul 22, 2013 at 5:32 PM, Linus Torvalds
>>> <torvalds@linux-foundation.org> wrote:
>>> > On Mon, Jul 22, 2013 at 4:55 PM, Colin Cross <ccross@android.com> wrote:
>>> >>
>>> >> I think the right solution is to add a flag to the freezing task that
>>> >> marks it unfreezable.  I  think PF_NOFREEZE would work, although it is
>>> >> normally used on kernel threads, can you see if the attached patch
>>> >> helps?
>>> >
>>> > Hmm. That does seem to be the right thing to do, but I wonder about
>>> > the *other* callers of freeze_processes() IOW, kexec and friends.
>>> >
>>> > So maybe we should do this in {freeze|thaw}_processes() itself, and
>>> > just make the rule be that the caller of freeze_processes() itself is
>>> > obviously not frozen, and has to be the same one that then thaws
>>> > things?
>>> >
>>> > Colin? Rafael? Comments?
>>> >
>>> >                 Linus
>>>
>>> I was worried about clearing the flag in thaw_processes().  If a
>>> kernel thread with PF_NOFREEZE set ever called thaw_processes(), which
>>> autosleep might do, it would clear the flag.  Or if a different thread
>>> called freeze_processes() and thaw_processes().
>>
>> Is that legitimate?
>
> Nothing precludes it today, but I don't see any need for it.  I'll add
> a comment when I add the flag.
>
>>> All the other callers besides the SNAPSHOT_FREEZE ioctl stay in the kernel
>>> between freeze_processes() and thaw_processes(), which makes the fanout of
>>> places that could call try_to_freeze() much more controllable.
>>>
>>> Using a new flag that operates like PF_NOFREEZE but doesn't conflict
>>> with it, or a nofreeze_depth counter, would also work.
>>
>> Well, that would be robust enough.  At least if the purpose of that new flag
>> is clearly specified, people hopefully won't be tempted to optimize it away in
>> the future.
>>
>> Thanks,
>> Rafael
>
> OK, I'll add a new flag.


Michael, can you see if this patch works and doesn't throw any
warnings during suspend or resume?

If the extra process flag is considered too precious for this
(there are only 2 left after this patch) I could get the
same functionality by having freeze_processes() reject calls
from a PF_KTHREAD|PF_NOFREEZE thread, and use PF_KTHREAD to
determine if PF_NOFREEZE should be cleared in thaw_processes().

[-- Attachment #2: 0001-power-set-PF_SUSPEND_TASK-flag-on-tasks-that-call-fr.patch --]
[-- Type: application/octet-stream, Size: 4006 bytes --]

From 188f58711ad19315a1abaa05000db9d312aaa93f Mon Sep 17 00:00:00 2001
From: Colin Cross <ccross@android.com>
Date: Mon, 22 Jul 2013 16:53:15 -0700
Subject: [PATCH] power: set PF_SUSPEND_TASK flag on tasks that call
 freeze_processes

Calling freeze_processes sets a global flag that will cause any
process that calls try_to_freeze to enter the refrigerator.  It
skips sending a signal to the current task, but if the current
task ever hits try_to_freeze all threads will be frozen and the
system will deadlock.

Set a new flag, PF_SUSPEND_TASK, on the task that calls
freeze_processes.  The flag notifies the freezer that the thread
is involved in suspend and should not be frozen.  Also add a
WARN_ON in thaw_processes if the caller does not have the
PF_SUSPEND_TASK flag set to catch if a different task calls
thaw_processes than the one that called freeze_processes, leaving
a task with PF_SUSPEND_TASK permanently set on it.

Threads that spawn off a task with PF_SUSPEND_TASK set (which
swsusp does) will also have PF_SUSPEND_TASK set, preventing them
from freezing while they are helping with suspend, but they need
to be dead by the time suspend is triggered, otherwise they may
run when userspace is expected to be frozen.  Add a WARN_ON in
thaw_processes if more than one thread has the PF_SUSPEND_TASK
flag set.

Reported-by: Michael Leun <lkml20130126@newton.leun.net>
Signed-off-by: Colin Cross <ccross@android.com>
---
 include/linux/sched.h  |  1 +
 kernel/freezer.c       |  2 +-
 kernel/power/process.c | 11 +++++++++++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 50d04b9..d722490 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1628,6 +1628,7 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,
 #define PF_MEMPOLICY	0x10000000	/* Non-default NUMA mempolicy */
 #define PF_MUTEX_TESTER	0x20000000	/* Thread belongs to the rt mutex tester */
 #define PF_FREEZER_SKIP	0x40000000	/* Freezer should not count it as freezable */
+#define PF_SUSPEND_TASK 0x80000000      /* this thread called freeze_processes and should not be frozen */
 
 /*
  * Only the _current_ task can read/write to tsk->flags, but other
diff --git a/kernel/freezer.c b/kernel/freezer.c
index 8b2afc1..b462fa1 100644
--- a/kernel/freezer.c
+++ b/kernel/freezer.c
@@ -33,7 +33,7 @@ static DEFINE_SPINLOCK(freezer_lock);
  */
 bool freezing_slow_path(struct task_struct *p)
 {
-	if (p->flags & PF_NOFREEZE)
+	if (p->flags & (PF_NOFREEZE | PF_SUSPEND_TASK))
 		return false;
 
 	if (pm_nosig_freezing || cgroup_freezing(p))
diff --git a/kernel/power/process.c b/kernel/power/process.c
index fc0df84..06ec886 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -109,6 +109,8 @@ static int try_to_freeze_tasks(bool user_only)
 
 /**
  * freeze_processes - Signal user space processes to enter the refrigerator.
+ * The current thread will not be frozen.  The same process that calls
+ * freeze_processes must later call thaw_processes.
  *
  * On success, returns 0.  On failure, -errno and system is fully thawed.
  */
@@ -120,6 +122,9 @@ int freeze_processes(void)
 	if (error)
 		return error;
 
+	/* Make sure this task doesn't get frozen */
+	current->flags |= PF_SUSPEND_TASK;
+
 	if (!pm_freezing)
 		atomic_inc(&system_freezing_cnt);
 
@@ -168,6 +173,7 @@ int freeze_kernel_threads(void)
 void thaw_processes(void)
 {
 	struct task_struct *g, *p;
+	struct task_struct *curr = current;
 
 	if (pm_freezing)
 		atomic_dec(&system_freezing_cnt);
@@ -182,10 +188,15 @@ void thaw_processes(void)
 
 	read_lock(&tasklist_lock);
 	do_each_thread(g, p) {
+		/* No other threads should have PF_SUSPEND_TASK set */
+		WARN_ON((p != curr) && (p->flags & PF_SUSPEND_TASK));
 		__thaw_task(p);
 	} while_each_thread(g, p);
 	read_unlock(&tasklist_lock);
 
+	WARN_ON(!(curr->flags & PF_SUSPEND_TASK));
+	curr->flags &= ~PF_SUSPEND_TASK;
+
 	usermodehelper_enable();
 
 	schedule();
-- 
1.8.3


  reply	other threads:[~2013-07-23 20:31 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-06 23:50 [PATCH v2 00/10] optimize freezing tasks by reducing task wakeups Colin Cross
2013-05-06 23:50 ` [PATCH v3 01/16] freezer: add unsafe versions of freezable helpers for NFS Colin Cross
2013-05-06 23:50 ` [PATCH v3 02/16] freezer: add unsafe versions of freezable helpers for CIFS Colin Cross
2013-05-07 10:07   ` Jeff Layton
     [not found]     ` <20130507060730.03364687-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2013-05-07 17:47       ` Colin Cross
     [not found]         ` <CAMbhsRQ1i_dFctwjkqjg3=GJdEc8ReEDk=NnEFEXj8u3MaEqDA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-05-07 17:52           ` [PATCH v4 " Colin Cross
     [not found]             ` <1367949125-21809-1-git-send-email-ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
2013-05-07 18:11               ` Jeff Layton
     [not found]   ` <1367884221-20462-3-git-send-email-ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
2013-05-07 12:28     ` [PATCH v3 " Pavel Machek
2013-05-06 23:50 ` [PATCH v3 03/16] lockdep: remove task argument from debug_check_no_locks_held Colin Cross
2013-05-07 12:28   ` Pavel Machek
2013-05-06 23:50 ` [PATCH v3 04/16] lockdep: check that no locks held at freeze time Colin Cross
     [not found]   ` <1367884221-20462-5-git-send-email-ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
2013-05-07 12:29     ` Pavel Machek
     [not found] ` <1367884221-20462-1-git-send-email-ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
2013-05-06 23:50   ` [PATCH v3 05/16] freezer: shorten freezer sleep time using exponential backoff Colin Cross
2013-05-06 23:50   ` [PATCH v3 06/16] freezer: skip waking up tasks with PF_FREEZER_SKIP set Colin Cross
2013-05-06 23:50 ` [PATCH v3 07/16] freezer: convert freezable helpers to freezer_do_not_count() Colin Cross
2013-05-06 23:50 ` [PATCH v3 08/16] freezer: convert freezable helpers to static inline where possible Colin Cross
2013-05-06 23:50 ` [PATCH v3 09/16] freezer: add new freezable helpers using freezer_do_not_count() Colin Cross
2013-05-06 23:50 ` [PATCH v3 10/16] binder: use freezable blocking calls Colin Cross
2013-05-06 23:50 ` [PATCH v3 11/16] epoll: use freezable blocking call Colin Cross
2013-05-06 23:50 ` [PATCH v3 12/16] select: " Colin Cross
2013-05-06 23:50 ` [PATCH v3 13/16] futex: " Colin Cross
2013-07-22 23:02   ` 3.11-rc regression bisected: s2disk does not work (was Re: [PATCH v3 13/16] futex: use freezable blocking call) Michael Leun
2013-07-22 23:55     ` Colin Cross
2013-07-23  0:32       ` Linus Torvalds
     [not found]         ` <CA+55aFzUVPJe96z8V0F-znc8ZcpJid7LEeYww80M-Mx=S91tAA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-07-23  0:42           ` Colin Cross
     [not found]             ` <CAMbhsRReF9xB597i9CcCj7D1P5kvB4cc0JmDQYeboqi11Kp99A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-07-23  1:41               ` Rafael J. Wysocki
     [not found]                 ` <15305281.aClQ8XUG9t-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2013-07-23  6:28                   ` Colin Cross
2013-07-23 20:31                     ` Colin Cross [this message]
2013-07-23 21:58                       ` Michael Leun
2013-07-23 18:08       ` Michael Leun
2013-07-23 18:24         ` Darren Hart
2013-07-23 18:29         ` Colin Cross
2013-07-23 19:16           ` Michael Leun
     [not found]             ` <20130723211622.50f75087-gjVD6BTPoEbYa4IuQwzu8g@public.gmane.org>
2013-07-23 19:29               ` Colin Cross
     [not found]                 ` <CAMbhsRQU=TswYg-2WqHmzt-_GpfMFpYHPSU4eFd5XMw7DRGXJA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-07-23 19:58                   ` Michael Leun
     [not found]           ` <CAMbhsRT6zOKLhG_uh=nA8H_3d7afhG+4jvWjvidY3fEguryP_Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-07-23 21:43             ` Rafael J. Wysocki
     [not found]     ` <20130723010250.5a3465ec-gjVD6BTPoEbYa4IuQwzu8g@public.gmane.org>
2013-07-23  0:26       ` Pavel Machek
2013-05-06 23:50 ` [PATCH v3 14/16] nanosleep: use freezable blocking call Colin Cross
2013-05-06 23:50 ` [PATCH v3 15/16] sigtimedwait: " Colin Cross
2013-05-06 23:50 ` [PATCH v3 16/16] af_unix: use freezable blocking calls in read Colin Cross
2013-05-07 18:12 ` [PATCH v2 00/10] optimize freezing tasks by reducing task wakeups Tejun Heo
2013-05-08  0:02   ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAMbhsRSRcQ-CgCTkRGJJSVSArPqmGRjgxeRBUY0zE94Osxa-nA@mail.gmail.com \
    --to=ccross@android.com \
    --cc=akpm@linux-foundation.org \
    --cc=dvhart@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lkml20130126@newton.leun.net \
    --cc=mingo@redhat.com \
    --cc=msb@chromium.org \
    --cc=netdev@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=pavel@ucw.cz \
    --cc=peterz@infradead.org \
    --cc=rdunlap@infradead.org \
    --cc=rjw@sisk.pl \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).