[PATCH] lockdep: add disable/enable_irq_lockdep() API
lockdep wants to use the disable_irq()/enable_irq() prototypes before they are provied by the platform's asm/irq.h. So move them out of the CONFIG_GENERIC_HARDIRQS define - all architectures have a common prototype for this anyway. Add special lockdep variants of irq line disabling/enabling. These should be used for locking constructs that know that a particular irq context which is disabled, and which is the only irq-context user of a lock, that it's safe to take the lock in the irq-disabled section without disabling hardirqs. [akpm@osdl.org: build fix] Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a875a69f8b
commit
c01d403b2e
|
@ -86,6 +86,41 @@ extern void disable_irq_nosync(unsigned int irq);
|
|||
extern void disable_irq(unsigned int irq);
|
||||
extern void enable_irq(unsigned int irq);
|
||||
|
||||
/*
|
||||
* Special lockdep variants of irq disabling/enabling.
|
||||
* These should be used for locking constructs that
|
||||
* know that a particular irq context which is disabled,
|
||||
* and which is the only irq-context user of a lock,
|
||||
* that it's safe to take the lock in the irq-disabled
|
||||
* section without disabling hardirqs.
|
||||
*
|
||||
* On !CONFIG_LOCKDEP they are equivalent to the normal
|
||||
* irq disable/enable methods.
|
||||
*/
|
||||
static inline void disable_irq_nosync_lockdep(unsigned int irq)
|
||||
{
|
||||
disable_irq_nosync(irq);
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
local_irq_disable();
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void disable_irq_lockdep(unsigned int irq)
|
||||
{
|
||||
disable_irq(irq);
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
local_irq_disable();
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void enable_irq_lockdep(unsigned int irq)
|
||||
{
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
local_irq_enable();
|
||||
#endif
|
||||
enable_irq(irq);
|
||||
}
|
||||
|
||||
/* IRQ wakeup (PM) control: */
|
||||
extern int set_irq_wake(unsigned int irq, unsigned int on);
|
||||
|
||||
|
@ -99,7 +134,19 @@ static inline int disable_irq_wake(unsigned int irq)
|
|||
return set_irq_wake(irq, 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
#else /* !CONFIG_GENERIC_HARDIRQS */
|
||||
/*
|
||||
* NOTE: non-genirq architectures, if they want to support the lock
|
||||
* validator need to define the methods below in their asm/irq.h
|
||||
* files, under an #ifdef CONFIG_LOCKDEP section.
|
||||
*/
|
||||
# ifndef CONFIG_LOCKDEP
|
||||
# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq)
|
||||
# define disable_irq_lockdep(irq) disable_irq(irq)
|
||||
# define enable_irq_lockdep(irq) enable_irq(irq)
|
||||
# endif
|
||||
|
||||
#endif /* CONFIG_GENERIC_HARDIRQS */
|
||||
|
||||
#ifndef __ARCH_SET_SOFTIRQ_PENDING
|
||||
#define set_softirq_pending(x) (local_softirq_pending() = (x))
|
||||
|
|
Loading…
Reference in New Issue