[PATCH] cpusets+hotplug+preepmt broken

This patch removes the entwining of cpusets and hotplug code in the "No
more Mr. Nice Guy" case of sched.c move_task_off_dead_cpu().

Since the hotplug code is holding a spinlock at this point, we cannot take
the cpuset semaphore, cpuset_sem, as would seem to be required either to
update the tasks cpuset, or to scan up the nested cpuset chain, looking for
the nearest cpuset ancestor that still has some CPUs that are online. So
we just punt and blast the tasks cpus_allowed with all bits allowed.

This reverts these lines of code to what they were before the cpuset patch.
And it updates the cpuset Doc file, to match.

The one known alternative to this that seems to work came from Dinakar
Guniguntala, and required the hotplug code to take the cpuset_sem semaphore
much earlier in its processing. So far as we know, the increased locking
entanglement between cpusets and hot plug of this alternative approach is
not worth doing in this case.

Signed-off-by: Paul Jackson <pj@sgi.com>
Acked-by: Nathan Lynch <ntl@pobox.com>
Acked-by: Dinakar Guniguntala <dino@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Paul Jackson and committed by Linus Torvalds b39c4fab b2665f92

+2 -3
+1 -2
Documentation/cpusets.txt
··· 252 There is an exception to the above. If hotplug funtionality is used 253 to remove all the CPUs that are currently assigned to a cpuset, 254 then the kernel will automatically update the cpus_allowed of all 255 - tasks attached to CPUs in that cpuset with the online CPUs of the 256 - nearest parent cpuset that still has some CPUs online. When memory 257 hotplug functionality for removing Memory Nodes is available, a 258 similar exception is expected to apply there as well. In general, 259 the kernel prefers to violate cpuset placement, over starving a task
··· 252 There is an exception to the above. If hotplug funtionality is used 253 to remove all the CPUs that are currently assigned to a cpuset, 254 then the kernel will automatically update the cpus_allowed of all 255 + tasks attached to CPUs in that cpuset to allow all CPUs. When memory 256 hotplug functionality for removing Memory Nodes is available, a 257 similar exception is expected to apply there as well. In general, 258 the kernel prefers to violate cpuset placement, over starving a task
+1 -1
kernel/sched.c
··· 4243 4244 /* No more Mr. Nice Guy. */ 4245 if (dest_cpu == NR_CPUS) { 4246 - tsk->cpus_allowed = cpuset_cpus_allowed(tsk); 4247 dest_cpu = any_online_cpu(tsk->cpus_allowed); 4248 4249 /*
··· 4243 4244 /* No more Mr. Nice Guy. */ 4245 if (dest_cpu == NR_CPUS) { 4246 + cpus_setall(tsk->cpus_allowed); 4247 dest_cpu = any_online_cpu(tsk->cpus_allowed); 4248 4249 /*