--- drivers/xen/events.c 2011-01-18 12:57:53.000000000 +0100 +++ drivers/xen/events.c 2011-01-18 12:57:53.000000000 +0100 @@ -814,9 +814,6 @@ evtchn_to_irq[evtchn] = irq; irq_info[irq] = mk_virq_info(evtchn, virq); bind_evtchn_to_cpu(evtchn, cpu); - - /* Ready for use. */ - unmask_evtchn(evtchn); } } @@ -842,10 +839,6 @@ evtchn_to_irq[evtchn] = irq; irq_info[irq] = mk_ipi_info(evtchn, ipi); bind_evtchn_to_cpu(evtchn, cpu); - - /* Ready for use. */ - unmask_evtchn(evtchn); - } } @@ -898,6 +891,7 @@ void xen_irq_resume(void) { unsigned int cpu, irq, evtchn; + struct irq_desc *desc; init_evtchn_cpu_bindings(); @@ -916,6 +910,20 @@ restore_cpu_virqs(cpu); restore_cpu_ipis(cpu); } + + for_each_irq_desc(irq, desc) { + if (!desc->action || !(desc->action->flags & IRQF_NO_SUSPEND)) + continue; + if (desc->status & IRQ_DISABLED) + continue; + + evtchn = evtchn_from_irq(irq); + if (evtchn == -1) + continue; + + unmask_evtchn(evtchn); + } + } static struct irq_chip xen_dynamic_chip __read_mostly = {