[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
	
	Block a user