linux/arch/s390/kernel
Heiko Carstens 398812159e [S390] nohz/s390: fix arch_needs_cpu() return value on offline cpus
This fixes the same problem as described in the patch "nohz: fix
printk_needs_cpu() return value on offline cpus" for the arch_needs_cpu()
primitive:

arch_needs_cpu() may return 1 if called on offline cpus. When a cpu gets
offlined it schedules the idle process which, before killing its own cpu,
will call tick_nohz_stop_sched_tick().
That function in turn will call arch_needs_cpu() in order to check if the
local tick can be disabled. On offline cpus this function should naturally
return 0 since regardless if the tick gets disabled or not the cpu will be
dead short after. That is besides the fact that __cpu_disable() should already
have made sure that no interrupts on the offlined cpu will be delivered anyway.

In this case it prevents tick_nohz_stop_sched_tick() to call
select_nohz_load_balancer(). No idea if that really is a problem. However what
made me debug this is that on 2.6.32 the function get_nohz_load_balancer() is
used within __mod_timer() to select a cpu on which a timer gets enqueued.
If arch_needs_cpu() returns 1 then the nohz_load_balancer cpu doesn't get
updated when a cpu gets offlined. It may contain the cpu number of an offline
cpu. In turn timers get enqueued on an offline cpu and not very surprisingly
they never expire and cause system hangs.

This has been observed 2.6.32 kernels. On current kernels __mod_timer() uses
get_nohz_timer_target() which doesn't have that problem. However there might
be other problems because of the too early exit tick_nohz_stop_sched_tick()
in case a cpu goes offline.

This specific bug was indrocuded with 3c5d92a0 "nohz: Introduce
arch_needs_cpu".

In this case a cpu hotplug notifier is used to fix the issue in order to keep
the normal/fast path small. All we need to do is to clear the condition that
makes arch_needs_cpu() return 1 since it is just a performance improvement
which is supposed to keep the local tick running for a short period if a cpu
goes idle. Nothing special needs to be done except for clearing the condition.

