summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r--sys/vm/vm_map.c165
1 files changed, 33 insertions, 132 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index e047dab..2b6680e 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.78 1997/06/23 21:51:03 tegge Exp $
+ * $Id: vm_map.c,v 1.79 1997/07/27 04:44:12 dyson Exp $
*/
/*
@@ -89,6 +89,7 @@
#include <vm/vm_pager.h>
#include <vm/vm_extern.h>
#include <vm/default_pager.h>
+#include <vm/vm_zone.h>
/*
* Virtual memory maps provide for the mapping, protection,
@@ -148,20 +149,17 @@
* maps and requires map entries.
*/
-vm_offset_t kentry_data;
-vm_size_t kentry_data_size;
-static vm_map_entry_t kentry_free;
-static vm_map_t kmap_free;
extern char kstack[];
extern int inmprotect;
static int kentry_count;
-static vm_offset_t mapvm_start, mapvm, mapvmmax;
-static int mapvmpgcnt;
-
-static struct vm_map_entry *mappool;
-static int mappoolcnt;
-#define KENTRY_LOW_WATER 128
+static struct vm_zone kmapentzone_store, mapentzone_store, mapzone_store;
+static vm_zone_t mapentzone, kmapentzone, mapzone;
+static struct vm_object kmapentobj, mapentobj, mapobj;
+#define MAP_ENTRY_INIT 128
+struct vm_map_entry map_entry_init[MAX_MAPENT];
+struct vm_map_entry kmap_entry_init[MAX_KMAPENT];
+struct vm_map map_init[MAX_KMAP];
static void _vm_map_clip_end __P((vm_map_t, vm_map_entry_t, vm_offset_t));
static void _vm_map_clip_start __P((vm_map_t, vm_map_entry_t, vm_offset_t));
@@ -175,33 +173,15 @@ static void vm_map_copy_entry __P((vm_map_t, vm_map_t, vm_map_entry_t,
void
vm_map_startup()
{
- register int i;
- register vm_map_entry_t mep;
- vm_map_t mp;
-
- /*
- * Static map structures for allocation before initialization of
- * kernel map or kmem map. vm_map_create knows how to deal with them.
- */
- kmap_free = mp = (vm_map_t) kentry_data;
- i = MAX_KMAP;
- while (--i > 0) {
- mp->header.next = (vm_map_entry_t) (mp + 1);
- mp++;
- }
- mp++->header.next = NULL;
-
- /*
- * Form a free list of statically allocated kernel map entries with
- * the rest.
- */
- kentry_free = mep = (vm_map_entry_t) mp;
- kentry_count = i = (kentry_data_size - MAX_KMAP * sizeof *mp) / sizeof *mep;
- while (--i > 0) {
- mep->next = mep + 1;
- mep++;
- }
- mep->next = NULL;
+ mapzone = &mapzone_store;
+ _zbootinit(mapzone, "MAP", sizeof (struct vm_map),
+ map_init, MAX_KMAP);
+ kmapentzone = &kmapentzone_store;
+ _zbootinit(kmapentzone, "KMAP ENTRY", sizeof (struct vm_map_entry),
+ kmap_entry_init, MAX_KMAPENT);
+ mapentzone = &mapentzone_store;
+ _zbootinit(mapentzone, "MAP ENTRY", sizeof (struct vm_map_entry),
+ map_entry_init, MAX_MAPENT);
}
/*
@@ -216,14 +196,6 @@ vmspace_alloc(min, max, pageable)
{
register struct vmspace *vm;
- if (mapvmpgcnt == 0 && mapvm == 0) {
- mapvmpgcnt = (cnt.v_page_count * sizeof(struct vm_map_entry) + PAGE_SIZE - 1) / PAGE_SIZE;
- mapvm_start = mapvm = kmem_alloc_pageable(kernel_map,
- mapvmpgcnt * PAGE_SIZE);
- mapvmmax = mapvm_start + mapvmpgcnt * PAGE_SIZE;
- if (!mapvm)
- mapvmpgcnt = 0;
- }
MALLOC(vm, struct vmspace *, sizeof(struct vmspace), M_VMMAP, M_WAITOK);
bzero(vm, (caddr_t) &vm->vm_startcopy - (caddr_t) vm);
vm_map_init(&vm->vm_map, min, max, pageable);
@@ -234,6 +206,16 @@ vmspace_alloc(min, max, pageable)
}
void
+vm_init2(void) {
+ _zinit(kmapentzone, &kmapentobj,
+ NULL, 0, 4096, ZONE_INTERRUPT, 4);
+ _zinit(mapentzone, &mapentobj,
+ NULL, 0, 0, ZONE_WAIT, 4);
+ _zinit(mapzone, &mapobj,
+ NULL, 0, 0, ZONE_WAIT, 4);
+}
+
+void
vmspace_free(vm)
register struct vmspace *vm;
{
@@ -278,15 +260,7 @@ vm_map_create(pmap, min, max, pageable)
{
register vm_map_t result;
- if (kmem_map == NULL) {
- result = kmap_free;
- if (result == NULL)
- panic("vm_map_create: out of maps");
- kmap_free = (vm_map_t) result->header.next;
- } else
- MALLOC(result, vm_map_t, sizeof(struct vm_map),
- M_VMMAP, M_WAITOK);
-
+ result = zalloc(mapzone);
vm_map_init(result, min, max, pageable);
result->pmap = pmap;
return (result);
@@ -308,6 +282,7 @@ vm_map_init(map, min, max, pageable)
map->size = 0;
map->ref_count = 1;
map->is_main_map = TRUE;
+ map->system_map = 0;
map->min_offset = min;
map->max_offset = max;
map->entries_pageable = pageable;
@@ -328,20 +303,7 @@ vm_map_entry_dispose(map, entry)
vm_map_t map;
vm_map_entry_t entry;
{
- int s;
-
- if (map == kernel_map || map == kmem_map ||
- map == mb_map || map == pager_map) {
- s = splvm();
- entry->next = kentry_free;
- kentry_free = entry;
- ++kentry_count;
- splx(s);
- } else {
- entry->next = mappool;
- mappool = entry;
- ++mappoolcnt;
- }
+ zfree((map->system_map || !mapentzone) ? kmapentzone : mapentzone, entry);
}
/*
@@ -354,68 +316,7 @@ static vm_map_entry_t
vm_map_entry_create(map)
vm_map_t map;
{
- vm_map_entry_t entry;
- int i;
- int s;
-
- /*
- * This is a *very* nasty (and sort of incomplete) hack!!!!
- */
- if (kentry_count < KENTRY_LOW_WATER) {
- s = splvm();
- if (mapvmpgcnt && mapvm) {
- vm_page_t m;
-
- m = vm_page_alloc(kernel_object,
- OFF_TO_IDX(mapvm - VM_MIN_KERNEL_ADDRESS),
- (map == kmem_map || map == mb_map) ? VM_ALLOC_INTERRUPT : VM_ALLOC_NORMAL);
-
- if (m) {
- int newentries;
-
- newentries = (PAGE_SIZE / sizeof(struct vm_map_entry));
- vm_page_wire(m);
- PAGE_WAKEUP(m);
- m->valid = VM_PAGE_BITS_ALL;
- pmap_kenter(mapvm, VM_PAGE_TO_PHYS(m));
- m->flags |= PG_WRITEABLE;
-
- entry = (vm_map_entry_t) mapvm;
- mapvm += PAGE_SIZE;
- --mapvmpgcnt;
-
- for (i = 0; i < newentries; i++) {
- vm_map_entry_dispose(kernel_map, entry);
- entry++;
- }
- }
- }
- splx(s);
- }
-
- if (map == kernel_map || map == kmem_map ||
- map == mb_map || map == pager_map) {
- s = splvm();
- entry = kentry_free;
- if (entry) {
- kentry_free = entry->next;
- --kentry_count;
- } else {
- panic("vm_map_entry_create: out of map entries for kernel");
- }
- splx(s);
- } else {
- entry = mappool;
- if (entry) {
- mappool = entry->next;
- --mappoolcnt;
- } else {
- MALLOC(entry, vm_map_entry_t, sizeof(struct vm_map_entry),
- M_VMMAPENT, M_WAITOK);
- }
- }
-
- return (entry);
+ return zalloc((map->system_map || !mapentzone) ? kmapentzone : mapentzone);
}
/*
@@ -496,7 +397,7 @@ vm_map_deallocate(map)
vm_map_unlock(map);
- FREE(map, M_VMMAP);
+ zfree(mapzone, map);
}
/*
OpenPOWER on IntegriCloud