if (!noirqdebug) note_interrupt(irq, desc, action_ret); 
fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs){	irq_desc_t *desc = irq_desc + irq;	struct irqaction * action;	unsigned int status;	kstat_this_cpu.irqs[irq]++;	if (desc->status & IRQ_PER_CPU) {		irqreturn_t action_ret;		/*		 * No locking required for CPU-local interrupts:		 */		desc->handler->ack(irq);		action_ret = handle_IRQ_event(irq, regs, desc->action);		if (!noirqdebug)			note_interrupt(irq, desc, action_ret);		desc->handler->end(irq);		return 1;	}	spin_lock(&desc->lock);	desc->handler->ack(irq);	/*	 * REPLAY is when Linux resends an IRQ that was dropped earlier	 * WAITING is used by probe to mark irqs that are being tested	 */	status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);	status |= IRQ_PENDING; /* we _want_ to handle it */	/*	 * If the IRQ is disabled for whatever reason, we cannot	 * use the action we have.	 */	action = NULL;	if (likely(!(status & (IRQ_DISABLED | IRQ_INPROGRESS)))) {		action = desc->action;		status &= ~IRQ_PENDING; /* we commit to handling */		status |= IRQ_INPROGRESS; /* we are handling it */	}	desc->status = status;	/*	 * If there is no IRQ handler or it was disabled, exit early.	 * Since we set PENDING, if another processor is handling	 * a different instance of this same irq, the other processor	 * will take care of it.	 */	if (unlikely(!action))		goto out;	/*	 * Edge triggered interrupts need to remember	 * pending events.	 * This applies to any hw interrupts that allow a second	 * instance of the same irq to arrive while we are in do_IRQ	 * or in the handler. But the code here only handles the _second_	 * instance of the irq, not the third or fourth. So it is mostly	 * useful for irq hardware that does not mask cleanly in an	 * SMP environment.	 */	for (;;) {		irqreturn_t action_ret;		spin_unlock(&desc->lock);		action_ret = handle_IRQ_event(irq, regs, action);		spin_lock(&desc->lock);		if (!noirqdebug)			note_interrupt(irq, desc, action_ret);		if (likely(!(desc->status & IRQ_PENDING)))			break;		desc->status &= ~IRQ_PENDING;	}	desc->status &= ~IRQ_INPROGRESS;out:	/*	 * The ->end() handler has to deal with interrupts which got	 * disabled while the handler was running.	 */	desc->handler->end(irq);	spin_unlock(&desc->lock);	return 1;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/b60c1f6ffd88850079ae419aa933ab0eddbd5535/handle.c/buggy/kernel/irq/handle.c