*/
cpu_clear(smp_processor_id(), cpu_online_map);
local_irq_disable();
-#if 0
- disable_local_APIC();
-#endif
+ disable_all_local_evtchn();
if (cpu_data[smp_processor_id()].hlt_works_ok)
for(;;) halt();
for (;;);
smp_call_function(stop_this_cpu, NULL, 1, 0);
local_irq_disable();
-#if 0
- disable_local_APIC();
-#endif
+ disable_all_local_evtchn();
local_irq_enable();
}
*/
cpu_clear(smp_processor_id(), cpu_online_map);
local_irq_save(flags);
-#ifndef CONFIG_XEN
- disable_local_APIC();
-#endif
+ disable_all_local_evtchn();
local_irq_restore(flags);
}
spin_unlock(&call_lock);
local_irq_disable();
-#ifndef CONFIG_XEN
- disable_local_APIC();
-#endif
+ disable_all_local_evtchn();
local_irq_enable();
}
}
EXPORT_SYMBOL_GPL(unmask_evtchn);
+void disable_all_local_evtchn(void)
+{
+ unsigned i, cpu = smp_processor_id();
+ shared_info_t *s = HYPERVISOR_shared_info;
+
+ for (i = 0; i < NR_EVENT_CHANNELS; ++i)
+ if (cpu_from_evtchn(i) == cpu)
+ synch_set_bit(i, &s->evtchn_mask[0]);
+}
+
static void restore_cpu_virqs(int cpu)
{
struct evtchn_bind_virq bind_virq;
void evtchn_device_upcall(int port);
void mask_evtchn(int port);
+void disable_all_local_evtchn(void);
void unmask_evtchn(int port);
#ifdef CONFIG_SMP