kernel-ark/kernel
Christoph Lameter 0a2966b48f [PATCH] Fix longstanding load balancing bug in the scheduler
The scheduler will stop load balancing if the most busy processor contains
processes pinned via processor affinity.

The scheduler currently only does one search for busiest cpu.  If it cannot
pull any tasks away from the busiest cpu because they were pinned then the
scheduler goes into a corner and sulks leaving the idle processors idle.

F.e.  If you have processor 0 busy running four tasks pinned via taskset,
there are none on processor 1 and one just started two processes on
processor 2 then the scheduler will not move one of the two processes away
from processor 2.

This patch fixes that issue by forcing the scheduler to come out of its
corner and retrying the load balancing by considering other processors for
load balancing.

This patch was originally developed by John Hawkes and discussed at

    http://marc.theaimsgroup.com/?l=linux-kernel&m=113901368523205&w=2.

I have removed extraneous material and gone back to equipping struct rq
with the cpu the queue is associated with since this makes the patch much
easier and it is likely that others in the future will have the same
difficulty of figuring out which processor owns which runqueue.

The overhead added through these patches is a single word on the stack if
the kernel is configured to support 32 cpus or less (32 bit).  For 32 bit
environments the maximum number of cpus that can be configued is 255 which
would result in the use of 32 bytes additional on the stack.  On IA64 up to
1k cpus can be configured which will result in the use of 128 additional
bytes on the stack.  The maximum additional cache footprint is one
cacheline.  Typically memory use will be much less than a cacheline and the
additional cpumask will be placed on the stack in a cacheline that already
contains other local variable.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Cc: John Hawkes <hawkes@sgi.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Peter Williams <pwil3058@bigpond.net.au>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-09-26 08:48:43 -07:00
..
irq [PATCH] genirq core: fix handle_level_irq() 2006-09-19 07:57:20 -07:00
power [PATCH] prevent swsusp with PAE 2006-09-06 11:00:02 -07:00
time
.gitignore
acct.c
audit.c [PATCH] sanity check audit_buffer 2006-09-11 13:32:17 -04:00
audit.h [PATCH] audit: AUDIT_PERM support 2006-09-11 13:32:30 -04:00
auditfilter.c [PATCH] audit: AUDIT_PERM support 2006-09-11 13:32:30 -04:00
auditsc.c [PATCH] audit: AUDIT_PERM support 2006-09-11 13:32:30 -04:00
capability.c
compat.c
configs.c
cpu.c
cpuset.c [PATCH] cpuset: oom panic fix 2006-08-27 11:01:32 -07:00
delayacct.c [PATCH] task delay accounting fixes 2006-09-01 11:39:08 -07:00
dma.c
exec_domain.c
exit.c [PATCH] eligible_child: remove an obsolete ->tgid check 2006-09-02 14:51:27 -07:00
extable.c
fork.c [PATCH] task delay accounting fixes 2006-09-01 11:39:08 -07:00
futex_compat.c [PATCH] futex: Apply recent futex fixes to futex_compat 2006-08-06 08:57:49 -07:00
futex.c [PATCH] Use the correct restart option for futex_lock_pi 2006-09-08 10:22:50 -07:00
hrtimer.c [PATCH] fix hrtimer percpu usage typo 2006-08-14 12:54:28 -07:00
itimer.c
kallsyms.c
Kconfig.hz
Kconfig.preempt
kexec.c
kfifo.c
kmod.c [PATCH] bug fix in kernel/kmod.c 2006-09-16 12:54:32 -07:00
kprobes.c
ksysfs.c
kthread.c
lockdep_internals.h [PATCH] lockdep: double the number of stack-trace entries 2006-09-13 07:32:14 -07:00
lockdep_proc.c
lockdep.c
Makefile
module.c [PATCH] load_module: no BUG if module_subsys uninitialized 2006-09-25 17:38:36 -07:00
mutex-debug.c
mutex-debug.h
mutex.c
mutex.h
panic.c [PATCH] lockdep: do not touch console state when tainting the kernel 2006-09-06 11:00:02 -07:00
params.c
pid.c
posix-cpu-timers.c
posix-timers.c
printk.c
profile.c
ptrace.c
rcupdate.c [PATCH] rcu_do_batch: make ->qlen decrement irq safe 2006-09-13 07:32:14 -07:00
rcutorture.c
relay.c
resource.c
rtmutex_common.h
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
rtmutex.h
rwsem.c
sched.c [PATCH] Fix longstanding load balancing bug in the scheduler 2006-09-26 08:48:43 -07:00
seccomp.c
signal.c
softirq.c
softlockup.c
spinlock.c [PATCH] lockdep ifdef fix 2006-09-06 11:00:01 -07:00
stacktrace.c
stop_machine.c [PATCH] Remove redundant up() in stop_machine() 2006-08-27 11:01:31 -07:00
sys_ni.c
sys.c
sysctl.c
taskstats.c [NETLINK]: Extend netlink messaging interface 2006-09-22 14:53:43 -07:00
time.c
timer.c [PATCH] sys_getppid oopses on debug kernel 2006-08-14 12:54:29 -07:00
uid16.c
unwind.c
user.c
wait.c
workqueue.c [PATCH] workqueue: remove lock_cpu_hotplug() 2006-08-14 12:54:29 -07:00