diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2005-11-12 23:11:38 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2005-11-12 23:11:38 +0000 |
commit | 02bc7df7d946553a2773b99fb357702a59265d8c (patch) | |
tree | db272af1b4e2b60d19e0413a885f39fd8a783b71 /sys/arch | |
parent | 1d584905429073c43bc41b1fea7238d32be18f45 (diff) |
Compute a rough estimate of exactly how much memory uvm_init() will allocate,
so as to correctly size the initial PT pages, to prevent the early
initialization from invoking pmap_enter_ptpage() [chicken and egg problem].
Much better than the previous arithmetic.
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/m68k/m68k/pmap_bootstrap.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/sys/arch/m68k/m68k/pmap_bootstrap.c b/sys/arch/m68k/m68k/pmap_bootstrap.c index 53f58d24e9a..72c88e4aa41 100644 --- a/sys/arch/m68k/m68k/pmap_bootstrap.c +++ b/sys/arch/m68k/m68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap_bootstrap.c,v 1.13 2005/10/23 19:00:25 martin Exp $ */ +/* $OpenBSD: pmap_bootstrap.c,v 1.14 2005/11/12 23:11:37 miod Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -170,12 +170,46 @@ pmap_bootstrap(nextpa, firstpa) eiobase = iiobase + ptoa(MACHINE_IIOMAPSIZE); /* - * We need to be able to map a whole UPT here as well. Adjust - * nptpages if necessary. + * Compute how many PT pages we will need to have initialized. + * We need to have enough of them for the vm system to initialize + * up to the point we can use it to allocate more PT pages - i.e. + * when we can afford using pmap_enter_ptpage(). + * + * Aside from the IO maps, we need to be able to successfully + * allocate: + * - nkmempages_max pages in kmeminit(). + * - PAGER_MAP_SIZE bytes in uvm_pager_init(). + * - 93.75 % of physmem anons in amap_init(). + * - 4 * uvm_km_pages_lowat pages in uvm_km_page_init(). + * + * We'll compute this size in bytes, then round it to pages, + * then to a multiple of NPTEPG. */ - nptpages = (MACHINE_IIOMAPSIZE + MACHINE_EIOMAPSIZE + - atop(MACHINE_MAX_PTSIZE) * sizeof(pt_entry_t) + NPTEPG - 1) / - NPTEPG; + + nptpages = ptoa(MACHINE_IIOMAPSIZE + MACHINE_EIOMAPSIZE); + + num = RELOC(physmem, int) / 4; + if (num > NKMEMPAGES_MAX_DEFAULT) + num = NKMEMPAGES_MAX_DEFAULT; + nptpages += ptoa(num); + + nptpages += PAGER_MAP_SIZE; + + nptpages += (RELOC(physmem, int) * 15 * sizeof(struct vm_anon)) / 16; + + { + extern int uvm_km_pages_lowat; + + if ((num = RELOC(uvm_km_pages_lowat, int)) == 0) { + num = RELOC(physmem, int) / 256; + if (num < 128) + num = 128; + } + } + nptpages += ptoa(num); + + nptpages = (atop(round_page(nptpages)) + NPTEPG - 1) / NPTEPG; + nextpa += nptpages * NBPG; kptmpa = nextpa; |