From owner-freebsd-hackers Wed Feb 17 9:44:34 1999 Delivered-To: freebsd-hackers@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [209.157.86.2]) by hub.freebsd.org (Postfix) with ESMTP id AF55210E66 for ; Wed, 17 Feb 1999 09:44:32 -0800 (PST) (envelope-from dillon@apollo.backplane.com) Received: (from dillon@localhost) by apollo.backplane.com (8.9.3/8.9.1) id JAA06913; Wed, 17 Feb 1999 09:44:28 -0800 (PST) (envelope-from dillon) Date: Wed, 17 Feb 1999 09:44:28 -0800 (PST) From: Matthew Dillon Message-Id: <199902171744.JAA06913@apollo.backplane.com> To: Tor.Egge@fast.no Cc: hackers@freebsd.org Subject: Re: Problems in VM structure ? Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG This is what the system appears to do: ( kern/kern_malloc.c ) vm_kmem_size = VM_KMEM_SIZE; mem_size = cnt.v_page_count * PAGE_SIZE; #if defined(VM_KMEM_SIZE_SCALE) if ((mem_size / VM_KMEM_SIZE_SCALE) > vm_kmem_size) vm_kmem_size = mem_size / VM_KMEM_SIZE_SCALE; #endif #if defined(VM_KMEM_SIZE_MAX) if (vm_kmem_size >= VM_KMEM_SIZE_MAX) vm_kmem_size = VM_KMEM_SIZE_MAX; #endif npg = (nmbufs * MSIZE + nmbclusters * MCLBYTES + vm_kmem_size) / PAGE_SIZE; kmemusage = (struct kmemusage *) kmem_alloc(kernel_map, (vm_size_t)(npg * sizeof(struct kmemusage))); kmem_map = kmem_suballoc(kernel_map, (vm_offset_t *)&kmembase, (vm_offset_t *)&kmemlimit, (vm_size_t)(npg * PAGE_SIZE)); ... ( i386/i386/machdep.c ) clean_map = kmem_suballoc(kernel_map, &clean_sva, &clean_eva, (nbuf*BKVASIZE) + (nswbuf*MAXPHYS) + pager_map_size); buffer_map = kmem_suballoc(clean_map, &buffer_sva, &buffer_eva, (nbuf*BKVASIZE)); pager_map = kmem_suballoc(clean_map, &pager_sva, &pager_eva, (nswbuf*MAXPHYS) + pager_map_size); pager_map->system_map = 1; exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, (16*(ARG_MAX+(PAGE_SIZE*3)))); mb_map_size = nmbufs * MSIZE + nmbclusters * MCLBYTES; mb_map_size = roundup2(mb_map_size, max(MCLBYTES, PAGE_SIZE)); ... mb_map = kmem_suballoc(kmem_map, (vm_offset_t *)&mbutl, &maxaddr, mb_map_size); ... The MAXUSERS calculation does this: #ifndef NMBCLUSTERS #define NMBCLUSTERS (512 + MAXUSERS * 16) #endif #ifndef NSFBUFS #define NSFBUFS (512 + MAXUSERS * 16) #endif #define NPROC (20 + 16 * MAXUSERS) #define MAXFILES (NPROC*2) Ok, so if we have 512MB of main memory and maxusers set to 256. NMBCLUSTRS = 4608 NSFBUFS = 4608 NPROC = 4116 MAXFILES = 8232 ( MCLBYTES = 2048 ) mem_size is 512MB vm_kmem_size = VM_KMEM_SIZE_MAX ( 80 MB ) kmem_map is 2.3 + 9.4 + 80 = around 90 MB. clean_map is 68MB + 4.1MB + 8.3MB = around 80 MB exec_map is 1.2MB So the total KVM allocated is 170MB. Starting at F0100000 we should have around 256MB of KVM. So why doesn't this work? I see a couple of problems right off the bat. If there is more then 2G of memory, mem_size being a signed int will screw things up. If mem_size is > 1G, the final-override-calculation will be wrong: if (vm_kmem_size > 2 * (cnt.v_page_count * PAGE_SIZE)) vm_kmem_size = 2 * (cnt.v_page_count * PAGE_SIZE); But if mem_size is 512MB, everything should work fine. Why doesn't it? -Matt Matthew Dillon To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message