summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_object.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2000-05-29 22:40:54 +0000
committerdillon <dillon@FreeBSD.org>2000-05-29 22:40:54 +0000
commit82627e96a026e438a7251b0e5dc0a5322435693c (patch)
tree30efad495e652bce5e17011dd662ffce150ecd07 /sys/vm/vm_object.c
parent2e7f60e876b44bc7a2762fa018f17c30864bc19d (diff)
downloadFreeBSD-src-82627e96a026e438a7251b0e5dc0a5322435693c.zip
FreeBSD-src-82627e96a026e438a7251b0e5dc0a5322435693c.tar.gz
This is a cleanup patch to Peter's new OBJT_PHYS VM object type
and sysv shared memory support for it. It implements a new PG_UNMANAGED flag that has slightly different characteristics from PG_FICTICIOUS. A new sysctl, kern.ipc.shm_use_phys has been added to enable the use of physically-backed sysv shared memory rather then swap-backed. Physically backed shm segments are not tracked with PV entries, allowing programs which use a large shm segment as a rendezvous point to operate without eating an insane amount of KVM in the PV entry management. Read: Oracle. Peter's OBJT_PHYS object will also allow us to eventually implement page-table sharing and/or 4MB physical page support for such segments. We're half way there.
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r--sys/vm/vm_object.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 1b33f78..e5403d1 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -833,12 +833,14 @@ shadowlookup:
/*
* If the page is busy or not in a normal active state,
- * we skip it. Things can break if we mess with pages
- * in any of the below states.
+ * we skip it. If the page is not managed there are no
+ * page queues to mess with. Things can break if we mess
+ * with pages in any of the below states.
*/
if (
m->hold_count ||
m->wire_count ||
+ (m->flags & PG_UNMANAGED) ||
m->valid != VM_PAGE_BITS_ALL
) {
continue;
@@ -1394,6 +1396,13 @@ vm_object_page_remove(object, start, end, clean_only)
all = ((end == 0) && (start == 0));
+ /*
+ * Since physically-backed objects do not use managed pages, we can't
+ * remove pages from the object (we must instead remove the page
+ * references, and then destroy the object).
+ */
+ KASSERT(object->type != OBJT_PHYS, ("attempt to remove pages from a physical object"));
+
vm_object_pip_add(object, 1);
again:
size = end - start;
OpenPOWER on IntegriCloud