Index: sys/powerpc/aim/mmu_oea64.c =================================================================== --- sys/powerpc/aim/mmu_oea64.c +++ sys/powerpc/aim/mmu_oea64.c @@ -65,6 +65,7 @@ #include #include #include +#include #include @@ -184,10 +185,12 @@ static struct pvo_entry *moea64_bpvo_pool; static int moea64_bpvo_pool_index = 0; -static int moea64_bpvo_pool_size = 327680; +static int moea64_bpvo_pool_size = 0; SYSCTL_INT(_machdep, OID_AUTO, moea64_allocated_bpvo_entries, CTLFLAG_RD, &moea64_bpvo_pool_index, 0, ""); +#define BPVO_POOL_SIZE 327680 /* Sensible historical default value */ +#define BPVO_POOL_EXPANSION_FACTOR 3 #define VSID_NBPW (sizeof(u_int32_t) * 8) #ifdef __powerpc64__ #define NVSIDS (NPMAPS * 16) @@ -916,6 +919,20 @@ * Initialise the bootstrap pvo pool. */ TUNABLE_INT_FETCH("machdep.moea64_bpvo_pool_size", &moea64_bpvo_pool_size); + if (moea64_bpvo_pool_size == 0) { + if (!hw_direct_map) + moea64_bpvo_pool_size = ((ptoa((uintmax_t)physmem) * sizeof(struct vm_page)) / + (PAGE_SIZE * PAGE_SIZE)) * BPVO_POOL_EXPANSION_FACTOR; + else + moea64_bpvo_pool_size = BPVO_POOL_SIZE; + } + + if (boothowto & RB_VERBOSE) { + printf("mmu_oea64: bpvo pool entries = %d, bpvo pool size = %ju MB\n", + moea64_bpvo_pool_size, + moea64_bpvo_pool_size*sizeof(struct pvo_entry) / 1048576); + } + moea64_bpvo_pool = (struct pvo_entry *)moea64_bootstrap_alloc( moea64_bpvo_pool_size*sizeof(struct pvo_entry), PAGE_SIZE); moea64_bpvo_pool_index = 0;