linux/arch/s390/kernel
Peter Zijlstra 5fbd036b55 sched: Cleanup cpu_active madness
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.

Reported-by: Stepan Moskovchenko <stepanm@codeaurora.org>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1323965362.18942.71.camel@twins
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2012-03-12 20:43:15 +01:00
..
vdso32 [S390] vdso: disable gcov profiling 2011-05-23 10:24:29 +02:00
vdso64 [S390] vdso: disable gcov profiling 2011-05-23 10:24:29 +02:00
asm-offsets.c [S390] cleanup trap handling 2011-12-27 11:27:12 +01:00
audit.c [S390] Get rid of a bunch of sparse warnings again. 2007-10-12 16:13:06 +02:00
audit.h [S390] Get rid of a bunch of sparse warnings again. 2007-10-12 16:13:06 +02:00
base.S [S390] entry[64].S improvements 2011-12-27 11:27:12 +01:00
bitmap.c [S390] move EXPORT_SYMBOLs to definitions 2009-03-26 15:24:11 +01:00
compat_audit.c [S390] Get rid of a bunch of sparse warnings again. 2007-10-12 16:13:06 +02:00
compat_exec_domain.c
compat_linux.c [S390] ipc: call generic sys_ipc demultiplexer 2011-12-27 11:27:13 +01:00
compat_linux.h Mark arguments to certain syscalls as being const 2010-08-13 16:53:13 -07:00
compat_ptrace.h [S390] ptrace cleanup 2011-01-05 12:47:31 +01:00
compat_signal.c [S390] return address of compat signals 2011-12-27 11:27:14 +01:00
compat_wrapper.S sys_poll: fix incorrect type for 'timeout' parameter 2012-02-21 17:24:20 -08:00
cpcmd.c [S390] convert cpcmd printks to pr_xxx macros. 2008-12-25 13:39:19 +01:00
crash_dump.c [S390] Remove error checking from copy_oldmem_page() 2011-10-30 15:16:47 +01:00
crash.c
debug.c switch debugfs to umode_t 2012-01-03 22:54:56 -05:00
diag.c [S390] replace diag10() with diag10_range() function 2011-05-10 17:13:43 +02:00
dis.c [S390] disassembler: mark exception causing instructions 2011-12-27 11:27:14 +01:00
early.c [S390] Check for NULL termination in command line setup 2011-12-27 11:25:48 +01:00
ebcdic.c
entry64.S [S390] cleanup trap handling 2011-12-27 11:27:12 +01:00
entry.h [S390] cleanup trap handling 2011-12-27 11:27:12 +01:00
entry.S [S390] cleanup trap handling 2011-12-27 11:27:12 +01:00
ftrace.c [S390] cleanup ftrace backend functions 2011-01-05 12:47:31 +01:00
head31.S [S390] smp: external call vs. emergency signal 2011-10-30 15:16:44 +01:00
head64.S [S390] smp: external call vs. emergency signal 2011-10-30 15:16:44 +01:00
head_kdump.S [S390] kdump backend code 2011-10-30 15:16:42 +01:00
head.S [S390] entry[64].S improvements 2011-12-27 11:27:12 +01:00
init_task.c Use new __init_task_data macro in arch init_task.c files. 2009-09-21 06:27:08 +02:00
ipl.c [S390] sparse: fix sparse warnings about missing prototypes 2011-10-30 15:16:46 +01:00
irq.c [S390] irqstats: split IPI interrupt accounting 2011-10-30 15:16:47 +01:00
jump_label.c s390/jump-label: add arch_jump_label_transform_static() 2011-10-25 11:54:37 -07:00
kprobes.c [S390] sparse: fix sparse static warnings 2011-10-30 15:16:46 +01:00
machine_kexec.c [S390] Add VMCOREINFO_SYMBOL(high_memory) to vmcoreinfo 2011-12-27 11:27:13 +01:00
Makefile [S390] topology: get rid of ifdefs 2011-12-27 11:27:10 +01:00
mcount64.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
mcount.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
mem_detect.c [S390] Rework create_mem_hole() function 2011-12-27 11:27:09 +01:00
module.c modules: make arch's use default loader hooks 2011-07-24 22:06:04 +09:30
nmi.c treewide: remove useless NORET_TYPE macro and uses 2012-01-12 20:13:03 -08:00
process.c sched/rt: Use schedule_preempt_disabled() 2012-03-01 10:28:03 +01:00
processor.c [S390] avoid warning in show_cpuinfo 2011-10-30 15:16:15 +01:00
ptrace.c compat: fix compile breakage on s390 2012-02-27 07:54:27 -08:00
reipl64.S [S390] entry[64].S improvements 2011-12-27 11:27:12 +01:00
reipl.S [S390] kdump backend code 2011-10-30 15:16:42 +01:00
relocate_kernel64.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
relocate_kernel.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
s390_ksyms.c [S390] move sie code to entry.S 2011-07-24 10:48:21 +02:00
sclp.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
setup.c compat: fix compile breakage on s390 2012-02-27 07:54:27 -08:00
signal.c compat: fix compile breakage on s390 2012-02-27 07:54:27 -08:00
smp.c sched: Cleanup cpu_active madness 2012-03-12 20:43:15 +01:00
stacktrace.c [S390] Fix stacktrace compile bug. 2008-07-17 17:22:09 +02:00
suspend.c [S390] sparse: fix sparse warnings about missing prototypes 2011-10-30 15:16:46 +01:00
switch_cpu64.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
switch_cpu.S [S390] fix s390 assembler code alignments 2011-07-24 10:48:21 +02:00
swsusp_asm64.S PM / Hibernate: Include storage keys in hibernation image on s390 2011-10-16 23:27:46 +02:00
sys_s390.c [S390] ipc: call generic sys_ipc demultiplexer 2011-12-27 11:27:13 +01:00
syscalls.S [S390] wire up process_vm syscalls 2011-11-14 11:19:08 +01:00
sysinfo.c [S390] sparse: fix sparse warnings in math-emu 2011-10-30 15:16:46 +01:00
time.c [S390] correct ktime to tod clock comparator conversion 2012-02-17 10:29:33 +01:00
topology.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2012-01-09 08:11:13 -08:00
traps.c [S390] Enable exception traces by default 2011-12-27 11:27:14 +01:00
vdso.c mm: arch: rename in_gate_area_no_task to in_gate_area_no_mm 2011-03-23 16:36:55 -04:00
vmlinux.lds.S [S390] cleanup entry point definition 2012-01-18 18:03:41 +01:00
vtime.c [S390] sparse: fix sparse static warnings 2011-10-30 15:16:46 +01:00