mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] cgroup_freezer: Freezing and task move race fix
@ 2010-08-10 19:53 Tomasz Buchert
  2010-08-10 21:57 ` Matt Helsley
                   ` (2 more replies)
  0 siblings, 3 replies; 19+ messages in thread
From: Tomasz Buchert @ 2010-08-10 19:53 UTC (permalink / raw)
  To: Paul Menage, Li Zefan, containers, linux-kernel; +Cc: Tomasz Buchert

Writing 'FROZEN' to freezer.state file does not
forbid the task to be moved away from its cgroup
(for a very short time). Nevertheless the moved task
can become frozen OUTSIDE its cgroup which puts
discussed task in a permanent 'D' state.

This patch forbids migration of either FROZEN
or FREEZING tasks.

This behavior was observed and easily reproduced on
a single core laptop. Program and instructions how
to reproduce the bug can be fetched from:
http://pentium.hopto.org/~thinred/repos/linux-misc/freezer_bug.c

Signed-off-by: Tomasz Buchert <tomasz.buchert@inria.fr>
---
 kernel/cgroup_freezer.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
index ce71ed5..e49aa8c 100644
--- a/kernel/cgroup_freezer.c
+++ b/kernel/cgroup_freezer.c
@@ -161,6 +161,12 @@ static bool is_task_frozen_enough(struct task_struct *task)
 		(task_is_stopped_or_traced(task) && freezing(task));
 }
 
+/* Task is in a state that forbids any cgroup migration. */
+static bool is_task_pinned_down(struct task_struct *task)
+{
+	return freezing(task) || frozen(task);
+}
+
 /*
  * The call to cgroup_lock() in the freezer.state write method prevents
  * a write to that file racing against an attach, and hence the
@@ -179,7 +185,7 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
 	 * frozen, so it's sufficient to check the latter condition.
 	 */
 
-	if (is_task_frozen_enough(task))
+	if (is_task_pinned_down(task))
 		return -EBUSY;
 
 	freezer = cgroup_freezer(new_cgroup);
@@ -191,7 +197,7 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
 
 		rcu_read_lock();
 		list_for_each_entry_rcu(c, &task->thread_group, thread_group) {
-			if (is_task_frozen_enough(c)) {
+			if (is_task_pinned_down(c)) {
 				rcu_read_unlock();
 				return -EBUSY;
 			}
-- 
1.6.3.3


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

end of thread, other threads:[~2010-08-19  8:37 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-10 19:53 [PATCH] cgroup_freezer: Freezing and task move race fix Tomasz Buchert
2010-08-10 21:57 ` Matt Helsley
2010-08-10 22:18   ` Tomasz Buchert
2010-08-11  4:27     ` Matt Helsley
2010-08-11  7:35       ` Tomasz Buchert
2010-08-12  0:21         ` Matt Helsley
2010-08-12  0:53           ` Tomasz Buchert
2010-08-12 20:13             ` Matt Helsley
2010-08-18  1:13               ` Tomasz Buchert
2010-08-18  2:22                 ` Matt Helsley
2010-08-19  8:37                   ` Tomasz Buchert
2010-08-13  1:35           ` Rafael J. Wysocki
2010-08-11  1:10 ` Matt Helsley
2010-08-11  7:30   ` Tomasz Buchert
2010-08-11  8:01     ` Tomasz Buchert
2010-08-12  9:45 ` [PATCH 0/3] Two bugfixes for cgroup freezer Tomasz Buchert
2010-08-12  9:45   ` [PATCH 1/3] cgroup_freezer: Unnecessary test in cgroup_freezing_or_frozen Tomasz Buchert
2010-08-12  9:45     ` [PATCH 2/3] cgroup_freezer: Fix can_attach to prohibit moving from/to freezing/frozen cgroups Tomasz Buchert
2010-08-12  9:45       ` [PATCH 3/3] cgroup_freezer: update_freezer_state does incorrect state transactions Tomasz Buchert

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

Powered by JetHome