| 945 | } |
| 946 | |
| 947 | static void |
| 948 | vmmdev_destroy(void *arg) |
| 949 | { |
| 950 | struct vmmdev_softc *sc = arg; |
| 951 | struct devmem_softc *dsc; |
| 952 | int error; |
| 953 | |
| 954 | error = vcpu_lock_all(sc); |
| 955 | KASSERT(error == 0, ("%s: error %d freezing vcpus", __func__, error)); |
| 956 | |
| 957 | while ((dsc = SLIST_FIRST(&sc->devmem)) != NULL) { |
| 958 | KASSERT(dsc->cdev == NULL, ("%s: devmem not free", __func__)); |
| 959 | SLIST_REMOVE_HEAD(&sc->devmem, link); |
| 960 | free(dsc->name, M_VMMDEV); |
| 961 | free(dsc, M_VMMDEV); |
| 962 | } |
| 963 | |
| 964 | if (sc->cdev != NULL) |
| 965 | destroy_dev(sc->cdev); |
| 966 | |
| 967 | if (sc->vm != NULL) |
| 968 | vm_destroy(sc->vm); |
| 969 | |
| 970 | if ((sc->flags & VSC_LINKED) != 0) { |
| 971 | mtx_lock(&vmmdev_mtx); |
| 972 | SLIST_REMOVE(&head, sc, vmmdev_softc, link); |
| 973 | mtx_unlock(&vmmdev_mtx); |
| 974 | } |
| 975 | |
| 976 | free(sc, M_VMMDEV); |
| 977 | } |
| 978 | |
| 979 | static int |
| 980 | sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS) |
no test coverage detected