rework the synchronisation around suspend/resume.
authordlg <dlg@openbsd.org>
Mon, 19 Dec 2022 04:48:07 +0000 (04:48 +0000)
committerdlg <dlg@openbsd.org>
Mon, 19 Dec 2022 04:48:07 +0000 (04:48 +0000)
commitd9cf2d0edaeda9106a15609845212f03c293963d
tree22d3541ec68d282c7a03c3c30bef9956f47fbc96
parentd956567b8a83e77dcbaa40d1038b81c18ca02b19
rework the synchronisation around suspend/resume.

the idea is that access to vmm from userland is gated by the vmm_softc
sc_status field, and then accounted for by the refcnt. you take a read
lock to check the gate, and if it is open then you can take a reference
and do your thing. once you've finished the work then you rele the
refcnt on the way out of the ioctl handler.

the suspend code takes a write lock to close the sc_status gate,
and then uses refcnt_finalise to wait for things in the ioctl handler
to get out.

on resume, the code takes the write lock, sets the refcnt up again for
userland to use, and then opens the gate.

tested by and ok dv@
sys/arch/amd64/amd64/vmm.c