Register a task watcher for cpusets instead of hooking into copy_process() and do_exit() directly. Signed-off-by: Matt Helsley Cc: Paul Jackson --- include/linux/cpuset.h | 4 ---- kernel/cpuset.c | 11 +++++++++-- kernel/exit.c | 2 -- kernel/fork.c | 6 +----- 4 files changed, 10 insertions(+), 13 deletions(-) Index: linux-2.6.19/kernel/fork.c =================================================================== --- linux-2.6.19.orig/kernel/fork.c +++ linux-2.6.19/kernel/fork.c @@ -28,11 +28,10 @@ #include #include #include #include #include -#include #include #include #include #include #include @@ -1060,17 +1059,16 @@ static struct task_struct *copy_process( p->tgid = current->tgid; retval = notify_task_watchers(WATCH_TASK_INIT, clone_flags, p); if (retval < 0) goto bad_fork_cleanup_delays_binfmt; - cpuset_fork(p); #ifdef CONFIG_NUMA p->mempolicy = mpol_copy(p->mempolicy); if (IS_ERR(p->mempolicy)) { retval = PTR_ERR(p->mempolicy); p->mempolicy = NULL; - goto bad_fork_cleanup_cpuset; + goto bad_fork_cleanup_delays_binfmt; } mpol_fix_fork_child_flag(p); #endif #ifdef CONFIG_TRACE_IRQFLAGS p->irq_events = 0; @@ -1279,13 +1277,11 @@ bad_fork_cleanup_files: bad_fork_cleanup_security: security_task_free(p); bad_fork_cleanup_policy: #ifdef CONFIG_NUMA mpol_free(p->mempolicy); -bad_fork_cleanup_cpuset: #endif - cpuset_exit(p); bad_fork_cleanup_delays_binfmt: delayacct_tsk_free(p); notify_task_watchers(WATCH_TASK_FREE, 0, p); if (p->binfmt) module_put(p->binfmt->module); Index: linux-2.6.19/kernel/cpuset.c =================================================================== --- linux-2.6.19.orig/kernel/cpuset.c +++ linux-2.6.19/kernel/cpuset.c @@ -47,10 +47,11 @@ #include #include #include #include #include +#include #include #include #include @@ -2173,17 +2174,20 @@ void __init cpuset_init_smp(void) * * At the point that cpuset_fork() is called, 'current' is the parent * task, and the passed argument 'child' points to the child task. **/ -void cpuset_fork(struct task_struct *child) +static int __task_init cpuset_fork(unsigned long clone_flags, + struct task_struct *child) { task_lock(current); child->cpuset = current->cpuset; atomic_inc(&child->cpuset->count); task_unlock(current); + return 0; } +DEFINE_TASK_INITCALL(cpuset_fork); /** * cpuset_exit - detach cpuset from exiting task * @tsk: pointer to task_struct of exiting process * @@ -2240,11 +2244,12 @@ void cpuset_fork(struct task_struct *chi * to NULL here, and check in cpuset_update_task_memory_state() * for a NULL pointer. This hack avoids that NULL check, for no * cost (other than this way too long comment ;). **/ -void cpuset_exit(struct task_struct *tsk) +static int __task_free cpuset_exit(unsigned long exit_code, + struct task_struct *tsk) { struct cpuset *cs; cs = tsk->cpuset; tsk->cpuset = &top_cpuset; /* the_top_cpuset_hack - see above */ @@ -2258,11 +2263,13 @@ void cpuset_exit(struct task_struct *tsk mutex_unlock(&manage_mutex); cpuset_release_agent(pathbuf); } else { atomic_dec(&cs->count); } + return 0; } +DEFINE_TASK_FREECALL(cpuset_exit); /** * cpuset_cpus_allowed - return cpus_allowed mask from a tasks cpuset. * @tsk: pointer to task_struct from which to obtain cpuset->cpus_allowed. * Index: linux-2.6.19/kernel/exit.c =================================================================== --- linux-2.6.19.orig/kernel/exit.c +++ linux-2.6.19/kernel/exit.c @@ -28,11 +28,10 @@ #include #include #include #include #include -#include #include #include #include #include #include @@ -918,11 +917,10 @@ fastcall NORET_TYPE void do_exit(long co if (group_dead) acct_process(); __exit_files(tsk); __exit_fs(tsk); exit_thread(); - cpuset_exit(tsk); exit_keys(tsk); if (group_dead && tsk->signal->leader) disassociate_ctty(1); Index: linux-2.6.19/include/linux/cpuset.h =================================================================== --- linux-2.6.19.orig/include/linux/cpuset.h +++ linux-2.6.19/include/linux/cpuset.h @@ -17,12 +17,10 @@ extern int number_of_cpusets; /* How many cpusets are defined in system? */ extern int cpuset_init_early(void); extern int cpuset_init(void); extern void cpuset_init_smp(void); -extern void cpuset_fork(struct task_struct *p); -extern void cpuset_exit(struct task_struct *p); extern cpumask_t cpuset_cpus_allowed(struct task_struct *p); extern nodemask_t cpuset_mems_allowed(struct task_struct *p); void cpuset_init_current_mems_allowed(void); void cpuset_update_task_memory_state(void); #define cpuset_nodes_subset_current_mems_allowed(nodes) \ @@ -68,12 +66,10 @@ extern void cpuset_track_online_nodes(vo #else /* !CONFIG_CPUSETS */ static inline int cpuset_init_early(void) { return 0; } static inline int cpuset_init(void) { return 0; } static inline void cpuset_init_smp(void) {} -static inline void cpuset_fork(struct task_struct *p) {} -static inline void cpuset_exit(struct task_struct *p) {} static inline cpumask_t cpuset_cpus_allowed(struct task_struct *p) { return cpu_possible_map; } -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/