Index: swap_pager.c =================================================================== RCS file: /home/ncvs/src/sys/vm/swap_pager.c,v retrieving revision 1.148 diff -u -r1.148 swap_pager.c --- swap_pager.c 2000/11/20 00:39:04 1.148 +++ swap_pager.c 2000/12/07 05:17:53 @@ -273,7 +273,7 @@ void swap_pager_swap_init() { - int n; + int n, n2; /* * Number of in-transit swap bp operations. Don't @@ -312,14 +312,21 @@ */ n = cnt.v_page_count * 2; + n2 = n; - swap_zone = zinit( - "SWAPMETA", - sizeof(struct swblock), - n, - ZONE_INTERRUPT, - 1 - ); + while ((swap_zone = zinit( + "SWAPMETA", + sizeof(struct swblock), + n, + ZONE_INTERRUPT, + 1 + )) == NULL) + n >>= 1; + if (swap_zone == NULL) + printf("WARNING: failed to init swap_zone!\n"); + if (n2 != n) + printf("Swap zone entries reduced to %d.\n", n); + n2 = n; /* * Initialize our meta-data hash table. The swapper does not need to @@ -330,7 +337,7 @@ * swhash_mask: hash table index mask */ - for (n = 1; n < cnt.v_page_count / 4; n <<= 1) + for (n = 1; n < n2 ; n <<= 1) ; swhash = malloc(sizeof(struct swblock *) * n, M_VMPGDATA, M_WAITOK); Index: vm_zone.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_zone.c,v retrieving revision 1.34 diff -u -r1.34 vm_zone.c --- vm_zone.c 2000/07/04 11:25:35 1.34 +++ vm_zone.c 2000/12/07 05:17:54 @@ -80,8 +80,11 @@ zinitna(vm_zone_t z, vm_object_t obj, char *name, int size, int nentries, int flags, int zalloc) { - int totsize; + int totsize, oldzflags; + vm_zone_t oldzlist; + oldzflags = z->zflags; + oldzlist = zlist; if ((z->zflags & ZONE_BOOT) == 0) { z->zsize = (size + ZONE_ROUNDING - 1) & ~(ZONE_ROUNDING - 1); simple_lock_init(&z->zlock); @@ -112,8 +115,12 @@ zone_kmem_kvaspace += totsize; z->zkva = kmem_alloc_pageable(kernel_map, totsize); - if (z->zkva == 0) + if (z->zkva == 0) { + /* Clean up the zlist in case we messed it. */ + if ((oldzflags & ZONE_BOOT) == 0) + zlist = oldzlist; return 0; + } z->zpagemax = totsize / PAGE_SIZE; if (obj == NULL) { @@ -160,7 +167,7 @@ if (z == NULL) return NULL; - z->zflags = 0; + bzero(z, sizeof (struct vm_zone)); if (zinitna(z, NULL, name, size, nentries, flags, zalloc) == 0) { free(z, M_ZONE); return NULL;