diff options
Diffstat (limited to 'arch/x86/xen/smp.c')
-rw-r--r-- | arch/x86/xen/smp.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 8ff37995d54e..d99cae8147d1 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
19 | #include <linux/irq_work.h> | 19 | #include <linux/irq_work.h> |
20 | #include <linux/tick.h> | ||
20 | 21 | ||
21 | #include <asm/paravirt.h> | 22 | #include <asm/paravirt.h> |
22 | #include <asm/desc.h> | 23 | #include <asm/desc.h> |
@@ -447,6 +448,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ | |||
447 | play_dead_common(); | 448 | play_dead_common(); |
448 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 449 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
449 | cpu_bringup(); | 450 | cpu_bringup(); |
451 | /* | ||
452 | * commit 4b0c0f294 (tick: Cleanup NOHZ per cpu data on cpu down) | ||
453 | * clears certain data that the cpu_idle loop (which called us | ||
454 | * and that we return from) expects. The only way to get that | ||
455 | * data back is to call: | ||
456 | */ | ||
457 | tick_nohz_idle_enter(); | ||
450 | } | 458 | } |
451 | 459 | ||
452 | #else /* !CONFIG_HOTPLUG_CPU */ | 460 | #else /* !CONFIG_HOTPLUG_CPU */ |
@@ -576,24 +584,22 @@ void xen_send_IPI_mask_allbutself(const struct cpumask *mask, | |||
576 | { | 584 | { |
577 | unsigned cpu; | 585 | unsigned cpu; |
578 | unsigned int this_cpu = smp_processor_id(); | 586 | unsigned int this_cpu = smp_processor_id(); |
587 | int xen_vector = xen_map_vector(vector); | ||
579 | 588 | ||
580 | if (!(num_online_cpus() > 1)) | 589 | if (!(num_online_cpus() > 1) || (xen_vector < 0)) |
581 | return; | 590 | return; |
582 | 591 | ||
583 | for_each_cpu_and(cpu, mask, cpu_online_mask) { | 592 | for_each_cpu_and(cpu, mask, cpu_online_mask) { |
584 | if (this_cpu == cpu) | 593 | if (this_cpu == cpu) |
585 | continue; | 594 | continue; |
586 | 595 | ||
587 | xen_smp_send_call_function_single_ipi(cpu); | 596 | xen_send_IPI_one(cpu, xen_vector); |
588 | } | 597 | } |
589 | } | 598 | } |
590 | 599 | ||
591 | void xen_send_IPI_allbutself(int vector) | 600 | void xen_send_IPI_allbutself(int vector) |
592 | { | 601 | { |
593 | int xen_vector = xen_map_vector(vector); | 602 | xen_send_IPI_mask_allbutself(cpu_online_mask, vector); |
594 | |||
595 | if (xen_vector >= 0) | ||
596 | xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); | ||
597 | } | 603 | } |
598 | 604 | ||
599 | static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) | 605 | static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) |