static void domain_shutdown_finalise(void) { struct domain *d; struct vcpu *v; d = domain_shuttingdown[smp_processor_id()]; domain_shuttingdown[smp_processor_id()] = NULL; BUG_ON(d == NULL); BUG_ON(d == current->domain); LOCK_BIGLOCK(d); /* Make sure that every vcpu is descheduled before we finalise. */ for_each_vcpu ( d, v ) vcpu_sleep_sync(v); BUG_ON(!cpus_empty(d->domain_dirty_cpumask)); sync_pagetable_state(d); /* Don't set DOMF_shutdown until execution contexts are sync'ed. */ if ( !test_and_set_bit(_DOMF_shutdown, &d->domain_flags) ) send_guest_virq(dom0->vcpu[0], VIRQ_DOM_EXC); UNLOCK_BIGLOCK(d); put_domain(d); }
void domain_pause(struct domain *d) { struct vcpu *v; ASSERT(d != current->domain); atomic_inc(&d->pause_count); for_each_vcpu( d, v ) vcpu_sleep_sync(v); }
void vcpu_pause(struct vcpu *v) { ASSERT(v != current); atomic_inc(&v->pause_count); vcpu_sleep_sync(v); }