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