diff options
| -rw-r--r-- | arch/x86/xen/smp.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 22c800af180b..415694cc8584 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -144,6 +144,13 @@ static int xen_smp_intr_init(unsigned int cpu) | |||
| 144 | goto fail; | 144 | goto fail; |
| 145 | per_cpu(xen_callfuncsingle_irq, cpu) = rc; | 145 | per_cpu(xen_callfuncsingle_irq, cpu) = rc; |
| 146 | 146 | ||
| 147 | /* | ||
| 148 | * The IRQ worker on PVHVM goes through the native path and uses the | ||
| 149 | * IPI mechanism. | ||
| 150 | */ | ||
| 151 | if (xen_hvm_domain()) | ||
| 152 | return 0; | ||
| 153 | |||
| 147 | callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu); | 154 | callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu); |
| 148 | rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR, | 155 | rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR, |
| 149 | cpu, | 156 | cpu, |
| @@ -167,6 +174,9 @@ static int xen_smp_intr_init(unsigned int cpu) | |||
| 167 | if (per_cpu(xen_callfuncsingle_irq, cpu) >= 0) | 174 | if (per_cpu(xen_callfuncsingle_irq, cpu) >= 0) |
| 168 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), | 175 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), |
| 169 | NULL); | 176 | NULL); |
| 177 | if (xen_hvm_domain()) | ||
| 178 | return rc; | ||
| 179 | |||
| 170 | if (per_cpu(xen_irq_work, cpu) >= 0) | 180 | if (per_cpu(xen_irq_work, cpu) >= 0) |
| 171 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); | 181 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); |
| 172 | 182 | ||
| @@ -661,7 +671,8 @@ static void xen_hvm_cpu_die(unsigned int cpu) | |||
| 661 | unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL); | 671 | unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL); |
| 662 | unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); | 672 | unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); |
| 663 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); | 673 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); |
| 664 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); | 674 | if (!xen_hvm_domain()) |
| 675 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); | ||
| 665 | xen_uninit_lock_cpu(cpu); | 676 | xen_uninit_lock_cpu(cpu); |
| 666 | xen_teardown_timer(cpu); | 677 | xen_teardown_timer(cpu); |
| 667 | native_cpu_die(cpu); | 678 | native_cpu_die(cpu); |
