Module Name: src Committed By: matt Date: Sat May 28 06:50:08 UTC 2011
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: pmap.c Log Message: Change pmap_steal_memory, if it can, to prefer stealing from the physseg with the least amount of free pages. To generate a diff of this commit: cvs rdiff -u -r1.179.16.29 -r1.179.16.30 src/sys/arch/mips/mips/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.179.16.29 src/sys/arch/mips/mips/pmap.c:1.179.16.30 --- src/sys/arch/mips/mips/pmap.c:1.179.16.29 Wed May 25 23:58:48 2011 +++ src/sys/arch/mips/mips/pmap.c Sat May 28 06:50:07 2011 @@ -630,31 +630,59 @@ u_int npgs; paddr_t pa; vaddr_t va; + struct vm_physseg *maybe_seg = NULL; + u_int maybe_bank = vm_nphysseg; size = round_page(size); npgs = atop(size); + aprint_debug("%s: need %u pages\n", __func__, npgs); + for (u_int bank = 0; bank < vm_nphysseg; bank++) { struct vm_physseg * const seg = VM_PHYSMEM_PTR(bank); if (uvm.page_init_done == true) panic("pmap_steal_memory: called _after_ bootstrap"); - printf("%s: seg %u: %#"PRIxPADDR" %#"PRIxPADDR" %#"PRIxPADDR" %#"PRIxPADDR"\n", + aprint_debug("%s: seg %u: %#"PRIxPADDR" %#"PRIxPADDR" %#"PRIxPADDR" %#"PRIxPADDR"\n", __func__, bank, seg->avail_start, seg->start, seg->avail_end, seg->end); if (seg->avail_start != seg->start || seg->avail_start >= seg->avail_end) { - printf("%s: seg %u: bad start\n", __func__, bank); + aprint_debug("%s: seg %u: bad start\n", __func__, bank); continue; } if (seg->avail_end - seg->avail_start < npgs) { - printf("%s: seg %u: too small for %u pages\n", + aprint_debug("%s: seg %u: too small for %u pages\n", + __func__, bank, npgs); + continue; + } + +#ifndef _LP64 + if (seg->avail_start + npgs > MIPS_PHYS_MASK + 1) { + aprint_debug("%s: seg %u: not enough in KSEG0 for %u pages\n", __func__, bank, npgs); continue; } +#endif + + /* + * Always try to allocate from the segment with the least + * amount of space left. + */ +#define VM_PHYSMEM_SPACE(s) ((s)->avail_end - (s)->avail_start) + if (maybe_seg == NULL + || VM_PHYSMEM_SPACE(seg) < VM_PHYSMEM_SPACE(maybe_seg)) { + maybe_seg = seg; + maybe_bank = bank; + } + } + + if (maybe_seg) { + struct vm_physseg * const seg = maybe_seg; + u_int bank = maybe_bank; /* * There are enough pages here; steal them! @@ -670,12 +698,17 @@ if (vm_nphysseg == 1) panic("pmap_steal_memory: out of memory!"); + aprint_debug("%s: seg %u: %u pages stolen (removed)\n", + __func__, bank, npgs); /* Remove this segment from the list. */ vm_nphysseg--; for (u_int x = bank; x < vm_nphysseg; x++) { /* structure copy */ VM_PHYSMEM_PTR_SWAP(x, x + 1); } + } else { + aprint_debug("%s: seg %u: %u pages stolen (%#"PRIxPADDR" left)\n", + __func__, bank, npgs, VM_PHYSMEM_SPACE(seg)); } #ifdef _LP64