handle.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * linux/kernel/irq/handle.c
  3. *
  4. * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar
  5. * Copyright (C) 2005-2006, Thomas Gleixner, Russell King
  6. *
  7. * This file contains the core interrupt handling code.
  8. *
  9. * Detailed information is available in Documentation/DocBook/genericirq
  10. *
  11. */
  12. #include <linux/irq.h>
  13. #include <linux/random.h>
  14. #include <linux/sched.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/kernel_stat.h>
  17. #include <trace/events/irq.h>
  18. #include "internals.h"
  19. /**
  20. * handle_bad_irq - handle spurious and unhandled irqs
  21. * @irq: the interrupt number
  22. * @desc: description of the interrupt
  23. *
  24. * Handles spurious and unhandled IRQ's. It also prints a debugmessage.
  25. */
  26. void handle_bad_irq(unsigned int irq, struct irq_desc *desc)
  27. {
  28. print_irq_desc(irq, desc);
  29. kstat_incr_irqs_this_cpu(irq, desc);
  30. ack_bad_irq(irq);
  31. }
  32. /*
  33. * Special, empty irq handler:
  34. */
  35. irqreturn_t no_action(int cpl, void *dev_id)
  36. {
  37. return IRQ_NONE;
  38. }
  39. static void warn_no_thread(unsigned int irq, struct irqaction *action)
  40. {
  41. if (test_and_set_bit(IRQTF_WARNED, &action->thread_flags))
  42. return;
  43. printk(KERN_WARNING "IRQ %d device %s returned IRQ_WAKE_THREAD "
  44. "but no thread function available.", irq, action->name);
  45. }
  46. irqreturn_t
  47. handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
  48. {
  49. irqreturn_t ret, retval = IRQ_NONE;
  50. unsigned int random = 0, irq = desc->irq_data.irq;
  51. do {
  52. trace_irq_handler_entry(irq, action);
  53. ret = action->handler(irq, action->dev_id);
  54. trace_irq_handler_exit(irq, action, ret);
  55. if (WARN_ON_ONCE(!irqs_disabled()))
  56. local_irq_disable();
  57. switch (ret) {
  58. case IRQ_WAKE_THREAD:
  59. /*
  60. * Set result to handled so the spurious check
  61. * does not trigger.
  62. */
  63. ret = IRQ_HANDLED;
  64. /*
  65. * Catch drivers which return WAKE_THREAD but
  66. * did not set up a thread function
  67. */
  68. if (unlikely(!action->thread_fn)) {
  69. warn_no_thread(irq, action);
  70. break;
  71. }
  72. /*
  73. * Wake up the handler thread for this
  74. * action. In case the thread crashed and was
  75. * killed we just pretend that we handled the
  76. * interrupt. The hardirq handler above has
  77. * disabled the device interrupt, so no irq
  78. * storm is lurking.
  79. */
  80. if (likely(!test_bit(IRQTF_DIED,
  81. &action->thread_flags))) {
  82. set_bit(IRQTF_RUNTHREAD, &action->thread_flags);
  83. wake_up_process(action->thread);
  84. }
  85. /* Fall through to add to randomness */
  86. case IRQ_HANDLED:
  87. random |= action->flags;
  88. break;
  89. default:
  90. break;
  91. }
  92. retval |= ret;
  93. action = action->next;
  94. } while (action);
  95. if (random & IRQF_SAMPLE_RANDOM)
  96. add_interrupt_randomness(irq);
  97. if (!noirqdebug)
  98. note_interrupt(irq, desc, ret);
  99. return retval;
  100. }
  101. irqreturn_t handle_irq_event(struct irq_desc *desc)
  102. {
  103. struct irqaction *action = desc->action;
  104. irqreturn_t ret;
  105. irq_compat_clr_pending(desc);
  106. desc->istate &= ~IRQS_PENDING;
  107. irq_compat_set_progress(desc);
  108. desc->istate |= IRQS_INPROGRESS;
  109. raw_spin_unlock(&desc->lock);
  110. ret = handle_irq_event_percpu(desc, action);
  111. raw_spin_lock(&desc->lock);
  112. desc->istate &= ~IRQS_INPROGRESS;
  113. irq_compat_clr_progress(desc);
  114. return ret;
  115. }
  116. /**
  117. * handle_IRQ_event - irq action chain handler
  118. * @irq: the interrupt number
  119. * @action: the interrupt action chain for this irq
  120. *
  121. * Handles the action chain of an irq event
  122. */
  123. irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
  124. {
  125. return handle_irq_event_percpu(irq_to_desc(irq), action);
  126. }