return IRQ_NONE;
  }
  
 +static void warn_no_thread(unsigned int irq, struct irqaction *action)
 +{
 +      if (test_and_set_bit(IRQTF_WARNED, &action->thread_flags))
 +              return;
 +
 +      printk(KERN_WARNING "IRQ %d device %s returned IRQ_WAKE_THREAD "
 +             "but no thread function available.", irq, action->name);
 +}
 +
+ DEFINE_TRACE(irq_handler_entry);
+ DEFINE_TRACE(irq_handler_exit);
+ 
  /**
   * handle_IRQ_event - irq action chain handler
   * @irq:      the interrupt number
                local_irq_enable_in_hardirq();
  
        do {
+               trace_irq_handler_entry(irq, action);
                ret = action->handler(irq, action->dev_id);
 -              if (ret == IRQ_HANDLED)
+               trace_irq_handler_exit(irq, action, ret);
 +
 +              switch (ret) {
 +              case IRQ_WAKE_THREAD:
 +                      /*
 +                       * Set result to handled so the spurious check
 +                       * does not trigger.
 +                       */
 +                      ret = IRQ_HANDLED;
 +
 +                      /*
 +                       * Catch drivers which return WAKE_THREAD but
 +                       * did not set up a thread function
 +                       */
 +                      if (unlikely(!action->thread_fn)) {
 +                              warn_no_thread(irq, action);
 +                              break;
 +                      }
 +
 +                      /*
 +                       * Wake up the handler thread for this
 +                       * action. In case the thread crashed and was
 +                       * killed we just pretend that we handled the
 +                       * interrupt. The hardirq handler above has
 +                       * disabled the device interrupt, so no irq
 +                       * storm is lurking.
 +                       */
 +                      if (likely(!test_bit(IRQTF_DIED,
 +                                           &action->thread_flags))) {
 +                              set_bit(IRQTF_RUNTHREAD, &action->thread_flags);
 +                              wake_up_process(action->thread);
 +                      }
 +
 +                      /* Fall through to add to randomness */
 +              case IRQ_HANDLED:
                        status |= action->flags;
 +                      break;
 +
 +              default:
 +                      break;
 +              }
 +
                retval |= ret;
                action = action->next;
        } while (action);