|
@@ -78,22 +78,29 @@ static void flat_send_IPI_mask(cpumask_t cpumask, int vector)
|
|
|
|
|
|
static void flat_send_IPI_allbutself(int vector)
|
|
|
{
|
|
|
-#ifndef CONFIG_HOTPLUG_CPU
|
|
|
- if (((num_online_cpus()) - 1) >= 1)
|
|
|
- __send_IPI_shortcut(APIC_DEST_ALLBUT, vector,APIC_DEST_LOGICAL);
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ int hotplug = 1;
|
|
|
#else
|
|
|
- cpumask_t allbutme = cpu_online_map;
|
|
|
+ int hotplug = 0;
|
|
|
+#endif
|
|
|
+ if (hotplug || vector == NMI_VECTOR) {
|
|
|
+ cpumask_t allbutme = cpu_online_map;
|
|
|
|
|
|
- cpu_clear(smp_processor_id(), allbutme);
|
|
|
+ cpu_clear(smp_processor_id(), allbutme);
|
|
|
|
|
|
- if (!cpus_empty(allbutme))
|
|
|
- flat_send_IPI_mask(allbutme, vector);
|
|
|
-#endif
|
|
|
+ if (!cpus_empty(allbutme))
|
|
|
+ flat_send_IPI_mask(allbutme, vector);
|
|
|
+ } else if (num_online_cpus() > 1) {
|
|
|
+ __send_IPI_shortcut(APIC_DEST_ALLBUT, vector,APIC_DEST_LOGICAL);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void flat_send_IPI_all(int vector)
|
|
|
{
|
|
|
- __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
|
|
|
+ if (vector == NMI_VECTOR)
|
|
|
+ flat_send_IPI_mask(cpu_online_map, vector);
|
|
|
+ else
|
|
|
+ __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
|
|
|
}
|
|
|
|
|
|
static int flat_apic_id_registered(void)
|