Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/uvm/uvm_map.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/uvm/uvm_map.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.263.4.3 retrieving revision 1.263.4.3.4.9 diff -u -p -r1.263.4.3 -r1.263.4.3.4.9 --- src/sys/uvm/uvm_map.c 2009/04/19 15:43:14 1.263.4.3 +++ src/sys/uvm/uvm_map.c 2012/05/07 18:30:56 1.263.4.3.4.9 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_map.c,v 1.263.4.3 2009/04/19 15:43:14 snj Exp $ */ +/* $NetBSD: uvm_map.c,v 1.263.4.3.4.9 2012/05/07 18:30:56 matt Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.263.4.3 2009/04/19 15:43:14 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.263.4.3.4.9 2012/05/07 18:30:56 matt Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -100,6 +100,16 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v #include #endif +#ifndef PRIxPADDR +#define PRIxPADDR "%lx" +#endif +#ifndef PRIxVADDR +#define PRIxVADDR "%lx" +#endif +#ifndef PRIxVSIZE +#define PRIxVSIZE "%lx" +#endif + #if !defined(UVMMAP_COUNTERS) #define UVMMAP_EVCNT_DEFINE(name) /* nothing */ @@ -294,7 +304,7 @@ static vsize_t uvm_kmapent_overhead(vsiz static void uvm_map_entry_unwire(struct vm_map *, struct vm_map_entry *); static void uvm_map_reference_amap(struct vm_map_entry *, int); static int uvm_map_space_avail(vaddr_t *, vsize_t, voff_t, vsize_t, int, - struct vm_map_entry *); + int, struct vm_map_entry *); static void uvm_map_unreference_amap(struct vm_map_entry *, int); int _uvm_map_sanity(struct vm_map *); @@ -567,7 +577,7 @@ _uvm_tree_sanity(struct vm_map *map) goto error; } if (trtmp != NULL && trtmp->start >= tmp->start) { - printf("corrupt: 0x%lx >= 0x%lx\n", + printf("corrupt: %#"PRIxVADDR" >= %#"PRIxVADDR"\n", trtmp->start, tmp->start); goto error; } @@ -1842,7 +1852,7 @@ failed: */ static int uvm_map_space_avail(vaddr_t *start, vsize_t length, voff_t uoffset, - vsize_t align, int topdown, struct vm_map_entry *entry) + vsize_t align, int flags, int topdown, struct vm_map_entry *entry) { vaddr_t end; @@ -1855,7 +1865,27 @@ uvm_map_space_avail(vaddr_t *start, vsiz if (uoffset != UVM_UNKNOWN_OFFSET) PMAP_PREFER(uoffset, start, length, topdown); #endif - if (align != 0) { + if ((flags & UVM_FLAG_COLORMATCH) != 0) { + KASSERT(align < uvmexp.ncolors); + if (uvmexp.ncolors > 1) { + const u_int colormask = uvmexp.colormask; + const u_int colorsize = colormask + 1; + vaddr_t hint = atop(*start); + const u_int color = hint & colormask; + if (color != align) { + hint -= color; /* adjust to color boundary */ + KASSERT((hint & colormask) == 0); + if (topdown) { + if (align > color) + hint -= colorsize; + } else { + if (align < color) + hint += colorsize; + } + *start = ptoa(hint + align); /* adjust to color */ + } + } + } else if (align != 0) { if ((*start & (align - 1)) != 0) { if (topdown) *start &= ~(align - 1); @@ -1911,7 +1941,8 @@ uvm_map_findspace(struct vm_map *map, va UVMHIST_LOG(maphist, "(map=0x%x, hint=0x%x, len=%d, flags=0x%x)", map, hint, length, flags); - KASSERT((align & (align - 1)) == 0); + KASSERT((flags & UVM_FLAG_COLORMATCH) != 0 || (align & (align - 1)) == 0); + KASSERT((flags & UVM_FLAG_COLORMATCH) == 0 || align < uvmexp.ncolors); KASSERT((flags & UVM_FLAG_FIXED) == 0 || align == 0); uvm_map_check(map, "map_findspace entry"); @@ -1989,7 +2020,7 @@ uvm_map_findspace(struct vm_map *map, va * See if given hint fits in this gap. */ switch (uvm_map_space_avail(&hint, length, - uoffset, align, topdown, entry)) { + uoffset, align, flags, topdown, entry)) { case 1: goto found; case -1: @@ -2020,7 +2051,7 @@ uvm_map_findspace(struct vm_map *map, va /* Check slot before any entry */ hint = topdown ? entry->next->start - length : entry->end; - switch (uvm_map_space_avail(&hint, length, uoffset, align, + switch (uvm_map_space_avail(&hint, length, uoffset, align, flags, topdown, entry)) { case 1: goto found; @@ -2089,7 +2120,7 @@ nextgap: hint = tmp->end; } switch (uvm_map_space_avail(&hint, length, uoffset, align, - topdown, tmp)) { + flags, topdown, tmp)) { case 1: entry = tmp; goto found; @@ -2111,7 +2142,7 @@ nextgap: hint = prev->end; } switch (uvm_map_space_avail(&hint, length, uoffset, align, - topdown, prev)) { + flags, topdown, prev)) { case 1: entry = prev; goto found; @@ -2152,7 +2183,7 @@ nextgap: hint = tmp->end; } switch (uvm_map_space_avail(&hint, length, uoffset, align, - topdown, tmp)) { + flags, topdown, tmp)) { case 1: entry = tmp; goto found; @@ -2178,7 +2209,7 @@ nextgap: /* See if it fits. */ switch (uvm_map_space_avail(&hint, length, uoffset, align, - topdown, entry)) { + flags, topdown, entry)) { case 1: goto found; case -1: @@ -2400,7 +2431,7 @@ uvm_unmap_remove(struct vm_map *map, vad for (va = entry->start; va < entry->end; va += PAGE_SIZE) { if (pmap_extract(vm_map_pmap(map), va, NULL)) { - panic("uvm_unmap_remove: has mapping"); + panic("uvm_unmap_remove: entry %p (%#"PRIxVADDR"...%#"PRIxVADDR") has mapping at %#"PRIxVADDR, entry, entry->start, entry->end, va); } } @@ -2593,7 +2624,7 @@ uvm_map_replace(struct vm_map *map, vadd if (tmpent->start < cur) panic("uvm_map_replace1"); if (tmpent->start > tmpent->end || tmpent->end > end) { - printf("tmpent->start=0x%lx, tmpent->end=0x%lx, end=0x%lx\n", + printf("tmpent->start=%#"PRIxVADDR", tmpent->end=%#"PRIxVADDR", end=%#"PRIxVADDR"\n", tmpent->start, tmpent->end, end); panic("uvm_map_replace2"); } @@ -4129,6 +4160,9 @@ uvmspace_exec(struct lwp *l, vaddr_t sta /* XXX cgd 960926: the sparc #ifdef should be a MD hook */ kill_user_windows(l); /* before stack addresses go away */ #endif +#ifdef __HAVE_CPU_VMSPACE_EXEC + cpu_vmspace_exec(l, start, end); +#endif /* * see if more than one process is using this vmspace... @@ -4626,7 +4660,7 @@ again: } error = uvm_map_prepare(map, 0, PAGE_SIZE, NULL, UVM_UNKNOWN_OFFSET, - 0, mapflags, &args); + VM_PGCOLOR_BUCKET(pg), mapflags | UVM_FLAG_COLORMATCH, &args); if (error) { uvm_pagefree(pg); return NULL; @@ -4638,6 +4672,8 @@ again: VM_PROT_READ|VM_PROT_WRITE|PMAP_KMPAGE); pmap_update(vm_map_pmap(map)); + uvm_km_pageclaim(pg); + ukh = (void *)va; /* @@ -4746,7 +4782,7 @@ uvm_kmapent_free(struct vm_map_entry *en pmap_update(vm_map_pmap(map)); vm_map_unlock(map); pg = PHYS_TO_VM_PAGE(pa); - uvm_pagefree(pg); + uvm_km_pagefree(pg); UVMMAP_EVCNT_INCR(ukh_free); } @@ -5033,10 +5069,10 @@ uvm_page_printit(struct vm_page *pg, boo pg->uobject, pg->uanon, (long long)pg->offset, pg->loan_count); #if defined(UVM_PAGE_TRKOWN) if (pg->flags & PG_BUSY) - (*pr)(" owning process = %d, tag=%s\n", - pg->owner, pg->owner_tag); + (*pr)(" owning process = %d, tag=%s, addr=%p\n", + pg->owner, pg->owner_tag, pg->owner_addr); else - (*pr)(" page not busy, no owner\n"); + (*pr)(" page not busy, no owner (addr=%p)\n", pg->owner_addr); #else (*pr)(" [page ownership tracking disabled]\n"); #endif @@ -5071,9 +5107,9 @@ uvm_page_printit(struct vm_page *pg, boo /* cross-verify page queue */ if (pg->pqflags & PQ_FREE) { - int fl = uvm_page_lookup_freelist(pg); + int free_list = uvm_page_lookup_freelist(pg); int color = VM_PGCOLOR_BUCKET(pg); - pgl = &uvm.page_free[fl].pgfl_buckets[color].pgfl_queues[ + pgl = &uvm.page_free[color].pgfl_queues[free_list][ ((pg)->flags & PG_ZERO) ? PGFL_ZEROS : PGFL_UNKNOWN]; } else { pgl = NULL;