[RFC][PATCH 4/4] container freezer: do not unfreeze a frozen
container when the system is resumed
Cedric Le Goater
clg at fr.ibm.com
Wed Jun 20 08:08:03 PDT 2007
From: Cedric Le Goater <clg at fr.ibm.com>
When a system is resumed after a suspend, it will also unfreeze
frozen containers.
This patchs modifies the resume sequence to skip the tasks which
are part of a frozen container.
Signed-off-by: Cedric Le Goater <clg at fr.ibm.com>
---
include/linux/container_freezer.h | 56 ++++++++++++++++++++++++++++++++++++++
kernel/container_freezer.c | 20 +------------
kernel/power/process.c | 4 ++
3 files changed, 62 insertions(+), 18 deletions(-)
Index: 2.6.22-rc4-mm2/include/linux/container_freezer.h
===================================================================
--- /dev/null
+++ 2.6.22-rc4-mm2/include/linux/container_freezer.h
@@ -0,0 +1,56 @@
+#ifndef _LINUX_CONTAINER_FREEZER_H
+#define _LINUX_CONTAINER_FREEZER_H
+/*
+ * container_freezer.h - container freezer subsystem interface
+ *
+ * Copyright (C) Cedric Le Goater, IBM Corp. 2007
+ *
+ */
+
+#include <linux/container.h>
+
+#ifdef CONFIG_CONTAINER_FREEZER
+
+enum freezer_state {
+ STATE_RUNNING = 0,
+ STATE_FREEZING,
+ STATE_FROZEN,
+};
+
+struct freezer {
+ struct container_subsys_state css;
+ enum freezer_state state;
+ spinlock_t lock;
+};
+
+static inline struct freezer *container_freezer(
+ struct container *container)
+{
+ return container_of(
+ container_subsys_state(container, freezer_subsys_id),
+ struct freezer, css);
+}
+
+static inline int container_frozen(struct task_struct *task)
+{
+ struct container *container = task_container(task, freezer_subsys_id);
+ struct freezer *freezer = container_freezer(container);
+ enum freezer_state state;
+
+ spin_lock(&freezer->lock);
+ state = freezer->state;
+ spin_unlock(&freezer->lock);
+
+ return (state == STATE_FROZEN);
+}
+
+#else /* !CONFIG_CONTAINER_FREEZER */
+
+static inline int container_frozen(struct task_struct *task)
+{
+ return 0;
+}
+
+#endif /* !CONFIG_CONTAINER_FREEZER */
+
+#endif /* _LINUX_CONTAINER_FREEZER_H */
Index: 2.6.22-rc4-mm2/kernel/container_freezer.c
===================================================================
--- 2.6.22-rc4-mm2.orig/kernel/container_freezer.c
+++ 2.6.22-rc4-mm2/kernel/container_freezer.c
@@ -9,12 +9,8 @@
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/freezer.h>
-
-enum freezer_state {
- STATE_RUNNING = 0,
- STATE_FREEZING,
- STATE_FROZEN,
-};
+#include <linux/container.h>
+#include <linux/container_freezer.h>
static const char *freezer_state_strs[] = {
"RUNNING\n",
@@ -22,21 +18,9 @@ static const char *freezer_state_strs[]
"FROZEN\n"
};
-struct freezer {
- struct container_subsys_state css;
- enum freezer_state state;
- spinlock_t lock;
-};
struct container_subsys freezer_subsys;
-static inline struct freezer *container_freezer(
- struct container *container)
-{
- return container_of(
- container_subsys_state(container, freezer_subsys_id),
- struct freezer, css);
-}
static int freezer_create(struct container_subsys *ss,
struct container *container)
Index: 2.6.22-rc4-mm2/kernel/power/process.c
===================================================================
--- 2.6.22-rc4-mm2.orig/kernel/power/process.c
+++ 2.6.22-rc4-mm2/kernel/power/process.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/freezer.h>
+#include <linux/container_freezer.h>
/*
* Timeout for stopping processes
@@ -169,6 +170,9 @@ static void thaw_tasks(int thaw_user_spa
if (!p->mm == thaw_user_space)
continue;
+ if (container_frozen(p))
+ continue;
+
thaw_process(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
--
More information about the Containers
mailing list