linux/kernel
黄涛 dbc0fca461 sched: Cleanup cpu_active madness
commit 5fbd036b55 upstream.

Stepan found:

CPU0		CPUn

_cpu_up()
  __cpu_up()

		boostrap()
		  notify_cpu_starting()
		  set_cpu_online()
		  while (!cpu_active())
		    cpu_relax()

<PREEMPT-out>

smp_call_function(.wait=1)
  /* we find cpu_online() is true */
  arch_send_call_function_ipi_mask()

  /* wait-forever-more */

<PREEMPT-in>
		  local_irq_enable()

  cpu_notify(CPU_ONLINE)
    sched_cpu_active()
      set_cpu_active()

Now the purpose of cpu_active is mostly with bringing down a cpu, where
we mark it !active to avoid the load-balancer from moving tasks to it
while we tear down the cpu. This is required because we only update the
sched_domain tree after we brought the cpu-down. And this is needed so
that some tasks can still run while we bring it down, we just don't want
new tasks to appear.

On cpu-up however the sched_domain tree doesn't yet include the new cpu,
so its invisible to the load-balancer, regardless of the active state.
So instead of setting the active state after we boot the new cpu (and
consequently having to wait for it before enabling interrupts) set the
cpu active before we set it online and avoid the whole mess.
2012-07-12 09:49:51 +08:00
..
debug
events perf: Fix software event overflow 2011-08-04 21:58:35 -07:00
gcov Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
irq revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
power rk: earlysuspend: only works on system is running 2012-05-31 09:43:26 +08:00
time Fix "time: Catch invalid timespec sleep values in __timekeeping_inject_sleeptime" to compile on 3.0 2011-11-22 16:49:43 -08:00
trace revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
.gitignore
acct.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
async.c
audit_tree.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
audit_watch.c
audit.c
audit.h
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
cgroup_freezer.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
cgroup.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
compat.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
configs.c
cpu_pm.c cpu_pm: call notifiers during suspend 2012-02-22 14:09:44 +08:00
cpu.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
cpuset.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
crash_dump.c
cred.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
extable.c
fork.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
freezer.c
futex_compat.c
futex.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
groups.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
hrtimer.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
hung_task.c
irq_work.c
itimer.c
jump_label.c jump_label: Fix jump_label update for modules 2011-06-29 09:59:17 -04:00
kallsyms.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kexec.c
kfifo.c
kmod.c
kprobes.c
ksysfs.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
kthread.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
latencytop.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
lockdep_internals.h
lockdep_proc.c
lockdep_states.h
lockdep.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:01:15 +08:00
Makefile cpu_pm: Add cpu power management notifiers 2012-02-22 14:09:44 +08:00
module.c rk: module.c: enable debug locks for rk plat 2012-03-26 14:39:56 +08:00
mutex-debug.c
mutex-debug.h
mutex.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
mutex.h
notifier.c
nsproxy.c
padata.c
panic.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
params.c
pid_namespace.c
pid.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
pm_qos_params.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
posix-cpu-timers.c cputimer: Cure lock inversion 2011-10-25 07:10:14 +02:00
posix-timers.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
printk.c Merge remote-tracking branch 'remotes/aosp/android-3.0' into develop-3.0 2011-11-09 13:06:28 +08:00
profile.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
ptrace.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
range.c
rcupdate.c
rcutiny_plugin.h
rcutiny.c
rcutorture.c
rcutree_plugin.h Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
rcutree_trace.c
rcutree.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
rcutree.h Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
relay.c
res_counter.c
resource.c resource: ability to resize an allocated resource 2011-07-06 10:54:08 -07:00
rtmutex_common.h
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c plist: Remove the need to supply locks to plist heads 2011-07-08 14:15:44 -07:00
rtmutex.h
rwsem.c
sched_autogroup.c
sched_autogroup.h
sched_clock.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
sched_cpupri.c
sched_cpupri.h
sched_debug.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
sched_fair.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
sched_features.h Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
sched_idletask.c Revert "Merge remote branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:24:52 +08:00
sched_rt.c sched/rt: Migrate equal priority tasks to available CPUs 2011-10-16 14:14:51 -07:00
sched_stats.h
sched_stoptask.c
sched.c sched: Cleanup cpu_active madness 2012-07-12 09:49:51 +08:00
seccomp.c
semaphore.c
signal.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
smp.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
softirq.c Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop" 2011-07-30 16:09:59 +08:00
spinlock.c
srcu.c
stacktrace.c
stop_machine.c x86, mtrr: lock stop machine during MTRR rendezvous sequence 2011-08-29 13:29:08 -07:00
sys_ni.c
sys.c Merge remote-tracking branch 'remotes/aosp/android-3.0' into develop-3.0 2011-11-09 13:06:28 +08:00
sysctl_binary.c
sysctl_check.c Revert "Merge commit 'v2.6.32.9' into android-2.6.32" 2011-07-30 22:24:29 +08:00
sysctl.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
taskstats.c
test_kprobes.c
time.c
timeconst.pl
timer.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
tracepoint.c
tsacct.c
uid16.c
up.c
user_namespace.c
user-return-notifier.c
user.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
utsname_sysctl.c
utsname.c
wait.c
watchdog.c revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36 2011-10-28 16:02:47 +08:00
workqueue_sched.h
workqueue.c workqueue: lock cwq access in drain_workqueue 2011-10-03 11:40:31 -07:00