Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/device_pager.c
Show First 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | |||||
cdev_pager_free_page(vm_object_t object, vm_page_t m) | cdev_pager_free_page(vm_object_t object, vm_page_t m) | ||||
{ | { | ||||
VM_OBJECT_ASSERT_WLOCKED(object); | VM_OBJECT_ASSERT_WLOCKED(object); | ||||
if (object->type == OBJT_MGTDEVICE) { | if (object->type == OBJT_MGTDEVICE) { | ||||
KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("unmanaged %p", m)); | KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("unmanaged %p", m)); | ||||
pmap_remove_all(m); | pmap_remove_all(m); | ||||
(void)vm_page_remove(m); | (void)vm_page_remove(m); | ||||
vm_page_xunbusy(m); | |||||
} else if (object->type == OBJT_DEVICE) | } else if (object->type == OBJT_DEVICE) | ||||
dev_pager_free_page(object, m); | dev_pager_free_page(object, m); | ||||
} | } | ||||
static void | static void | ||||
dev_pager_free_page(vm_object_t object, vm_page_t m) | dev_pager_free_page(vm_object_t object, vm_page_t m) | ||||
{ | { | ||||
Show All 18 Lines | dev_pager_dealloc(vm_object_t object) | ||||
mtx_unlock(&dev_pager_mtx); | mtx_unlock(&dev_pager_mtx); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
if (object->type == OBJT_DEVICE) { | if (object->type == OBJT_DEVICE) { | ||||
/* | /* | ||||
* Free up our fake pages. | * Free up our fake pages. | ||||
*/ | */ | ||||
while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) | while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) | ||||
!= NULL) | != NULL) { | ||||
if (vm_page_busy_acquire(m, VM_ALLOC_WAITFAIL) == 0) | |||||
continue; | |||||
dev_pager_free_page(object, m); | dev_pager_free_page(object, m); | ||||
} | } | ||||
} | |||||
object->handle = NULL; | object->handle = NULL; | ||||
object->type = OBJT_DEAD; | object->type = OBJT_DEAD; | ||||
} | } | ||||
static int | static int | ||||
dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, | dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, | ||||
int *rahead) | int *rahead) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | if (((*mres)->flags & PG_FICTITIOUS) != 0) { | ||||
vm_page_updatefake(page, paddr, memattr); | vm_page_updatefake(page, paddr, memattr); | ||||
} else { | } else { | ||||
/* | /* | ||||
* Replace the passed in reqpage page with our own fake page and | * Replace the passed in reqpage page with our own fake page and | ||||
* free up the all of the original pages. | * free up the all of the original pages. | ||||
*/ | */ | ||||
page = vm_page_getfake(paddr, memattr); | page = vm_page_getfake(paddr, memattr); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
vm_page_replace_checked(page, object, (*mres)->pindex, *mres); | vm_page_replace(page, object, (*mres)->pindex, *mres); | ||||
vm_page_free(*mres); | |||||
*mres = page; | *mres = page; | ||||
} | } | ||||
vm_page_valid(page); | vm_page_valid(page); | ||||
return (VM_PAGER_OK); | return (VM_PAGER_OK); | ||||
} | } | ||||
static void | static void | ||||
dev_pager_putpages(vm_object_t object, vm_page_t *m, int count, int flags, | dev_pager_putpages(vm_object_t object, vm_page_t *m, int count, int flags, | ||||
▲ Show 20 Lines • Show All 65 Lines • Show Last 20 Lines |