Re: [patch 2/9] LTTng instrumentation - irq

Ingo Molnar
2009-03-24T19:16:22Z

* Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> 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