diff options
Diffstat (limited to 'sys/dev/drm2/ttm/ttm_bo_vm.c')
-rw-r--r-- | sys/dev/drm2/ttm/ttm_bo_vm.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c index 4f6c66382453..a30205358540 100644 --- a/sys/dev/drm2/ttm/ttm_bo_vm.c +++ b/sys/dev/drm2/ttm/ttm_bo_vm.c @@ -35,7 +35,8 @@ * <kib@FreeBSD.org> under sponsorship from the FreeBSD Foundation. */ -#include <sys/cdefs.h> +#include <sys/param.h> +#include <sys/pctrie.h> #include "opt_vm.h" #include <dev/drm2/drmP.h> @@ -46,6 +47,7 @@ #include <vm/vm.h> #include <vm/vm_page.h> #include <vm/vm_pageout.h> +#include <vm/vm_radix.h> #define TTM_BO_VM_NUM_PREFAULT 16 @@ -100,7 +102,7 @@ static int ttm_bo_vm_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot, vm_page_t *mres) { - + struct pctrie_iter pages; struct ttm_buffer_object *bo = vm_obj->handle; struct ttm_bo_device *bdev = bo->bdev; struct ttm_tt *ttm = NULL; @@ -114,6 +116,7 @@ ttm_bo_vm_fault(vm_object_t vm_obj, vm_ooffset_t offset, if (*mres != NULL) { (void)vm_page_remove(*mres); } + vm_page_iter_init(&pages, vm_obj); retry: VM_OBJECT_WUNLOCK(vm_obj); m = NULL; @@ -234,10 +237,12 @@ reserve: ttm_bo_unreserve(bo); goto retry; } - m1 = vm_page_lookup(vm_obj, OFF_TO_IDX(offset)); + pctrie_iter_reset(&pages); + m1 = vm_radix_iter_lookup(&pages, OFF_TO_IDX(offset)); /* XXX This looks like it should just be vm_page_replace? */ if (m1 == NULL) { - if (vm_page_insert(m, vm_obj, OFF_TO_IDX(offset))) { + if (vm_page_iter_insert( + m, vm_obj, OFF_TO_IDX(offset), &pages) != 0) { vm_page_xunbusy(m); VM_OBJECT_WUNLOCK(vm_obj); vm_wait(vm_obj); @@ -361,26 +366,12 @@ void ttm_bo_release_mmap(struct ttm_buffer_object *bo) { vm_object_t vm_obj; - vm_page_t m; - int i; vm_obj = cdev_pager_lookup(bo); - if (vm_obj == NULL) - return; - - VM_OBJECT_WLOCK(vm_obj); -retry: - for (i = 0; i < bo->num_pages; i++) { - m = vm_page_lookup(vm_obj, i); - if (m == NULL) - continue; - if (vm_page_busy_acquire(m, VM_ALLOC_WAITFAIL) == 0) - goto retry; - cdev_pager_free_page(vm_obj, m); + if (vm_obj != NULL) { + cdev_mgtdev_pager_free_pages(vm_obj); + vm_object_deallocate(vm_obj); } - VM_OBJECT_WUNLOCK(vm_obj); - - vm_object_deallocate(vm_obj); } #if 0 |