These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / kernel / irq / handle.c
index 26a6367..6c65c92 100644 (file)
 
 /**
  * handle_bad_irq - handle spurious and unhandled irqs
- * @irq:       the interrupt number
  * @desc:      description of the interrupt
  *
  * Handles spurious and unhandled IRQ's. It also prints a debugmessage.
  */
-void handle_bad_irq(unsigned int irq, struct irq_desc *desc)
+void handle_bad_irq(struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
+
        print_irq_desc(irq, desc);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
        ack_bad_irq(irq);
 }
+EXPORT_SYMBOL_GPL(handle_bad_irq);
 
 /*
  * Special, empty irq handler:
@@ -130,15 +132,16 @@ void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action)
        wake_up_process(action->thread);
 }
 
-irqreturn_t
-handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
+irqreturn_t handle_irq_event_percpu(struct irq_desc *desc)
 {
        struct pt_regs *regs = get_irq_regs();
        u64 ip = regs ? instruction_pointer(regs) : 0;
        irqreturn_t retval = IRQ_NONE;
        unsigned int flags = 0, irq = desc->irq_data.irq;
+       struct irqaction *action = desc->action;
 
-       do {
+       /* action might have become NULL since we dropped the lock */
+       while (action) {
                irqreturn_t res;
 
                trace_irq_handler_entry(irq, action);
@@ -173,29 +176,28 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
 
                retval |= res;
                action = action->next;
-       } while (action);
+       }
 
-#ifndef CONFIG_PREEMPT_RT_FULL
-       add_interrupt_randomness(irq, flags, ip);
-#else
+#ifdef CONFIG_PREEMPT_RT_FULL
        desc->random_ip = ip;
+#else
+       add_interrupt_randomness(irq, flags, ip);
 #endif
 
        if (!noirqdebug)
-               note_interrupt(irq, desc, retval);
+               note_interrupt(desc, retval);
        return retval;
 }
 
 irqreturn_t handle_irq_event(struct irq_desc *desc)
 {
-       struct irqaction *action = desc->action;
        irqreturn_t ret;
 
        desc->istate &= ~IRQS_PENDING;
        irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);
        raw_spin_unlock(&desc->lock);
 
-       ret = handle_irq_event_percpu(desc, action);
+       ret = handle_irq_event_percpu(desc);
 
        raw_spin_lock(&desc->lock);
        irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);