Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ppc64: allow iSeries to use IRQSTACKS again

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>

+17 -1
+17 -1
arch/powerpc/platforms/iseries/irq.c
··· 103 103 struct pt_regs *regsParm) 104 104 { 105 105 int irq; 106 + #ifdef CONFIG_IRQSTACKS 107 + struct thread_info *curtp, *irqtp; 108 + #endif 106 109 107 110 ++Pci_Interrupt_Count; 108 111 ··· 113 110 case XmPciLpEvent_SlotInterrupt: 114 111 irq = eventParm->hvLpEvent.xCorrelationToken; 115 112 /* Dispatch the interrupt handlers for this irq */ 116 - ppc_irq_dispatch_handler(regsParm, irq); 113 + #ifdef CONFIG_IRQSTACKS 114 + /* Switch to the irq stack to handle this */ 115 + curtp = current_thread_info(); 116 + irqtp = hardirq_ctx[smp_processor_id()]; 117 + if (curtp != irqtp) { 118 + irqtp->task = curtp->task; 119 + irqtp->flags = 0; 120 + call_ppc_irq_dispatch_handler(regsParm, irq, irqtp); 121 + irqtp->task = NULL; 122 + if (irqtp->flags) 123 + set_bits(irqtp->flags, &curtp->flags); 124 + } else 125 + #endif 126 + ppc_irq_dispatch_handler(regsParm, irq); 117 127 HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber, 118 128 eventParm->eventData.slotInterrupt.subBusNumber, 119 129 eventParm->eventData.slotInterrupt.deviceId);