Module Name: src Committed By: yamt Date: Sat Aug 1 16:35:51 UTC 2009
Modified Files: src/sys/uvm: uvm_map.c uvm_map.h Log Message: - uvm_map_extract: update map->size correctly for !UVM_EXTRACT_CONTIG. - uvm_map_extract: panic on zero-sized entries. - make uvm_map_replace static. To generate a diff of this commit: cvs rdiff -u -r1.274 -r1.275 src/sys/uvm/uvm_map.c cvs rdiff -u -r1.63 -r1.64 src/sys/uvm/uvm_map.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/uvm/uvm_map.c diff -u src/sys/uvm/uvm_map.c:1.274 src/sys/uvm/uvm_map.c:1.275 --- src/sys/uvm/uvm_map.c:1.274 Sat Aug 1 15:36:07 2009 +++ src/sys/uvm/uvm_map.c Sat Aug 1 16:35:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_map.c,v 1.274 2009/08/01 15:36:07 yamt Exp $ */ +/* $NetBSD: uvm_map.c,v 1.275 2009/08/01 16:35:51 yamt Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.274 2009/08/01 15:36:07 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.275 2009/08/01 16:35:51 yamt Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -2557,9 +2557,10 @@ * => note newents is allowed to be NULL */ -int +static int uvm_map_replace(struct vm_map *map, vaddr_t start, vaddr_t end, - struct vm_map_entry *newents, int nnewents, struct vm_map_entry **oldentryp) + struct vm_map_entry *newents, int nnewents, vsize_t nsize, + struct vm_map_entry **oldentryp) { struct vm_map_entry *oldent, *last; @@ -2594,13 +2595,15 @@ { struct vm_map_entry *tmpent = newents; int nent = 0; + vsize_t sz = 0; vaddr_t cur = start; while (tmpent) { nent++; + sz += tmpent->end - tmpent->start; if (tmpent->start < cur) panic("uvm_map_replace1"); - if (tmpent->start > tmpent->end || tmpent->end > end) { + if (tmpent->start >= tmpent->end || tmpent->end > end) { printf("tmpent->start=0x%lx, tmpent->end=0x%lx, end=0x%lx\n", tmpent->start, tmpent->end, end); panic("uvm_map_replace2"); @@ -2617,6 +2620,8 @@ } if (nent != nnewents) panic("uvm_map_replace5"); + if (sz != nsize) + panic("uvm_map_replace6"); } #endif @@ -2659,6 +2664,7 @@ clear_hints(map, oldent); uvm_map_entry_unlink(map, oldent); } + map->size -= end - start - nsize; uvm_map_check(map, "map_replace leave"); @@ -2698,6 +2704,7 @@ struct vm_map_entry *resentry = NULL; /* a dummy reservation entry */ vsize_t elen; int nchain, error, copy_ok; + vsize_t nsize; UVMHIST_FUNC("uvm_map_extract"); UVMHIST_CALLED(maphist); UVMHIST_LOG(maphist,"(srcmap=0x%x,start=0x%x, len=0x%x", srcmap, start, @@ -2738,6 +2745,7 @@ newend = dstaddr + len; chain = endchain = NULL; nchain = 0; + nsize = 0; vm_map_lock(srcmap); if (uvm_map_lookup_entry(srcmap, start, &entry)) { @@ -2857,6 +2865,7 @@ /* now link it on the chain */ nchain++; + nsize += newentry->end - newentry->start; if (endchain == NULL) { chain = endchain = newentry; } else { @@ -2892,7 +2901,7 @@ if (srcmap == dstmap || vm_map_lock_try(dstmap) == true) { copy_ok = 1; if (!uvm_map_replace(dstmap, dstaddr, dstaddr+len, chain, - nchain, &resentry)) { + nchain, nsize, &resentry)) { if (srcmap != dstmap) vm_map_unlock(dstmap); error = EIO; @@ -2979,7 +2988,7 @@ if (copy_ok == 0) { vm_map_lock(dstmap); error = uvm_map_replace(dstmap, dstaddr, dstaddr+len, chain, - nchain, &resentry); + nchain, nsize, &resentry); vm_map_unlock(dstmap); if (error == false) { Index: src/sys/uvm/uvm_map.h diff -u src/sys/uvm/uvm_map.h:1.63 src/sys/uvm/uvm_map.h:1.64 --- src/sys/uvm/uvm_map.h:1.63 Wed Jun 10 01:55:33 2009 +++ src/sys/uvm/uvm_map.h Sat Aug 1 16:35:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_map.h,v 1.63 2009/06/10 01:55:33 yamt Exp $ */ +/* $NetBSD: uvm_map.h,v 1.64 2009/08/01 16:35:51 yamt Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -316,8 +316,6 @@ bool uvm_map_lookup_entry(struct vm_map *, vaddr_t, struct vm_map_entry **); void uvm_map_reference(struct vm_map *); -int uvm_map_replace(struct vm_map *, vaddr_t, vaddr_t, - struct vm_map_entry *, int, struct vm_map_entry **); int uvm_map_reserve(struct vm_map *, vsize_t, vaddr_t, vsize_t, vaddr_t *, uvm_flag_t); void uvm_map_setup(struct vm_map *, vaddr_t, vaddr_t, int);