diff options
author | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2019-02-13 16:21:54 +0000 |
---|---|---|
committer | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2019-02-13 23:29:16 +0000 |
commit | 0dffce43ebed3eede3daefae50319a3731a68e6d (patch) | |
tree | a045dac1acd8f3e8929ed2297ab0599743ac31b1 | |
parent | 2a78db82bec123064d30d051995cb4d577ca04ba (diff) | |
download | illumos-joyent-0dffce43ebed3eede3daefae50319a3731a68e6d.tar.gz |
OS-7424 bhyve: keep a list of deferred-destroyed VMs
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: John Levon <john.levon@joyent.com>
Approved by: Patrick Mooney <patrick.mooney@joyent.com>
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c b/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c index 62ee5e4c51..2fa0267f72 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c +++ b/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c @@ -11,7 +11,7 @@ /* * Copyright 2015 Pluribus Networks Inc. - * Copyright 2018 Joyent, Inc. + * Copyright 2019 Joyent, Inc. */ #include <sys/types.h> @@ -69,6 +69,7 @@ static sdev_plugin_hdl_t vmmdev_sdev_hdl; static kmutex_t vmm_mtx; static list_t vmm_list; +static list_t vmm_destroy_list; static id_space_t *vmm_minors; static void *vmm_statep; @@ -1504,6 +1505,7 @@ vmm_do_vm_destroy_locked(vmm_softc_t *sc, boolean_t clean_zsd) minor = sc->vmm_minor; zone_rele(sc->vmm_zone); if (sc->vmm_is_open) { + list_insert_tail(&vmm_destroy_list, sc); sc->vmm_flags |= VMM_DESTROY; } else { vm_destroy(sc->vmm_vm); @@ -1610,6 +1612,7 @@ vmm_close(dev_t dev, int flag, int otyp, cred_t *credp) sc->vmm_is_open = B_FALSE; if (sc->vmm_flags & VMM_DESTROY) { + list_remove(&vmm_destroy_list, sc); vm_destroy(sc->vmm_vm); ddi_soft_state_free(vmm_statep, minor); id_free(vmm_minors, minor); @@ -1920,7 +1923,7 @@ vmm_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) return (DDI_FAILURE); mutex_enter(&vmm_mtx); - if (!list_is_empty(&vmm_list)) { + if (!list_is_empty(&vmm_list) || !list_is_empty(&vmm_destroy_list)) { mutex_exit(&vmm_mtx); mutex_exit(&vmmdev_mtx); return (DDI_FAILURE); @@ -2003,6 +2006,8 @@ _init(void) mutex_init(&vmm_mtx, NULL, MUTEX_DRIVER, NULL); list_create(&vmm_list, sizeof (vmm_softc_t), offsetof(vmm_softc_t, vmm_node)); + list_create(&vmm_destroy_list, sizeof (vmm_softc_t), + offsetof(vmm_softc_t, vmm_node)); vmm_minors = id_space_create("vmm_minors", VMM_CTL_MINOR + 1, MAXMIN32); error = ddi_soft_state_init(&vmm_statep, sizeof (vmm_softc_t), 0); |