--- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -212,6 +212,12 @@ mtx_lock(&dev_pager_mtx); TAILQ_REMOVE(&dev_pager_object_list, object, pager_object_entry); + if (object->un_pager.devp.ops->cdev_pg_ctor == old_dev_pager_ctor) { + cdev_t odev = object->un_pager.devp.dev; + + if (odev != NULL && odev->si_object == object) + odev->si_object = NULL; + } mtx_unlock(&dev_pager_mtx); if (object->type == OBJT_DEVICE) { @@ -336,13 +342,8 @@ static void old_dev_pager_dtor(void *handle) { - cdev_t dev; - - dev = handle; - if (dev != NULL) { - KKASSERT(dev->si_object); - dev->si_object = NULL; - } + /* si_object bookkeeping moved under dev_pager_mtx in + * dev_pager_dealloc() after the object is unlinked. */ } static int