Ingo Molnar
86998aa653
[PATCH] genirq core: fix handle_level_irq()
...
while porting the -rt tree to 2.6.18-rc7 i noticed the following
screaming-IRQ scenario on an SMP system:
2274 0Dn.:1 0.001ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.010ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.020ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.029ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.039ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.048ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.058ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.068ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.077ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.087ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
2274 0Dn.:1 0.097ms: do_IRQ+0xc/0x103 <= (ret_from_intr+0x0/0xf)
as it turns out, the bug is caused by handle_level_irq(), which if it
races with another CPU already handling this IRQ, it _unmasks_ the IRQ
line on the way out. This is not how 2.6.17 works, and we introduced
this bug in one of the early genirq cleanups right before it went into
-mm. (the bug was not in the genirq patchset for a long time, and we
didnt notice the bug due to the lack of -rt rebase to the new genirq
code. -rt, and hardirq-preemption in particular opens up such races much
wider than anything else.)
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-09-19 07:57:20 -07:00
..
irq
[PATCH] genirq core: fix handle_level_irq()
2006-09-19 07:57:20 -07:00
power
[PATCH] prevent swsusp with PAE
2006-09-06 11:00:02 -07:00
time
[PATCH] time: rename clocksource functions
2006-06-26 09:58:21 -07:00
.gitignore
acct.c
[PATCH] Fix sighand->siglock usage in kernel/acct.c
2006-07-14 21:53:54 -07:00
audit.c
[PATCH] sanity check audit_buffer
2006-09-11 13:32:17 -04:00
audit.h
[PATCH] audit: AUDIT_PERM support
2006-09-11 13:32:30 -04:00
auditfilter.c
[PATCH] audit: AUDIT_PERM support
2006-09-11 13:32:30 -04:00
auditsc.c
[PATCH] audit: AUDIT_PERM support
2006-09-11 13:32:30 -04:00
capability.c
[PATCH] sched: cleanup, remove task_t, convert to struct task_struct
2006-07-03 15:27:11 -07:00
compat.c
[PATCH] N32 sigset and __COMPAT_ENDIAN_SWAP__
2006-06-25 10:01:15 -07:00
configs.c
Remove obsolete #include <linux/config.h>
2006-06-30 19:25:36 +02:00
cpu.c
cpu hotplug: simplify and hopefully fix locking
2006-07-23 12:12:16 -07:00
cpuset.c
[PATCH] cpuset: oom panic fix
2006-08-27 11:01:32 -07:00
delayacct.c
[PATCH] task delay accounting fixes
2006-09-01 11:39:08 -07:00
dma.c
exec_domain.c
Remove obsolete #include <linux/config.h>
2006-06-30 19:25:36 +02:00
exit.c
[PATCH] eligible_child: remove an obsolete ->tgid check
2006-09-02 14:51:27 -07:00
extable.c
[PATCH] symbol_put_addr() locks kernel
2006-05-15 11:20:55 -07:00
fork.c
[PATCH] task delay accounting fixes
2006-09-01 11:39:08 -07:00
futex.c
[PATCH] Use the correct restart option for futex_lock_pi
2006-09-08 10:22:50 -07:00
futex_compat.c
[PATCH] futex: Apply recent futex fixes to futex_compat
2006-08-06 08:57:49 -07:00
hrtimer.c
[PATCH] fix hrtimer percpu usage typo
2006-08-14 12:54:28 -07:00
itimer.c
[PATCH] hrtimers: remove data field
2006-03-26 08:57:03 -08:00
kallsyms.c
[PATCH] null-terminate over-long /proc/kallsyms symbols
2006-07-14 21:53:52 -07:00
Kconfig.hz
Kconfig.preempt
kexec.c
[POWERPC] Add the use of the firmware soft-reset-nmi to kdump.
2006-06-28 15:18:52 +10:00
kfifo.c
kmod.c
[PATCH] bug fix in kernel/kmod.c
2006-09-16 12:54:32 -07:00
kprobes.c
[PATCH] IA64: kprobe invalidate icache of jump buffer
2006-07-31 13:28:38 -07:00
ksysfs.c
Remove obsolete #include <linux/config.h>
2006-06-30 19:25:36 +02:00
kthread.c
[PATCH] remove kernel/kthread.c:kthread_stop_sem()
2006-07-14 21:53:52 -07:00
lockdep.c
[PATCH] lockdep: core, reduce per-lock class-cache size
2006-07-10 13:24:14 -07:00
lockdep_internals.h
[PATCH] lockdep: double the number of stack-trace entries
2006-09-13 07:32:14 -07:00
lockdep_proc.c
[PATCH] lockdep: procfs
2006-07-03 15:27:04 -07:00
Makefile
[PATCH] per-task-delay-accounting: taskstats interface
2006-07-14 21:53:56 -07:00
module.c
[PATCH] null-terminate over-long /proc/kallsyms symbols
2006-07-14 21:53:52 -07:00
mutex-debug.c
[PATCH] lockdep: prove mutex locking correctness
2006-07-03 15:27:04 -07:00
mutex-debug.h
[PATCH] lockdep: better lock debugging
2006-07-03 15:27:01 -07:00
mutex.c
[PATCH] lockdep: prove mutex locking correctness
2006-07-03 15:27:04 -07:00
mutex.h
[PATCH] lockdep: prove mutex locking correctness
2006-07-03 15:27:04 -07:00
panic.c
[PATCH] lockdep: do not touch console state when tainting the kernel
2006-09-06 11:00:02 -07:00
params.c
Remove obsolete #include <linux/config.h>
2006-06-30 19:25:36 +02:00
pid.c
[PATCH] sched: cleanup, remove task_t, convert to struct task_struct
2006-07-03 15:27:11 -07:00
posix-cpu-timers.c
[PATCH] arm_timer: remove a racy and obsolete PF_EXITING check
2006-06-17 10:52:13 -07:00
posix-timers.c
[PATCH] hrtimers: remove data field
2006-03-26 08:57:03 -08:00
printk.c
[PATCH] vt: printk: Fix framebuffer console triggering might_sleep assertion
2006-08-06 08:57:47 -07:00
profile.c
Remove obsolete #include <linux/config.h>
2006-06-30 19:25:36 +02:00
ptrace.c
[PATCH] sched: cleanup, remove task_t, convert to struct task_struct
2006-07-03 15:27:11 -07:00
rcupdate.c
[PATCH] rcu_do_batch: make ->qlen decrement irq safe
2006-09-13 07:32:14 -07:00
rcutorture.c
[PATCH] rcutorture: add call_rcu_bh() operations
2006-06-27 17:32:40 -07:00
relay.c
resource.c
[PATCH] memory hotadd fixes: find_next_system_ram catch range fix
2006-08-06 08:57:48 -07:00
rtmutex-debug.c
[PATCH] sched: cleanup, remove task_t, convert to struct task_struct
2006-07-03 15:27:11 -07:00
rtmutex-debug.h
[PATCH] lockdep: better lock debugging
2006-07-03 15:27:01 -07:00
rtmutex-tester.c
[PATCH] Add try_to_freeze() to rt-test kthreads
2006-07-14 21:53:53 -07:00
rtmutex.c
[PATCH] reference rt-mutex-design in rtmutex.c
2006-07-31 13:28:43 -07:00
rtmutex.h
[PATCH] lockdep: better lock debugging
2006-07-03 15:27:01 -07:00
rtmutex_common.h
[PATCH] pi-futex: futex_lock_pi/futex_unlock_pi support
2006-06-27 17:32:47 -07:00
rwsem.c
[PATCH] lockdep: prove rwsem locking correctness
2006-07-03 15:27:04 -07:00
sched.c
[PATCH] revert "Drop tasklist lock in do_sched_setscheduler"
2006-08-27 11:01:29 -07:00
seccomp.c
signal.c
Fix force_sig_info() semantics after cleanups
2006-08-02 20:17:49 -07:00
softirq.c
[PATCH] Reducing local_bh_enable/disable overhead in irqtrace
2006-07-31 13:28:42 -07:00
softlockup.c
[PATCH] cpu hotplug: replace __devinit* with __cpuinit* for cpu notifications
2006-07-31 13:28:39 -07:00
spinlock.c
[PATCH] lockdep ifdef fix
2006-09-06 11:00:01 -07:00
stacktrace.c
[PATCH] lockdep: stacktrace subsystem, core
2006-07-03 15:27:02 -07:00
stop_machine.c
[PATCH] Remove redundant up() in stop_machine()
2006-08-27 11:01:31 -07:00
sys.c
[PATCH] Fix prctl privilege escalation and suid_dumpable (CVE-2006-2451)
2006-07-12 12:50:25 -07:00
sys_ni.c
[PATCH] sys_move_pages: 32bit support (i386, x86_64)
2006-06-23 07:42:53 -07:00
sysctl.c
[PATCH] ZVC/zone_reclaim: Leave 1% of unmapped pagecache pages for file I/O
2006-07-03 15:26:59 -07:00
taskstats.c
[PATCH] taskstats: free skb, avoid returns in send_cpu_listeners
2006-07-31 13:28:37 -07:00
time.c
[PATCH] Time: Introduce arch generic time accessors
2006-06-26 09:58:20 -07:00
timer.c
[PATCH] sys_getppid oopses on debug kernel
2006-08-14 12:54:29 -07:00
uid16.c
[PATCH] Add more prevent_tail_call()
2006-04-19 16:27:18 -07:00
unwind.c
[PATCH] x86_64: allow unwinder to build without module support
2006-06-26 10:48:18 -07:00
user.c
[PATCH] selinux: add hooks for key subsystem
2006-06-22 15:05:55 -07:00
wait.c
[PATCH] uninline init_waitqueue_head()
2006-07-10 13:24:25 -07:00
workqueue.c
[PATCH] workqueue: remove lock_cpu_hotplug()
2006-08-14 12:54:29 -07:00