diff options
Diffstat (limited to 'kernel/irq')
| -rw-r--r-- | kernel/irq/chip.c | 5 | ||||
| -rw-r--r-- | kernel/irq/handle.c | 18 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 6 | 
3 files changed, 27 insertions, 2 deletions
| diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 54105bdfe20d..9336f2e89e40 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -261,10 +261,13 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs)  	 * keep it masked and get out of here  	 */  	action = desc->action; -	if (unlikely(!action || (desc->status & IRQ_DISABLED))) +	if (unlikely(!action || (desc->status & IRQ_DISABLED))) { +		desc->status |= IRQ_PENDING;  		goto out; +	}  	desc->status |= IRQ_INPROGRESS; +	desc->status &= ~IRQ_PENDING;  	spin_unlock(&desc->lock);  	action_ret = handle_IRQ_event(irq, regs, action); diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index aeb6e391276c..fc4e906aedbd 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -132,7 +132,7 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs,  	handle_dynamic_tick(action);  	if (!(action->flags & IRQF_DISABLED)) -		local_irq_enable(); +		local_irq_enable_in_hardirq();  	do {  		ret = action->handler(irq, action->dev_id, regs); @@ -249,3 +249,19 @@ out:  	return 1;  } +#ifdef CONFIG_TRACE_IRQFLAGS + +/* + * lockdep: we want to handle all irq_desc locks as a single lock-class: + */ +static struct lock_class_key irq_desc_lock_class; + +void early_init_irq_lock_class(void) +{ +	int i; + +	for (i = 0; i < NR_IRQS; i++) +		lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class); +} + +#endif diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index c911c6ec4dd6..4e461438e48b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -410,6 +410,12 @@ int request_irq(unsigned int irq,  	struct irqaction *action;  	int retval; +#ifdef CONFIG_LOCKDEP +	/* +	 * Lockdep wants atomic interrupt handlers: +	 */ +	irqflags |= SA_INTERRUPT; +#endif  	/*  	 * Sanity-check: shared interrupts must pass in a real dev-ID,  	 * otherwise we'll have trouble later trying to figure out | 
