05/12 - ckrm_tasksupport_fork_exit_init
Initializes and clears ckrm specific information in a task at fork() and
exit().
Inititalizes ckrm (called from start_kernel)
--
Signed-Off-By: Chandra Seetharaman <[EMAIL PROTECTED]>
include/linux/ckrm.h | 8 +++++++
init/main.c | 2 +
kernel/ckrm/ckrm.c | 11 ++++++++++
kernel/ckrm/ckrm_task.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
kernel/exit.c | 2 +
kernel/fork.c | 2 +
6 files changed, 76 insertions(+)
Index: linux-2.6.16/include/linux/ckrm.h
===================================================================
--- linux-2.6.16.orig/include/linux/ckrm.h
+++ linux-2.6.16/include/linux/ckrm.h
@@ -113,5 +113,13 @@ extern void ckrm_release_class(struct kr
extern void ckrm_teardown(void);
extern void ckrm_setclass(struct task_struct *, struct ckrm_class *);
+extern void ckrm_move_tasks_to_parent(struct ckrm_class *);
+extern void ckrm_init_task(struct task_struct *);
+extern void ckrm_clear_task(struct task_struct *);
+extern void ckrm_init(void);
+#else /* CONFIG_CKRM */
+static inline void ckrm_init_task(struct task_struct *tsk) { }
+static inline void ckrm_clear_task(struct task_struct *tsk) { }
+static inline void ckrm_init(void) { }
#endif /* CONFIG_CKRM */
#endif /* _LINUX_CKRM_H */
Index: linux-2.6.16/kernel/exit.c
===================================================================
--- linux-2.6.16.orig/kernel/exit.c
+++ linux-2.6.16/kernel/exit.c
@@ -31,6 +31,7 @@
#include <linux/signal.h>
#include <linux/cn_proc.h>
#include <linux/mutex.h>
+#include <linux/ckrm.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
@@ -679,6 +680,7 @@ static void exit_notify(struct task_stru
struct task_struct *t;
struct list_head ptrace_dead, *_p, *_n;
+ ckrm_clear_task(tsk);
if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT)
&& !thread_group_empty(tsk)) {
/*
Index: linux-2.6.16/kernel/fork.c
===================================================================
--- linux-2.6.16.orig/kernel/fork.c
+++ linux-2.6.16/kernel/fork.c
@@ -44,6 +44,7 @@
#include <linux/rmap.h>
#include <linux/acct.h>
#include <linux/cn_proc.h>
+#include <linux/ckrm.h>
#include <asm/pgtable.h>
#include <asm/pgalloc.h>
@@ -1197,6 +1198,7 @@ static task_t *copy_process(unsigned lon
total_forks++;
spin_unlock(¤t->sighand->siglock);
write_unlock_irq(&tasklist_lock);
+ ckrm_init_task(p);
proc_fork_connector(p);
return p;
Index: linux-2.6.16/init/main.c
===================================================================
--- linux-2.6.16.orig/init/main.c
+++ linux-2.6.16/init/main.c
@@ -47,6 +47,7 @@
#include <linux/rmap.h>
#include <linux/mempolicy.h>
#include <linux/key.h>
+#include <linux/ckrm.h>
#include <asm/io.h>
#include <asm/bugs.h>
@@ -537,6 +538,7 @@ asmlinkage void __init start_kernel(void
proc_root_init();
#endif
cpuset_init();
+ ckrm_init();
check_bugs();
Index: linux-2.6.16/kernel/ckrm/ckrm.c
===================================================================
--- linux-2.6.16.orig/kernel/ckrm/ckrm.c
+++ linux-2.6.16/kernel/ckrm/ckrm.c
@@ -232,6 +232,7 @@ int ckrm_free_class(struct ckrm_class *c
return -EBUSY;
}
spin_unlock(&class->class_lock);
+ ckrm_move_tasks_to_parent(class);
kref_put(&class->ref, ckrm_release_class);
return 0;
}
@@ -388,5 +389,15 @@ void ckrm_teardown(void)
}
}
+void ckrm_init(void)
+{
+ write_lock(&ckrm_class_lock);
+ list_add_tail(&ckrm_default_class.class_list, &ckrm_classes);
+ write_unlock(&ckrm_class_lock);
+ kref_init(&ckrm_default_class.ref);
+ init_task.class = &ckrm_default_class;
+ ckrm_init_task(&init_task);
+}
+
EXPORT_SYMBOL_GPL(ckrm_register_controller);
EXPORT_SYMBOL_GPL(ckrm_unregister_controller);
Index: linux-2.6.16/kernel/ckrm/ckrm_task.c
===================================================================
--- linux-2.6.16.orig/kernel/ckrm/ckrm_task.c
+++ linux-2.6.16/kernel/ckrm/ckrm_task.c
@@ -109,3 +109,54 @@ retry:
move_to_new_class(tsk, newclass);
kref_put(&oldclass->ref, ckrm_release_class);
}
+
+void ckrm_init_task(struct task_struct *tsk)
+{
+ struct ckrm_class *class;
+
+ /*
+ * processes inherit their class from their real parent, and
+ * threads inherit class from their process.
+ */
+ if (thread_group_leader(tsk))
+ class = tsk->real_parent->class;
+ else
+ class = tsk->group_leader->class;
+
+ tsk->class = CKRM_NO_CLASS;
+ INIT_LIST_HEAD(&tsk->member_list);
+
+ BUG_ON(class == NULL);
+ kref_get(&class->ref);
+ move_to_new_class(tsk, class);
+ notify_res_ctlrs(tsk, CKRM_NO_CLASS, class);
+}
+
+void ckrm_clear_task(struct task_struct *tsk)
+{
+ ckrm_setclass(tsk, CKRM_NO_CLASS);
+}
+
+/*
+ * Move all tasks in the given class to its parent.
+ */
+void ckrm_move_tasks_to_parent(struct ckrm_class *class)
+{
+ kref_get(&class->ref);
+
+next_task:
+ spin_lock(&class->class_lock);
+ if (!list_empty(&class->task_list)) {
+ struct task_struct *tsk =
+ list_entry(class->task_list.next,
+ struct task_struct, member_list);
+ get_task_struct(tsk);
+ spin_unlock(&class->class_lock);
+ kref_get(&class->parent->ref);
+ ckrm_setclass(tsk, class->parent);
+ put_task_struct(tsk);
+ goto next_task;
+ }
+ spin_unlock(&class->class_lock);
+ kref_put(&class->ref, ckrm_release_class);
+}
--
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [EMAIL PROTECTED] | .......you may get it.
----------------------------------------------------------------------
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech