Lines Matching refs:desc

28 static bool try_one_irq(struct irq_desc *desc, bool force)  in try_one_irq()  argument
33 guard(raw_spinlock)(&desc->lock); in try_one_irq()
39 if (irq_settings_is_per_cpu(desc) || irq_settings_is_nested_thread(desc) || in try_one_irq()
40 irq_settings_is_polled(desc)) in try_one_irq()
47 if (irqd_irq_disabled(&desc->irq_data) && !force) in try_one_irq()
54 action = desc->action; in try_one_irq()
59 if (irqd_irq_inprogress(&desc->irq_data)) { in try_one_irq()
64 desc->istate |= IRQS_PENDING; in try_one_irq()
69 desc->istate |= IRQS_POLL_INPROGRESS; in try_one_irq()
71 if (handle_irq_event(desc) == IRQ_HANDLED) in try_one_irq()
74 action = desc->action; in try_one_irq()
75 } while ((desc->istate & IRQS_PENDING) && action); in try_one_irq()
76 desc->istate &= ~IRQS_POLL_INPROGRESS; in try_one_irq()
82 struct irq_desc *desc; in misrouted_irq() local
90 for_each_irq_desc(i, desc) { in misrouted_irq()
97 if (try_one_irq(desc, false)) in misrouted_irq()
108 struct irq_desc *desc; in poll_spurious_irqs() local
115 for_each_irq_desc(i, desc) { in poll_spurious_irqs()
122 state = READ_ONCE(desc->istate); in poll_spurious_irqs()
127 try_one_irq(desc, true); in poll_spurious_irqs()
152 static void __report_bad_irq(struct irq_desc *desc, irqreturn_t action_ret) in __report_bad_irq() argument
154 unsigned int irq = irq_desc_get_irq(desc); in __report_bad_irq()
170 guard(raw_spinlock_irqsave)(&desc->lock); in __report_bad_irq()
171 for_each_action_of_desc(desc, action) { in __report_bad_irq()
179 static void report_bad_irq(struct irq_desc *desc, irqreturn_t action_ret) in report_bad_irq() argument
185 __report_bad_irq(desc, action_ret); in report_bad_irq()
189 static inline bool try_misrouted_irq(unsigned int irq, struct irq_desc *desc, in try_misrouted_irq() argument
216 action = READ_ONCE(desc->action); in try_misrouted_irq()
222 void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret) in note_interrupt() argument
226 if (desc->istate & IRQS_POLL_INPROGRESS || irq_settings_is_polled(desc)) in note_interrupt()
230 report_bad_irq(desc, action_ret); in note_interrupt()
271 if (!(desc->threads_handled_last & SPURIOUS_DEFERRED)) { in note_interrupt()
272 desc->threads_handled_last |= SPURIOUS_DEFERRED; in note_interrupt()
287 handled = atomic_read(&desc->threads_handled); in note_interrupt()
289 if (handled != desc->threads_handled_last) { in note_interrupt()
299 desc->threads_handled_last = handled; in note_interrupt()
330 desc->threads_handled_last &= ~SPURIOUS_DEFERRED; in note_interrupt()
341 if (time_after(jiffies, desc->last_unhandled + HZ/10)) in note_interrupt()
342 desc->irqs_unhandled = 1; in note_interrupt()
344 desc->irqs_unhandled++; in note_interrupt()
345 desc->last_unhandled = jiffies; in note_interrupt()
348 irq = irq_desc_get_irq(desc); in note_interrupt()
349 if (unlikely(try_misrouted_irq(irq, desc, action_ret))) { in note_interrupt()
352 desc->irqs_unhandled -= ok; in note_interrupt()
355 if (likely(!desc->irqs_unhandled)) in note_interrupt()
359 desc->irq_count++; in note_interrupt()
360 if (likely(desc->irq_count < 100000)) in note_interrupt()
363 desc->irq_count = 0; in note_interrupt()
364 if (unlikely(desc->irqs_unhandled > 99900)) { in note_interrupt()
368 __report_bad_irq(desc, action_ret); in note_interrupt()
373 desc->istate |= IRQS_SPURIOUS_DISABLED; in note_interrupt()
374 desc->depth++; in note_interrupt()
375 irq_disable(desc); in note_interrupt()
379 desc->irqs_unhandled = 0; in note_interrupt()