diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 8ee437a5ec1d..e72485033c48 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -3890,19 +3890,24 @@ int select_nohz_load_balancer(int stop_tick) | |||
| 3890 | int cpu = smp_processor_id(); | 3890 | int cpu = smp_processor_id(); |
| 3891 | 3891 | ||
| 3892 | if (stop_tick) { | 3892 | if (stop_tick) { |
| 3893 | cpumask_set_cpu(cpu, nohz.cpu_mask); | ||
| 3894 | cpu_rq(cpu)->in_nohz_recently = 1; | 3893 | cpu_rq(cpu)->in_nohz_recently = 1; |
| 3895 | 3894 | ||
| 3896 | /* | 3895 | if (!cpu_active(cpu)) { |
| 3897 | * If we are going offline and still the leader, give up! | 3896 | if (atomic_read(&nohz.load_balancer) != cpu) |
| 3898 | */ | 3897 | return 0; |
| 3899 | if (!cpu_active(cpu) && | 3898 | |
| 3900 | atomic_read(&nohz.load_balancer) == cpu) { | 3899 | /* |
| 3900 | * If we are going offline and still the leader, | ||
| 3901 | * give up! | ||
| 3902 | */ | ||
| 3901 | if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu) | 3903 | if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu) |
| 3902 | BUG(); | 3904 | BUG(); |
| 3905 | |||
| 3903 | return 0; | 3906 | return 0; |
| 3904 | } | 3907 | } |
| 3905 | 3908 | ||
| 3909 | cpumask_set_cpu(cpu, nohz.cpu_mask); | ||
| 3910 | |||
| 3906 | /* time for ilb owner also to sleep */ | 3911 | /* time for ilb owner also to sleep */ |
| 3907 | if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) { | 3912 | if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) { |
| 3908 | if (atomic_read(&nohz.load_balancer) == cpu) | 3913 | if (atomic_read(&nohz.load_balancer) == cpu) |
