/* * mem_event_mark_and_pause() tags vcpu and put it to sleep. * The vcpu will resume execution in mem_event_wake_waiters(). */ void mem_event_mark_and_pause(struct vcpu *v, struct mem_event_domain *med) { if ( !test_and_set_bit(med->pause_flag, &v->pause_flags) ) { vcpu_pause_nosync(v); med->blocked++; } }
static void vcpu_check_shutdown(struct vcpu *v) { struct domain *d = v->domain; spin_lock(&d->shutdown_lock); if ( d->is_shutting_down ) { if ( !v->paused_for_shutdown ) vcpu_pause_nosync(v); v->paused_for_shutdown = 1; v->defer_shutdown = 0; __domain_finalise_shutdown(d); } spin_unlock(&d->shutdown_lock); }
void domain_shutdown(struct domain *d, u8 reason) { struct vcpu *v; spin_lock(&d->shutdown_lock); if ( d->shutdown_code == -1 ) d->shutdown_code = reason; reason = d->shutdown_code; if ( d->domain_id == 0 ) dom0_shutdown(reason); if ( d->is_shutting_down ) { spin_unlock(&d->shutdown_lock); return; } d->is_shutting_down = 1; smp_mb(); /* set shutdown status /then/ check for per-cpu deferrals */ for_each_vcpu ( d, v ) { if ( reason == SHUTDOWN_crash ) v->defer_shutdown = 0; else if ( v->defer_shutdown ) continue; vcpu_pause_nosync(v); v->paused_for_shutdown = 1; } __domain_finalise_shutdown(d); spin_unlock(&d->shutdown_lock); }