diff options
Diffstat (limited to 'arch/x86/xen/smp.c')
-rw-r--r-- | arch/x86/xen/smp.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index ca92754eb846..9235842cd76a 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -279,6 +279,7 @@ static void __init xen_smp_prepare_boot_cpu(void) | |||
279 | 279 | ||
280 | xen_filter_cpu_maps(); | 280 | xen_filter_cpu_maps(); |
281 | xen_setup_vcpu_info_placement(); | 281 | xen_setup_vcpu_info_placement(); |
282 | xen_init_spinlocks(); | ||
282 | } | 283 | } |
283 | 284 | ||
284 | static void __init xen_smp_prepare_cpus(unsigned int max_cpus) | 285 | static void __init xen_smp_prepare_cpus(unsigned int max_cpus) |
@@ -572,6 +573,12 @@ static inline int xen_map_vector(int vector) | |||
572 | case IRQ_WORK_VECTOR: | 573 | case IRQ_WORK_VECTOR: |
573 | xen_vector = XEN_IRQ_WORK_VECTOR; | 574 | xen_vector = XEN_IRQ_WORK_VECTOR; |
574 | break; | 575 | break; |
576 | #ifdef CONFIG_X86_64 | ||
577 | case NMI_VECTOR: | ||
578 | case APIC_DM_NMI: /* Some use that instead of NMI_VECTOR */ | ||
579 | xen_vector = XEN_NMI_VECTOR; | ||
580 | break; | ||
581 | #endif | ||
575 | default: | 582 | default: |
576 | xen_vector = -1; | 583 | xen_vector = -1; |
577 | printk(KERN_ERR "xen: vector 0x%x is not implemented\n", | 584 | printk(KERN_ERR "xen: vector 0x%x is not implemented\n", |
@@ -680,7 +687,6 @@ void __init xen_smp_init(void) | |||
680 | { | 687 | { |
681 | smp_ops = xen_smp_ops; | 688 | smp_ops = xen_smp_ops; |
682 | xen_fill_possible_map(); | 689 | xen_fill_possible_map(); |
683 | xen_init_spinlocks(); | ||
684 | } | 690 | } |
685 | 691 | ||
686 | static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) | 692 | static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) |
@@ -694,8 +700,15 @@ static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) | |||
694 | static int xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle) | 700 | static int xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle) |
695 | { | 701 | { |
696 | int rc; | 702 | int rc; |
697 | rc = native_cpu_up(cpu, tidle); | 703 | /* |
698 | WARN_ON (xen_smp_intr_init(cpu)); | 704 | * xen_smp_intr_init() needs to run before native_cpu_up() |
705 | * so that IPI vectors are set up on the booting CPU before | ||
706 | * it is marked online in native_cpu_up(). | ||
707 | */ | ||
708 | rc = xen_smp_intr_init(cpu); | ||
709 | WARN_ON(rc); | ||
710 | if (!rc) | ||
711 | rc = native_cpu_up(cpu, tidle); | ||
699 | return rc; | 712 | return rc; |
700 | } | 713 | } |
701 | 714 | ||