--- sys/arch/amd64/amd64/vmm.c | 63 ++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 30 deletions(-)
diff --git a/sys/arch/amd64/amd64/vmm.c b/sys/arch/amd64/amd64/vmm.c index 84fcb23a5..f6d51737e 100644 --- a/sys/arch/amd64/amd64/vmm.c +++ b/sys/arch/amd64/amd64/vmm.c @@ -558,6 +558,34 @@ vmmclose(dev_t dev, int flag, int mode, struct proc *p) return 0; } +/* + * vm_find_vcpu + * + * Lookup VMM VCPU by ID number + * + * Parameters: + * vm: vm structure + * id: index id of vcpu + * + * Returns pointer to vcpu structure if successful, NULL otherwise + */ +static struct vcpu * +vm_find_vcpu(struct vm *vm, uint32_t id) +{ + struct vcpu *vcpu; + + if (vm == NULL) + return NULL; + rw_enter_read(&vm->vm_vcpu_lock); + SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { + if (vcpu->vc_id == id) + break; + } + rw_exit_read(&vm->vm_vcpu_lock); + return vcpu; +} + + /* * vm_resetcpu * @@ -591,12 +619,7 @@ vm_resetcpu(struct vm_resetcpu_params *vrp) return (error); } - rw_enter_read(&vm->vm_vcpu_lock); - SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { - if (vcpu->vc_id == vrp->vrp_vcpu_id) - break; - } - rw_exit_read(&vm->vm_vcpu_lock); + vcpu = vm_find_vcpu(vm, vrp->vrp_vcpu_id); if (vcpu == NULL) { DPRINTF("%s: vcpu id %u of vm %u not found\n", __func__, @@ -657,12 +680,7 @@ vm_intr_pending(struct vm_intr_params *vip) return (error); } - rw_enter_read(&vm->vm_vcpu_lock); - SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { - if (vcpu->vc_id == vip->vip_vcpu_id) - break; - } - rw_exit_read(&vm->vm_vcpu_lock); + vcpu = vm_find_vcpu(vm, vip->vip_vcpu_id); rw_exit_read(&vmm_softc->vm_lock); if (vcpu == NULL) @@ -722,12 +740,7 @@ vm_rwvmparams(struct vm_rwvmparams_params *vpp, int dir) { return (error); } - rw_enter_read(&vm->vm_vcpu_lock); - SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { - if (vcpu->vc_id == vpp->vpp_vcpu_id) - break; - } - rw_exit_read(&vm->vm_vcpu_lock); + vcpu = vm_find_vcpu(vm, vpp->vpp_vcpu_id); rw_exit_read(&vmm_softc->vm_lock); if (vcpu == NULL) @@ -786,12 +799,7 @@ vm_rwregs(struct vm_rwregs_params *vrwp, int dir) return (error); } - rw_enter_read(&vm->vm_vcpu_lock); - SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { - if (vcpu->vc_id == vrwp->vrwp_vcpu_id) - break; - } - rw_exit_read(&vm->vm_vcpu_lock); + vcpu = vm_find_vcpu(vm, vrwp->vrwp_vcpu_id); rw_exit_read(&vmm_softc->vm_lock); if (vcpu == NULL) @@ -858,12 +866,7 @@ vm_mprotect_ept(struct vm_mprotect_ept_params *vmep) return (ret); } - rw_enter_read(&vm->vm_vcpu_lock); - SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) { - if (vcpu->vc_id == vmep->vmep_vcpu_id) - break; - } - rw_exit_read(&vm->vm_vcpu_lock); + vcpu = vm_find_vcpu(vm, vmep->vmep_vcpu_id); if (vcpu == NULL) { DPRINTF("%s: vcpu id %u of vm %u not found\n", __func__, -- 2.26.2