commit 3e51258346684f993b0a316547b2484249ac4c93 Author: Andriy Gapon Date: Wed Dec 26 12:15:54 2012 +0200 [wip] auto-tune NKPT on amd64 if compile-time value is not sufficient To do: fix minidump code diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 8e06ff9..bddacc6 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -492,16 +492,25 @@ allocpages(vm_paddr_t *firstaddr, int n) CTASSERT(powerof2(NDMPML4E)); +static u_int nkpt = NKPT; +static u_int nkpdpe = NKPDPE; + static void create_pagetables(vm_paddr_t *firstaddr) { int i, j, ndm1g; + if (*firstaddr + NBPDR > NKPT * NBPDR) { + nkpt = howmany((uintptr_t)*firstaddr, NBPDR) + 1; + nkpdpe = howmany(nkpt, NPDEPG); + printf("increased NKPT from %u to %u\n", NKPT, nkpt); + } + /* Allocate pages */ - KPTphys = allocpages(firstaddr, NKPT); + KPTphys = allocpages(firstaddr, nkpt); KPML4phys = allocpages(firstaddr, 1); KPDPphys = allocpages(firstaddr, NKPML4E); - KPDphys = allocpages(firstaddr, NKPDPE); + KPDphys = allocpages(firstaddr, nkpdpe); ndmpdp = (ptoa(Maxmem) + NBPDP - 1) >> PDPSHIFT; if (ndmpdp < 4) /* Minimum 4GB of dirmap */ @@ -523,7 +532,7 @@ create_pagetables(vm_paddr_t *firstaddr) } /* Now map the page tables at their location within PTmap */ - for (i = 0; i < NKPT; i++) { + for (i = 0; i < nkpt; i++) { ((pd_entry_t *)KPDphys)[i] = KPTphys + (i << PAGE_SHIFT); ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V; } @@ -536,7 +545,7 @@ create_pagetables(vm_paddr_t *firstaddr) } /* And connect up the PD to the PDP */ - for (i = 0; i < NKPDPE; i++) { + for (i = 0; i < nkpdpe; i++) { ((pdp_entry_t *)KPDPphys)[i + KPDPI] = KPDphys + (i << PAGE_SHIFT); ((pdp_entry_t *)KPDPphys)[i + KPDPI] |= PG_RW | PG_V | PG_U; @@ -765,7 +774,7 @@ pmap_init(void) * Initialize the vm page array entries for the kernel pmap's * page table pages. */ - for (i = 0; i < NKPT; i++) { + for (i = 0; i < nkpt; i++) { mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT)); KASSERT(mpte >= vm_page_array && mpte < &vm_page_array[vm_page_array_size], @@ -1983,7 +1992,7 @@ pmap_growkernel(vm_offset_t addr) * any new kernel page table pages between "kernel_vm_end" and * "KERNBASE". */ - if (KERNBASE < addr && addr <= KERNBASE + NKPT * NBPDR) + if (KERNBASE < addr && addr <= KERNBASE + nkpt * NBPDR) return; addr = roundup2(addr, NBPDR);