aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorAttilio Rao <attilio@FreeBSD.org>2013-08-09 11:11:11 +0000
committerAttilio Rao <attilio@FreeBSD.org>2013-08-09 11:11:11 +0000
commitc7aebda8a14a3bb94bb038df338549ccde5b56ea (patch)
treee2e9382aea2fd37ac6a9eec19380892618e99f37 /sys/dev
parent8ddc3590ccd6b5e65422aa0b8ad229498adf47aa (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/agp/agp.c4
-rw-r--r--sys/dev/drm2/i915/i915_gem.c27
-rw-r--r--sys/dev/drm2/ttm/ttm_bo_vm.c9
-rw-r--r--sys/dev/drm2/ttm/ttm_tt.c8
-rw-r--r--sys/dev/md/md.c8
5 files changed, 29 insertions, 27 deletions
diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c
index 2c3e4b951457..19a8e45b5c60 100644
--- a/sys/dev/agp/agp.c
+++ b/sys/dev/agp/agp.c
@@ -600,7 +600,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
goto bad;
}
}
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
}
VM_OBJECT_WUNLOCK(mem->am_obj);
@@ -627,7 +627,7 @@ bad:
for (k = 0; k < mem->am_size; k += PAGE_SIZE) {
m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k));
if (k >= i)
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
vm_page_lock(m);
vm_page_unwire(m, 0);
vm_page_unlock(m);
diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c
index 6b8bce351f19..a4276a2365ad 100644
--- a/sys/dev/drm2/i915/i915_gem.c
+++ b/sys/dev/drm2/i915/i915_gem.c
@@ -1356,9 +1356,8 @@ i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot,
*mres = NULL;
} else
oldm = NULL;
-retry:
VM_OBJECT_WUNLOCK(vm_obj);
-unlocked_vmobj:
+retry:
cause = ret = 0;
m = NULL;
@@ -1379,9 +1378,11 @@ unlocked_vmobj:
VM_OBJECT_WLOCK(vm_obj);
m = vm_page_lookup(vm_obj, OFF_TO_IDX(offset));
if (m != NULL) {
- if ((m->flags & VPO_BUSY) != 0) {
+ if (vm_page_busied(m)) {
DRM_UNLOCK(dev);
- vm_page_sleep(m, "915pee");
+ vm_page_lock(m);
+ VM_OBJECT_WUNLOCK(vm_obj);
+ vm_page_busy_sleep(m, "915pee");
goto retry;
}
goto have_page;
@@ -1435,16 +1436,18 @@ unlocked_vmobj:
("not fictitious %p", m));
KASSERT(m->wire_count == 1, ("wire_count not 1 %p", m));
- if ((m->flags & VPO_BUSY) != 0) {
+ if (vm_page_busied(m)) {
DRM_UNLOCK(dev);
- vm_page_sleep(m, "915pbs");
+ vm_page_lock(m);
+ VM_OBJECT_WUNLOCK(vm_obj);
+ vm_page_busy_sleep(m, "915pbs");
goto retry;
}
m->valid = VM_PAGE_BITS_ALL;
vm_page_insert(m, vm_obj, OFF_TO_IDX(offset));
have_page:
*mres = m;
- vm_page_busy(m);
+ vm_page_xbusy(m);
CTR4(KTR_DRM, "fault %p %jx %x phys %x", gem_obj, offset, prot,
m->phys_addr);
@@ -1465,7 +1468,7 @@ out:
-ret, cause);
if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) {
kern_yield(PRI_USER);
- goto unlocked_vmobj;
+ goto retry;
}
VM_OBJECT_WLOCK(vm_obj);
vm_object_pip_wakeup(vm_obj);
@@ -2330,7 +2333,7 @@ retry:
m = vm_page_lookup(devobj, i);
if (m == NULL)
continue;
- if (vm_page_sleep_if_busy(m, true, "915unm"))
+ if (vm_page_sleep_if_busy(m, "915unm"))
goto retry;
cdev_pager_free_page(devobj, m);
}
@@ -2504,10 +2507,8 @@ i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex)
int rv;
VM_OBJECT_ASSERT_WLOCKED(object);
- m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
- VM_ALLOC_RETRY);
+ m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
if (m->valid != VM_PAGE_BITS_ALL) {
- vm_page_busy(m);
if (vm_pager_has_page(object, pindex, NULL, NULL)) {
rv = vm_pager_get_pages(object, &m, 1, 0);
m = vm_page_lookup(object, pindex);
@@ -2524,11 +2525,11 @@ i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex)
m->valid = VM_PAGE_BITS_ALL;
m->dirty = 0;
}
- vm_page_wakeup(m);
}
vm_page_lock(m);
vm_page_wire(m);
vm_page_unlock(m);
+ vm_page_xunbusy(m);
atomic_add_long(&i915_gem_wired_pages_cnt, 1);
return (m);
}
diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c
index 08e1c8777c6b..0faf8688a2df 100644
--- a/sys/dev/drm2/ttm/ttm_bo_vm.c
+++ b/sys/dev/drm2/ttm/ttm_bo_vm.c
@@ -212,8 +212,11 @@ reserve:
}
VM_OBJECT_WLOCK(vm_obj);
- if ((m->flags & VPO_BUSY) != 0) {
- vm_page_sleep(m, "ttmpbs");
+ if (vm_page_busied(m)) {
+ vm_page_lock(m);
+ VM_OBJECT_WUNLOCK(vm_obj);
+ vm_page_busy_sleep(m, "ttmpbs");
+ VM_OBJECT_WLOCK(vm_obj);
ttm_mem_io_unlock(man);
ttm_bo_unreserve(bo);
goto retry;
@@ -228,7 +231,7 @@ reserve:
("inconsistent insert bo %p m %p m1 %p offset %jx",
bo, m, m1, (uintmax_t)offset));
}
- vm_page_busy(m);
+ vm_page_xbusy(m);
if (oldm != NULL) {
vm_page_lock(oldm);
diff --git a/sys/dev/drm2/ttm/ttm_tt.c b/sys/dev/drm2/ttm/ttm_tt.c
index c0fbb939c4ef..fe8e40619133 100644
--- a/sys/dev/drm2/ttm/ttm_tt.c
+++ b/sys/dev/drm2/ttm/ttm_tt.c
@@ -288,10 +288,8 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
VM_OBJECT_WLOCK(obj);
vm_object_pip_add(obj, 1);
for (i = 0; i < ttm->num_pages; ++i) {
- from_page = vm_page_grab(obj, i, VM_ALLOC_NOBUSY |
- VM_ALLOC_RETRY);
+ from_page = vm_page_grab(obj, i, VM_ALLOC_RETRY);
if (from_page->valid != VM_PAGE_BITS_ALL) {
- vm_page_busy(from_page);
if (vm_pager_has_page(obj, i, NULL, NULL)) {
rv = vm_pager_get_pages(obj, &from_page, 1, 0);
if (rv != VM_PAGER_OK) {
@@ -303,8 +301,8 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
}
} else
vm_page_zero_invalid(from_page, TRUE);
- vm_page_wakeup(from_page);
}
+ vm_page_xunbusy(from_page);
to_page = ttm->pages[i];
if (unlikely(to_page == NULL)) {
ret = -ENOMEM;
@@ -357,7 +355,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, vm_object_t persistent_swap_storage)
pmap_copy_page(from_page, to_page);
vm_page_dirty(to_page);
to_page->valid = VM_PAGE_BITS_ALL;
- vm_page_wakeup(to_page);
+ vm_page_xunbusy(to_page);
}
vm_object_pip_wakeup(obj);
VM_OBJECT_WUNLOCK(obj);
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 57c5b571485d..f8a97d35cadc 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -834,7 +834,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
else
rv = vm_pager_get_pages(sc->object, &m, 1, 0);
if (rv == VM_PAGER_ERROR) {
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
break;
} else if (rv == VM_PAGER_FAIL) {
/*
@@ -859,7 +859,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
else
rv = VM_PAGER_OK;
if (rv == VM_PAGER_ERROR) {
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
break;
}
if ((bp->bio_flags & BIO_UNMAPPED) != 0) {
@@ -875,7 +875,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
else
rv = VM_PAGER_OK;
if (rv == VM_PAGER_ERROR) {
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
break;
}
if (len != PAGE_SIZE) {
@@ -885,7 +885,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
} else
vm_pager_page_unswapped(m);
}
- vm_page_wakeup(m);
+ vm_page_xunbusy(m);
vm_page_lock(m);
if (bp->bio_cmd == BIO_DELETE && len == PAGE_SIZE)
vm_page_free(m);