Lai Jiangshan
2e084786f6
sched: fair group: fix overflow(was: fix divide by zero)
...
I found a bug which can be reproduced by this way:(linux-2.6.26-rc5, x86-64)
(use 2^32, 2^33, ...., 2^63 as shares value)
# mkdir /dev/cpuctl
# mount -t cgroup -o cpu cpuctl /dev/cpuctl
# cd /dev/cpuctl
# mkdir sub
# echo 0x8000000000000000 > sub/cpu.shares
# echo $$ > sub/tasks
oops here! divide by zero.
This is because do_div() expects the 2th parameter to be 32 bits,
but unsigned long is 64 bits in x86_64.
Peter Zijstra pointed it out that the sane thing to do is limit the
shares value to something smaller instead of using an even more
expensive divide.
Also, I found another bug about "the shares value is too large":
pid1 and pid2 are set affinity to cpu#0
pid1 is attached to cg1 and pid2 is attached to cg2
if cg1/cpu.shares = 1024 cg2/cpu.shares = 2000000000
then pid2 got 100% usage of cpu, and pid1 0%
if cg1/cpu.shares = 1024 cg2/cpu.shares = 20000000000
then pid2 got 0% usage of cpu, and pid1 100%
And a weight of a cfs_rq is the sum of weights of which entities
are queued on this cfs_rq, so the shares value should be limited
to a smaller value.
I think that (1UL << 18) is a good limited value:
1) it's not too large, we can create a lot of group before overflow
2) it's several times the weight value for nice=-19 (not too small)
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-06-12 14:23:55 +02:00
..
irq
genirq: reenable a nobody cared disabled irq when a new driver arrives
2008-05-02 13:40:34 +02:00
power
Merge branches 'release', 'acpica', 'bugzilla-10224', 'bugzilla-9772', 'bugzilla-9916', 'ec', 'eeepc', 'idle', 'misc', 'pm-legacy', 'sysfs-links-2.6.26', 'thermal', 'thinkpad' and 'video' into release
2008-04-30 13:58:00 -04:00
time
clocksource: allow read access to available/current_clocksource
2008-05-03 18:11:48 +02:00
.gitignore
acct.c
audit.c
[patch 1/1] audit_send_reply(): fix error-path memory leak
2008-05-17 03:30:22 -04:00
audit.h
audit_tree.c
[PATCH] list_for_each_rcu must die: audit
2008-05-17 03:30:23 -04:00
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c
cgroup.c
cgroups: remove node_ prefix_from ns subsystem
2008-05-24 09:56:14 -07:00
cgroup_debug.c
compat.c
ntp: support for TAI
2008-05-01 08:03:59 -07:00
configs.c
cpu.c
kernel: replace remaining __FUNCTION__ occurrences
2008-04-30 08:29:54 -07:00
cpuset.c
Fix cpuset sched_relax_domain_level control file
2008-05-08 10:46:56 -07:00
delayacct.c
dma.c
exec_domain.c
exit.c
signals: fix sigqueue_free() vs __exit_signal() race
2008-05-24 09:56:10 -07:00
extable.c
fork.c
[PATCH] dup_fd() fixes, part 1
2008-05-16 17:22:26 -04:00
futex.c
Removal of FUTEX_FD
2008-05-05 08:18:45 -07:00
futex_compat.c
hrtimer.c
hrtimer: remove duplicate helper function
2008-05-03 18:11:48 +02:00
itimer.c
kallsyms.c
Kconfig.hz
Kconfig.preempt
kexec.c
kexec: make extended crashkernel= syntax less confusing
2008-05-01 08:04:00 -07:00
kfifo.c
kgdb.c
kgdb: use common ascii helpers and put_unaligned_be32 helper
2008-05-28 12:49:56 -05:00
kmod.c
[PATCH] split linux/file.h
2008-05-01 13:08:16 -04:00
kprobes.c
ksysfs.c
kthread.c
Deprecate find_task_by_pid()
2008-04-30 08:29:48 -07:00
latencytop.c
lockdep.c
lockdep_internals.h
lockdep_proc.c
Makefile
sched: add optional support for CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
2008-05-05 23:56:18 +02:00
marker.c
make marker_debug static
2008-04-30 08:29:49 -07:00
module.c
modules: proper cleanup of kobject without CONFIG_SYSFS
2008-05-23 13:09:33 +10:00
mutex-debug.c
mutex-debug.h
mutex.c
mutex.h
notifier.c
ns_cgroup.c
nsproxy.c
panic.c
params.c
pid.c
pids: introduce change_pid() helper
2008-04-30 08:29:48 -07:00
pid_namespace.c
pidns: make pid->level and pid_ns->level unsigned
2008-04-30 08:29:49 -07:00
pm_qos_params.c
posix-cpu-timers.c
remove div_long_long_rem
2008-05-01 08:03:58 -07:00
posix-timers.c
signals: join send_sigqueue() with send_group_sigqueue()
2008-04-30 08:29:36 -07:00
printk.c
printk: don't read beyond string arguments' terminating zero
2008-04-30 08:29:52 -07:00
profile.c
ptrace.c
make generic sys_ptrace unconditional
2008-05-01 10:21:54 -07:00
rcuclassic.c
rcupdate.c
rcupreempt.c
rcupreempt_trace.c
rcutorture.c
relay.c
splice: fix sendfile() issue with relay
2008-05-28 14:49:27 +02:00
res_counter.c
resource.c
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
rtmutex.h
rtmutex_common.h
rwsem.c
sched.c
sched: fair group: fix overflow(was: fix divide by zero)
2008-06-12 14:23:55 +02:00
sched_clock.c
sched: fix sched_clock_cpu()
2008-05-29 11:29:19 +02:00
sched_debug.c
revert ("sched: fair-group: SMP-nice for group scheduling")
2008-05-29 11:28:57 +02:00
sched_fair.c
sched: stop wake_affine from causing serious imbalance
2008-05-29 11:29:20 +02:00
sched_features.h
sched_idletask.c
sched: make rt_sched_class, idle_sched_class static
2008-05-05 23:56:17 +02:00
sched_rt.c
revert ("sched: fair-group: SMP-nice for group scheduling")
2008-05-29 11:28:57 +02:00
sched_stats.h
show_schedstat(): fix memleak
2008-05-29 11:25:15 +02:00
seccomp.c
semaphore.c
Revert "semaphore: fix"
2008-05-10 20:43:22 -07:00
signal.c
posix timers: discard SI_TIMER signals on exec
2008-05-26 10:37:07 -07:00
softirq.c
Fix cpu hotplug problem in softirq code
2008-05-01 08:03:58 -07:00
softlockup.c
spinlock.c
srcu.c
stacktrace.c
stop_machine.c
stop_machine: make stop_machine_run more virtualization friendly
2008-05-23 13:09:34 +10:00
sys.c
sys_prctl(): fix return of uninitialized value
2008-05-24 09:56:13 -07:00
sys_ni.c
sysctl.c
[PATCH] avoid multiplication overflows and signedness issues for max_fds
2008-05-16 17:22:52 -04:00
sysctl_check.c
taskstats.c
Use find_task_by_vpid in taskstats
2008-04-30 08:29:48 -07:00
test_kprobes.c
time.c
Make constants in kernel/timeconst.h fixed 64 bits
2008-05-02 16:18:42 -07:00
timeconst.pl
Make constants in kernel/timeconst.h fixed 64 bits
2008-05-02 16:18:42 -07:00
timer.c
debugobjects: add timer specific object debugging code
2008-04-30 08:29:53 -07:00
tsacct.c
uid16.c
user.c
alloc_uid: cleanup
2008-04-30 08:29:53 -07:00
user_namespace.c
utsname.c
utsname_sysctl.c
wait.c
workqueue.c
workqueue: remove redundant function invocation
2008-05-01 08:04:02 -07:00