diff -Naurp linux-2.6.12-rc2-mm3.orig/include/linux/cpuset.h linux-2.6.12-rc2-mm3-0/include/linux/cpuset.h --- linux-2.6.12-rc2-mm3.orig/include/linux/cpuset.h 2005-05-11 19:44:42.000000000 +0530 +++ linux-2.6.12-rc2-mm3-0/include/linux/cpuset.h 2005-05-12 16:54:15.000000000 +0530 @@ -19,6 +19,7 @@ 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(const struct task_struct *p); +extern const cpumask_t cpuset_task_cpus_allowed(const struct task_struct *p); void cpuset_init_current_mems_allowed(void); void cpuset_update_current_mems_allowed(void); void cpuset_restrict_to_mems_allowed(unsigned long *nodes); @@ -38,6 +39,10 @@ static inline cpumask_t cpuset_cpus_allo { return cpu_possible_map; } +static inline cpumask_t cpuset_task_cpus_allowed(struct task_struct *p) +{ + return cpu_possible_map; +} static inline void cpuset_init_current_mems_allowed(void) {} static inline void cpuset_update_current_mems_allowed(void) {} diff -Naurp linux-2.6.12-rc2-mm3.orig/kernel/cpuset.c linux-2.6.12-rc2-mm3-0/kernel/cpuset.c --- linux-2.6.12-rc2-mm3.orig/kernel/cpuset.c 2005-05-11 19:44:42.000000000 +0530 +++ linux-2.6.12-rc2-mm3-0/kernel/cpuset.c 2005-05-12 17:19:53.000000000 +0530 @@ -1445,6 +1445,31 @@ cpumask_t cpuset_cpus_allowed(const stru return mask; } +/** + * cpuset_task_cpus_allowed - return cpus_allowed mask from a tasks cpuset. + * @tsk: pointer to task_struct from which to obtain cpuset->cpus_allowed. + * + * Description: Returns the cpumask_t cpus_allowed of the cpuset + * attached to the specified @tsk. Unlike cpuset_cpus_allowed(), + * is not guaranteed to return a non-empty subset of cpu_online_map. + * Does not walk up the cpuset hierarchy, and does not attempt to + * acquire the cpuset_sem. If called on a task about to exit, + * where tsk->cpuset is already NULL, return cpu_online_map. + * + * Call with task locked. + **/ + +const cpumask_t cpuset_task_cpus_allowed(const struct task_struct *tsk) +{ + struct cpuset *cs = tsk->cpuset; + + if (!cs) + return cpu_online_map; + if (cpus_intersects(cs->cpus_allowed, cpu_online_map)) + return cs->cpus_allowed; + return cpu_online_map; +} + void cpuset_init_current_mems_allowed(void) { current->mems_allowed = NODE_MASK_ALL; diff -Naurp linux-2.6.12-rc2-mm3.orig/kernel/sched.c linux-2.6.12-rc2-mm3-0/kernel/sched.c --- linux-2.6.12-rc2-mm3.orig/kernel/sched.c 2005-05-11 19:44:42.000000000 +0530 +++ linux-2.6.12-rc2-mm3-0/kernel/sched.c 2005-05-12 16:50:04.000000000 +0530 @@ -4301,7 +4301,7 @@ static void move_task_off_dead_cpu(int d /* No more Mr. Nice Guy. */ if (dest_cpu == NR_CPUS) { - tsk->cpus_allowed = cpuset_cpus_allowed(tsk); + tsk->cpus_allowed = cpuset_task_cpus_allowed(tsk); dest_cpu = any_online_cpu(tsk->cpus_allowed); /*