aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2019-06-26 17:37:51 +0000
committerMark Johnston <markj@FreeBSD.org>2019-06-26 17:37:51 +0000
commit0fd977b3fa32d54b61554416363faae8a7bfaa2b (patch)
tree224a32e71fe89996fe93ab9584f9613473e1b38d /sys
parent926c3367c8dd9bf69c81699618ce2a71c6fa7bc3 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/sgx/sgx.c2
-rw-r--r--sys/dev/drm2/ttm/ttm_bo_vm.c2
-rw-r--r--sys/vm/device_pager.c2
-rw-r--r--sys/vm/vm_fault.c2
-rw-r--r--sys/vm/vm_object.c8
-rw-r--r--sys/vm/vm_page.c15
-rw-r--r--sys/vm/vm_page.h2
7 files changed, 16 insertions, 17 deletions
diff --git a/sys/amd64/sgx/sgx.c b/sys/amd64/sgx/sgx.c
index d47d4a3596a50..3d45b60de3ef5 100644
--- a/sys/amd64/sgx/sgx.c
+++ b/sys/amd64/sgx/sgx.c
@@ -358,7 +358,7 @@ sgx_page_remove(struct sgx_softc *sc, vm_page_t p)
uint64_t offs;
vm_page_lock(p);
- vm_page_remove(p);
+ (void)vm_page_remove(p);
vm_page_unlock(p);
dprintf("%s: p->pidx %ld\n", __func__, p->pindex);
diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c
index 6f7184857ce6f..43d027fc5cd91 100644
--- a/sys/dev/drm2/ttm/ttm_bo_vm.c
+++ b/sys/dev/drm2/ttm/ttm_bo_vm.c
@@ -115,7 +115,7 @@ ttm_bo_vm_fault(vm_object_t vm_obj, vm_ooffset_t offset,
vm_object_pip_add(vm_obj, 1);
if (*mres != NULL) {
vm_page_lock(*mres);
- vm_page_remove(*mres);
+ (void)vm_page_remove(*mres);
vm_page_unlock(*mres);
}
retry:
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c
index c27d60869deff..7dce4778f9513 100644
--- a/sys/vm/device_pager.c
+++ b/sys/vm/device_pager.c
@@ -236,7 +236,7 @@ cdev_pager_free_page(vm_object_t object, vm_page_t m)
KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("unmanaged %p", m));
pmap_remove_all(m);
vm_page_lock(m);
- vm_page_remove(m);
+ (void)vm_page_remove(m);
vm_page_unlock(m);
} else if (object->type == OBJT_DEVICE)
dev_pager_free_page(object, m);
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 4268db264d52b..ae0103595ae7d 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -1144,7 +1144,7 @@ readrest:
fs.object == fs.first_object->backing_object) {
vm_page_lock(fs.m);
vm_page_dequeue(fs.m);
- vm_page_remove(fs.m);
+ (void)vm_page_remove(fs.m);
vm_page_unlock(fs.m);
vm_page_lock(fs.first_m);
vm_page_replace_checked(fs.m, fs.first_object,
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 9fd90f04b6d97..7c3575e646cf8 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1595,10 +1595,8 @@ vm_object_collapse_scan(vm_object_t object, int op)
vm_page_lock(p);
KASSERT(!pmap_page_is_mapped(p),
("freeing mapped page %p", p));
- if (!vm_page_wired(p))
+ if (vm_page_remove(p))
vm_page_free(p);
- else
- vm_page_remove(p);
vm_page_unlock(p);
continue;
}
@@ -1639,10 +1637,8 @@ vm_object_collapse_scan(vm_object_t object, int op)
vm_page_lock(p);
KASSERT(!pmap_page_is_mapped(p),
("freeing mapped page %p", p));
- if (!vm_page_wired(p))
+ if (vm_page_remove(p))
vm_page_free(p);
- else
- vm_page_remove(p);
vm_page_unlock(p);
continue;
}
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index a90961ce57b55..e43817b812a0e 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -1458,20 +1458,21 @@ vm_page_insert_radixdone(vm_page_t m, vm_object_t object, vm_page_t mpred)
* vm_page_remove:
*
* Removes the specified page from its containing object, but does not
- * invalidate any backing storage.
+ * invalidate any backing storage. Return true if the page may be safely
+ * freed and false otherwise.
*
* The object must be locked. The page must be locked if it is managed.
*/
-void
+bool
vm_page_remove(vm_page_t m)
{
vm_object_t object;
vm_page_t mrem;
+ object = m->object;
+
if ((m->oflags & VPO_UNMANAGED) == 0)
vm_page_assert_locked(m);
- if ((object = m->object) == NULL)
- return;
VM_OBJECT_ASSERT_WLOCKED(object);
if (vm_page_xbusied(m))
vm_page_xunbusy_maybelocked(m);
@@ -1495,6 +1496,7 @@ vm_page_remove(vm_page_t m)
vdrop(object->handle);
m->object = NULL;
+ return (!vm_page_wired(m));
}
/*
@@ -1665,7 +1667,7 @@ vm_page_rename(vm_page_t m, vm_object_t new_object, vm_pindex_t new_pindex)
*/
m->pindex = opidx;
vm_page_lock(m);
- vm_page_remove(m);
+ (void)vm_page_remove(m);
/* Return back to the new pindex to complete vm_page_insert(). */
m->pindex = new_pindex;
@@ -3436,7 +3438,8 @@ vm_page_free_prep(vm_page_t m)
if (vm_page_sbusied(m))
panic("vm_page_free_prep: freeing busy page %p", m);
- vm_page_remove(m);
+ if (m->object != NULL)
+ (void)vm_page_remove(m);
/*
* If fictitious remove object association and
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index d1938d2a1bd88..57f9f6e9081ce 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -561,7 +561,7 @@ bool vm_page_reclaim_contig(int req, u_long npages, vm_paddr_t low,
bool vm_page_reclaim_contig_domain(int domain, int req, u_long npages,
vm_paddr_t low, vm_paddr_t high, u_long alignment, vm_paddr_t boundary);
void vm_page_reference(vm_page_t m);
-void vm_page_remove (vm_page_t);
+bool vm_page_remove(vm_page_t);
int vm_page_rename (vm_page_t, vm_object_t, vm_pindex_t);
vm_page_t vm_page_replace(vm_page_t mnew, vm_object_t object,
vm_pindex_t pindex);