diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-05 13:03:28 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-05 13:03:35 +0100 |
commit | 83895147b702434e6f236deeca75211fd0e3da3a (patch) | |
tree | 550a8a8828592d9aa110d1851cc52e0f2c95bac7 | |
parent | a6a95406c676ffe4f9dee708eb404a17c69f7fdd (diff) | |
parent | 483b4ee60edbefdfbff0dd538fb81f368d9e7c0d (diff) | |
download | op-kernel-dev-83895147b702434e6f236deeca75211fd0e3da3a.zip op-kernel-dev-83895147b702434e6f236deeca75211fd0e3da3a.tar.gz |
Merge branch 'sched/urgent' into timers/urgent
Merging it here because an upcoming timers/urgent fix relies on
a change already in sched/urgent and not yet upstream.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/sched.c | 17 |
2 files changed, 12 insertions, 6 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 5a7c763..2127e95 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -443,6 +443,7 @@ struct pacct_struct { * @utime: time spent in user mode, in &cputime_t units * @stime: time spent in kernel mode, in &cputime_t units * @sum_exec_runtime: total time spent on the CPU, in nanoseconds + * @lock: lock for fields in this struct * * This structure groups together three kinds of CPU time that are * tracked for threads and thread groups. Most things considering diff --git a/kernel/sched.c b/kernel/sched.c index 242d0d4..e1fc67d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -3890,19 +3890,24 @@ int select_nohz_load_balancer(int stop_tick) int cpu = smp_processor_id(); if (stop_tick) { - cpumask_set_cpu(cpu, nohz.cpu_mask); cpu_rq(cpu)->in_nohz_recently = 1; - /* - * If we are going offline and still the leader, give up! - */ - if (!cpu_active(cpu) && - atomic_read(&nohz.load_balancer) == cpu) { + if (!cpu_active(cpu)) { + if (atomic_read(&nohz.load_balancer) != cpu) + return 0; + + /* + * If we are going offline and still the leader, + * give up! + */ if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu) BUG(); + return 0; } + cpumask_set_cpu(cpu, nohz.cpu_mask); + /* time for ilb owner also to sleep */ if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) { if (atomic_read(&nohz.load_balancer) == cpu) |