shared_info_t *s = HYPERVISOR_shared_info;
vcpu_info_t *vcpu_info = &s->vcpu_info[cpu];
+ BUG_ON(!irqs_disabled());
+
in_callback = 1;
vcpu_info->evtchn_upcall_pending = 0;
void force_evtchn_callback(void)
{
-#ifdef XEN_HAVE_PV_UPCALL_MASK
- int save;
-#endif
vcpu_info_t *vcpu;
+ unsigned long flags;
+
+ local_irq_save(flags);
+
vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()];
-#ifdef XEN_HAVE_PV_UPCALL_MASK
- save = vcpu->evtchn_upcall_mask;
-#endif
while (vcpu->evtchn_upcall_pending) {
-#ifdef XEN_HAVE_PV_UPCALL_MASK
- vcpu->evtchn_upcall_mask = 1;
-#endif
- barrier();
do_hypervisor_callback(NULL);
barrier();
-#ifdef XEN_HAVE_PV_UPCALL_MASK
- vcpu->evtchn_upcall_mask = save;
- barrier();
-#endif
};
+
+ local_irq_restore(flags);
}
inline void mask_evtchn(uint32_t port)
&vcpu_info->evtchn_pending_sel) )
{
vcpu_info->evtchn_upcall_pending = 1;
-#ifdef XEN_HAVE_PV_UPCALL_MASK
- if ( !vcpu_info->evtchn_upcall_mask )
-#endif
+ if ( !irqs_disabled() )
force_evtchn_callback();
}
}