diff options
| -rw-r--r-- | arch/x86/xen/smp.c | 14 |
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 | ||
| 429 | static void xen_cpu_die(unsigned int cpu) | 429 | static 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 | ||
| 668 | static void xen_hvm_cpu_die(unsigned int cpu) | 669 | static 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 | ||
