On Thu, Jun 02, 2022 at 03:05:16PM -0400, Dave Voutila wrote: > > Dave Voutila <d...@sisu.io> writes: > > > tech@ et al.: > > > > Looking for testers of the following diff for vmm(4). In my efforts to > > fix some stability issues, I'm taking baby steps tweaking parts of the > > code to make my upcoming proposal (adding refcnts) easier to swallow. > > > > This change removes the calling of vm_teardown from the code path in > > vm_run after vmm has exited the vm/vcpu and is on its way back to > > userland/vmd(8). > > > > vm_teardown is currently called in 3 areas to destroy/free a vm: > > > > - vm_create: as cleanup in an error path > > - vm_terminate: on a vm the ioctl is killing > > - vm_run: the run ioctl handler > > > > This diff removes that last bullet. It's not needed as vmd will cleanup > > the vm on child exit, calling vm_terminate. Any non-vmd user of vmm(4) > > can stop being lazy and use the VMM_IOC_TERM ioctl. > > > > Not included in the snippet is the existing final else block that still > > toggles the vcpu state: > > > > } else { > > vrp->vrp_exit_reason = VM_EXIT_TERMINATED; > > vcpu->vc_state = VCPU_STATE_TERMINATED; > > } > > > > If testing, please describe *any* difference in shutdown/reboot of vm > > guests. (n.b. there's a known issue for Linux guests running very recent > > Linux kernels not being able to reboot. That needs to be addressed in > > vmd.) > > > > Bumping as the diff has been out for testing and looking for ok's. > > -dv >
ok mlarkin if this helps your subsequent cleanup > > > > > > Index: sys/arch/amd64/amd64/vmm.c > > =================================================================== > > RCS file: /opt/cvs/src/sys/arch/amd64/amd64/vmm.c,v > > retrieving revision 1.311 > > diff -u -p -r1.311 vmm.c > > --- sys/arch/amd64/amd64/vmm.c 20 May 2022 22:42:09 -0000 1.311 > > +++ sys/arch/amd64/amd64/vmm.c 23 May 2022 11:57:49 -0000 > > @@ -4495,22 +4495,8 @@ vm_run(struct vm_run_params *vrp) > > ret = vcpu_run_svm(vcpu, vrp); > > } > > > > - /* > > - * We can set the VCPU states here without CAS because once > > - * a VCPU is in state RUNNING or REQTERM, only the VCPU itself > > - * can switch the state. > > - */ > > atomic_dec_int(&vm->vm_vcpus_running); > > - if (vcpu->vc_state == VCPU_STATE_REQTERM) { > > - vrp->vrp_exit_reason = VM_EXIT_TERMINATED; > > - vcpu->vc_state = VCPU_STATE_TERMINATED; > > - if (vm->vm_vcpus_running == 0) { > > - rw_enter_write(&vmm_softc->vm_lock); > > - vm_teardown(vm); > > - rw_exit_write(&vmm_softc->vm_lock); > > - } > > - ret = 0; > > - } else if (ret == 0 || ret == EAGAIN) { > > + if (ret == 0 || ret == EAGAIN) { > > /* If we are exiting, populate exit data so vmd can help. */ > > vrp->vrp_exit_reason = (ret == 0) ? VM_EXIT_NONE > > : vcpu->vc_gueststate.vg_exit_reason; > > > -- > -Dave Voutila