aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/drm2/ttm/ttm_bo_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/drm2/ttm/ttm_bo_vm.c')
-rw-r--r--sys/dev/drm2/ttm/ttm_bo_vm.c33
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