Re: vmm: remove vm teardown from vcpu run path (testers needed)

2022-06-05 Thread Mike Larkin
On Thu, Jun 02, 2022 at 03:05:16PM -0400, Dave Voutila wrote:
>
> Dave Voutila  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 -  1.311
> > +++ sys/arch/amd64/amd64/vmm.c  23 May 2022 11:57:49 -
> > @@ -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_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(_softc->vm_lock);
> > -   vm_teardown(vm);
> > -   rw_exit_write(_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



Re: vmm: remove vm teardown from vcpu run path (testers needed)

2022-06-02 Thread Dave Voutila


Dave Voutila  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

>
>
> 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.c20 May 2022 22:42:09 -  1.311
> +++ sys/arch/amd64/amd64/vmm.c23 May 2022 11:57:49 -
> @@ -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_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(_softc->vm_lock);
> - vm_teardown(vm);
> - rw_exit_write(_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



vmm: remove vm teardown from vcpu run path (testers needed)

2022-05-23 Thread Dave Voutila
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.)

thx,
dv


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 -  1.311
+++ sys/arch/amd64/amd64/vmm.c  23 May 2022 11:57:49 -
@@ -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_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(_softc->vm_lock);
-   vm_teardown(vm);
-   rw_exit_write(_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;