aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2006-07-03 03:25:06 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-07-03 18:27:06 -0400
commit243c7621aac4ed1aa79524c9a1cecf7c05a28124 (patch)
treed8f7a1fce57c9349183bfd9ab6738a763078db85
parent8b8f319fc7f4ab59f567d6a401a62659b3d37007 (diff)
[PATCH] lockdep: annotate genirq
Teach special (recursive) locking code to the lock validator. Has no effect on non-lockdep kernels. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/lockdep.h6
-rw-r--r--init/main.c1
-rw-r--r--kernel/irq/handle.c16
3 files changed, 23 insertions, 0 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 80ec7a4dbc98..316e0fb8d7b1 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -270,6 +270,12 @@ static inline int lockdep_internal(void)
270struct lock_class_key { }; 270struct lock_class_key { };
271#endif /* !LOCKDEP */ 271#endif /* !LOCKDEP */
272 272
273#if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_GENERIC_HARDIRQS)
274extern void early_init_irq_lock_class(void);
275#else
276# define early_init_irq_lock_class() do { } while (0)
277#endif
278
273#ifdef CONFIG_TRACE_IRQFLAGS 279#ifdef CONFIG_TRACE_IRQFLAGS
274extern void early_boot_irqs_off(void); 280extern void early_boot_irqs_off(void);
275extern void early_boot_irqs_on(void); 281extern void early_boot_irqs_on(void);
diff --git a/init/main.c b/init/main.c
index fc473d4b56fd..628b8e9e841a 100644
--- a/init/main.c
+++ b/init/main.c
@@ -466,6 +466,7 @@ asmlinkage void __init start_kernel(void)
466 466
467 local_irq_disable(); 467 local_irq_disable();
468 early_boot_irqs_off(); 468 early_boot_irqs_off();
469 early_init_irq_lock_class();
469 470
470/* 471/*
471 * Interrupts are still disabled. Do necessary setups, then 472 * Interrupts are still disabled. Do necessary setups, then
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index aeb6e391276c..a7b497ee919e 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -249,3 +249,19 @@ out:
249 return 1; 249 return 1;
250} 250}
251 251
252#ifdef CONFIG_TRACE_IRQFLAGS
253
254/*
255 * lockdep: we want to handle all irq_desc locks as a single lock-class:
256 */
257static struct lock_class_key irq_desc_lock_class;
258
259void early_init_irq_lock_class(void)
260{
261 int i;
262
263 for (i = 0; i < NR_IRQS; i++)
264 lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class);
265}
266
267#endif