Date: Wed, 17 Feb 1999 09:44:28 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Tor.Egge@fast.no Cc: hackers@freebsd.org Subject: Re: Problems in VM structure ? Message-ID: <199902171744.JAA06913@apollo.backplane.com>
next in thread | raw e-mail | index | archive | help
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
<dillon@backplane.com>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902171744.JAA06913>
