Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/vmm.c
Show First 20 Lines • Show All 1,298 Lines • ▼ Show 20 Lines | vm_handle_rendezvous(struct vm *vm, int vcpuid) | ||||
KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < vm->maxcpus), | KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < vm->maxcpus), | ||||
("vm_handle_rendezvous: invalid vcpuid %d", vcpuid)); | ("vm_handle_rendezvous: invalid vcpuid %d", vcpuid)); | ||||
error = 0; | error = 0; | ||||
td = curthread; | td = curthread; | ||||
mtx_lock(&vm->rendezvous_mtx); | mtx_lock(&vm->rendezvous_mtx); | ||||
while (vm->rendezvous_func != NULL) { | while (vm->rendezvous_func != NULL) { | ||||
/* 'rendezvous_req_cpus' must be a subset of 'active_cpus' */ | /* 'rendezvous_req_cpus' must be a subset of 'active_cpus' */ | ||||
CPU_AND(&vm->rendezvous_req_cpus, &vm->active_cpus); | CPU_AND(&vm->rendezvous_req_cpus, &vm->rendezvous_req_cpus, &vm->active_cpus); | ||||
if (vcpuid != -1 && | if (vcpuid != -1 && | ||||
CPU_ISSET(vcpuid, &vm->rendezvous_req_cpus) && | CPU_ISSET(vcpuid, &vm->rendezvous_req_cpus) && | ||||
!CPU_ISSET(vcpuid, &vm->rendezvous_done_cpus)) { | !CPU_ISSET(vcpuid, &vm->rendezvous_done_cpus)) { | ||||
VCPU_CTR0(vm, vcpuid, "Calling rendezvous func"); | VCPU_CTR0(vm, vcpuid, "Calling rendezvous func"); | ||||
(*vm->rendezvous_func)(vm, vcpuid, vm->rendezvous_arg); | (*vm->rendezvous_func)(vm, vcpuid, vm->rendezvous_arg); | ||||
CPU_SET(vcpuid, &vm->rendezvous_done_cpus); | CPU_SET(vcpuid, &vm->rendezvous_done_cpus); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,638 Lines • Show Last 20 Lines |