Cc: stable@kernel.org
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2010-12-01 10:08:17 +01:00
..
vdso32 [S390] vdso: get rid of redefinition warnings 2010-10-29 16:50:50 +02:00
vdso64 [S390] vdso: get rid of redefinition warnings 2010-10-29 16:50:50 +02:00
asm-offsets.c [S390] vdso: get rid of redefinition warnings 2010-10-29 16:50:50 +02:00
audit.c
audit.h
base.S [S390] Cleanup struct _lowcore usage and defines. 2010-02-26 22:37:31 +01:00
bitmap.c [S390] move EXPORT_SYMBOLs to definitions 2009-03-26 15:24:11 +01:00
compat_audit.c
compat_exec_domain.c
compat_linux.c BKL: remove extraneous #include <smp_lock.h> 2010-11-17 08:59:32 -08:00
compat_linux.h Mark arguments to certain syscalls as being const 2010-08-13 16:53:13 -07:00
compat_ptrace.h [S390] remove ieee_instruction_pointer from thread_struct 2010-10-25 16:10:20 +02:00
compat_signal.c [S390] 64-bit register support for 31-bit processes 2009-10-06 10:35:10 +02:00
compat_wrapper.S [S390] wire up prlimit64 and fanotify* syscalls 2010-08-13 10:06:54 +02:00
cpcmd.c
crash.c
debug.c llseek: automatically add .llseek fop 2010-10-15 15:53:27 +02:00
diag.c
dis.c [S390] add z196 instructions to kernel disassembler 2010-10-25 16:10:15 +02:00
early.c [S390] facility detection: remove unused variable 2010-10-29 16:50:50 +02:00
ebcdic.c
entry64.S [S390] fix kprobes single stepping 2010-10-29 16:50:50 +02:00
entry.h [S390] cleanup lowcore access from external interrupts 2010-10-25 16:10:19 +02:00
entry.S [S390] fix kprobes single stepping 2010-10-29 16:50:50 +02:00
ftrace.c Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-02-28 10:17:55 -08:00
head31.S [S390] correct address of _stext with CONFIG_SHARED_KERNEL=y 2010-05-12 09:32:26 +02:00
head64.S [S390] correct address of _stext with CONFIG_SHARED_KERNEL=y 2010-05-12 09:32:26 +02:00
head.S [S390] Add config option for z196 code generation. 2010-10-25 16:10:15 +02: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 sysfs: add struct file* to bin_attr callbacks 2010-05-21 09:37:31 -07:00
irq.c [S390] Fix init irq proc build break. 2009-02-11 10:37:39 +01:00
kprobes.c [S390] kprobes: Fix the return address of multiple kretprobes 2010-11-10 10:05:54 +01:00
machine_kexec.c [S390] smp: always reboot on cpu 0 2010-02-26 22:37:30 +01:00
Makefile [S390] add support for compressed kernels 2010-02-26 22:37:33 +01:00
mcount64.S [S390] improve mcount code 2009-09-11 10:29:43 +02:00
mcount.S [S390] improve mcount code 2009-09-11 10:29:43 +02:00
mem_detect.c Fix IRQ flag handling naming 2010-10-07 14:08:55 +01:00
module.c modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
nmi.c [S390] nmi: fix clock comparator revalidation 2010-11-25 09:52:59 +01:00
process.c [S390] cpu hotplug/idle: move cpu_die call to enabled context 2010-10-25 16:10:15 +02:00
processor.c [S390] smp: use correct cpu address in print_cpu_info() 2010-10-25 16:10:20 +02:00
ptrace.c ptrace: change signature of arch_ptrace() 2010-10-27 18:03:10 -07:00
reipl64.S [S390] Cleanup struct _lowcore usage and defines. 2010-02-26 22:37:31 +01:00
reipl.S [S390] Cleanup struct _lowcore usage and defines. 2010-02-26 22:37:31 +01:00
relocate_kernel64.S
relocate_kernel.S
s390_ext.c [S390] cleanup lowcore access from external interrupts 2010-10-25 16:10:19 +02:00
s390_ksyms.c [S390] move EXPORT_SYMBOLs to definitions 2009-03-26 15:24:11 +01:00
sclp.S Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
setup.c [S390] Add z196 machine type to setup_hwcaps 2010-10-29 16:50:49 +02:00
signal.c [S390] add breaking event address for user space 2010-05-17 10:00:15 +02:00
smp.c [S390] cleanup facility list handling 2010-10-25 16:10:21 +02:00
stacktrace.c
suspend.c [S390] hibernate: make sure pfn_is_nosave handles lowcore pages 2009-09-22 22:58:45 +02:00
switch_cpu64.S [S390] Cleanup struct _lowcore usage and defines. 2010-02-26 22:37:31 +01:00
switch_cpu.S [S390] Cleanup struct _lowcore usage and defines. 2010-02-26 22:37:31 +01:00
swsusp_asm64.S Merge branch 'for-35' of git://repo.or.cz/linux-kbuild 2010-06-01 08:55:52 -07:00
sys_s390.c [S390] sys_personality: follow u_long to unsigned int conversion 2010-08-13 10:06:54 +02:00
syscalls.S [S390] wire up prlimit64 and fanotify* syscalls 2010-08-13 10:06:54 +02:00
sysinfo.c [S390] topology: add SCHED_MC config option 2010-10-29 16:50:49 +02:00
time.c [S390] cleanup lowcore access from external interrupts 2010-10-25 16:10:19 +02:00
topology.c [S390] topology: fix cpu masks for topology=off case 2010-10-29 16:50:50 +02:00
traps.c [S390] remove ieee_instruction_pointer from thread_struct 2010-10-25 16:10:20 +02:00
vdso.c [S390] cleanup facility list handling 2010-10-25 16:10:21 +02:00
vmlinux.lds.S [S390] Enable kmemleak on s390. 2009-10-06 10:35:06 +02:00
vtime.c [S390] nohz/s390: fix arch_needs_cpu() return value on offline cpus 2010-12-01 10:08:17 +01:00