aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/xen/smp.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 415694cc8584..0d466d7c7175 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -428,7 +428,7 @@ static int xen_cpu_disable(void)
428 428
429static void xen_cpu_die(unsigned int cpu) 429static void xen_cpu_die(unsigned int cpu)
430{ 430{
431 while (HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) { 431 while (xen_pv_domain() && HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) {
432 current->state = TASK_UNINTERRUPTIBLE; 432 current->state = TASK_UNINTERRUPTIBLE;
433 schedule_timeout(HZ/10); 433 schedule_timeout(HZ/10);
434 } 434 }
@@ -436,7 +436,8 @@ static void xen_cpu_die(unsigned int cpu)
436 unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL); 436 unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL);
437 unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); 437 unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL);
438 unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); 438 unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL);
439 unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); 439 if (!xen_hvm_domain())
440 unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL);
440 xen_uninit_lock_cpu(cpu); 441 xen_uninit_lock_cpu(cpu);
441 xen_teardown_timer(cpu); 442 xen_teardown_timer(cpu);
442} 443}
@@ -667,14 +668,7 @@ static int __cpuinit xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle)
667 668
668static void xen_hvm_cpu_die(unsigned int cpu) 669static void xen_hvm_cpu_die(unsigned int cpu)
669{ 670{
670 unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu), NULL); 671 xen_cpu_die(cpu);
671 unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL);
672 unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL);
673 unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL);
674 if (!xen_hvm_domain())
675 unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL);
676 xen_uninit_lock_cpu(cpu);
677 xen_teardown_timer(cpu);
678 native_cpu_die(cpu); 672 native_cpu_die(cpu);
679} 673}
680 674