From mboxrd@z Thu Jan 1 00:00:00 1970 From: mingo@elte.hu (Ingo Molnar) Date: Tue, 24 Mar 2009 20:14:49 +0100 Subject: [ltt-dev] [patch 2/9] LTTng instrumentation - irq In-Reply-To: <20090324160148.080628193@polymtl.ca> References: <20090324155625.420966314@polymtl.ca> <20090324160148.080628193@polymtl.ca> Message-ID: <20090324191449.GB11665@elte.hu> * Mathieu Desnoyers wrote: > +static irqreturn_t __handle_irq_next_handler(unsigned int irq, > + struct irqaction **action, irqreturn_t *retval, unsigned int *status) > +{ > + irqreturn_t ret; > + > + ret = (*action)->handler(irq, (*action)->dev_id); > + if (ret == IRQ_HANDLED) > + *status |= (*action)->flags; > + *retval |= ret; > + *action = (*action)->next; > + return ret; > +} > + > static irqreturn_t _handle_IRQ_event(unsigned int irq, struct irqaction *action) > { > irqreturn_t ret, retval = IRQ_NONE; > @@ -324,13 +345,12 @@ static irqreturn_t _handle_IRQ_event(uns > if (!(action->flags & IRQF_DISABLED)) > local_irq_enable_in_hardirq(); > > - do { > - ret = action->handler(irq, action->dev_id); > - if (ret == IRQ_HANDLED) > - status |= action->flags; > - retval |= ret; > - action = action->next; > - } while (action); > + ret = __handle_irq_next_handler(irq, &action, &retval, &status); > + > + while (action) { > + trace_irq_next_handler(irq, action, ret); > + ret = __handle_irq_next_handler(irq, &action, &retval, &status); > + } Hm, this is rather unclean. Why open-code the first handler execution? This is a sign (and side effect) of the logical model being slightly incorrect - see my previous mail to Jason. Ingo