summaryrefslogtreecommitdiffstats
path: root/sys/vm/phys_pager.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/phys_pager.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/phys_pager.c')
-rw-r--r--sys/vm/phys_pager.c21
1 files changed, 3 insertions, 18 deletions
diff --git a/sys/vm/phys_pager.c b/sys/vm/phys_pager.c
index a48126c..586844f 100644
--- a/sys/vm/phys_pager.c
+++ b/sys/vm/phys_pager.c
@@ -104,7 +104,9 @@ phys_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot,
object = vm_object_allocate(OBJT_PHYS,
OFF_TO_IDX(foff + size));
object->handle = handle;
+#if 0
TAILQ_INIT(&object->un_pager.physp.physp_pglist);
+#endif
TAILQ_INSERT_TAIL(&phys_pager_object_list, object,
pager_object_list);
} else {
@@ -131,20 +133,6 @@ phys_pager_dealloc(object)
int s;
TAILQ_REMOVE(&phys_pager_object_list, object, pager_object_list);
- /*
- * Free up our fake pages.
- */
- s = splvm();
- while ((m = TAILQ_FIRST(&object->un_pager.physp.physp_pglist)) != 0) {
- TAILQ_REMOVE(&object->un_pager.physp.physp_pglist, m, pageq);
- /* return the page back to normal */
- m->flags &= ~PG_FICTITIOUS;
- m->dirty = 0;
- vm_page_unwire(m, 0);
- vm_page_flag_clear(m, PG_ZERO);
- vm_page_free(m);
- }
- splx(s);
}
static int
@@ -165,8 +153,7 @@ phys_pager_getpages(object, m, count, reqpage)
vm_page_zero_fill(m[i]);
vm_page_flag_set(m[i], PG_ZERO);
/* Switch off pv_entries */
- vm_page_wire(m[i]);
- vm_page_flag_set(m[i], PG_FICTITIOUS);
+ vm_page_unmanage(m[i]);
m[i]->valid = VM_PAGE_BITS_ALL;
m[i]->dirty = 0;
/* The requested page must remain busy, the others not. */
@@ -174,8 +161,6 @@ phys_pager_getpages(object, m, count, reqpage)
vm_page_flag_clear(m[i], PG_BUSY);
m[i]->busy = 0;
}
- TAILQ_INSERT_TAIL(&object->un_pager.physp.physp_pglist, m[i],
- pageq);
}
splx(s);
OpenPOWER on IntegriCloud