Tue Dec 20 13:47:38 2011 UTC ()
comment and assertion


(yamt)
diff -r1.306 -r1.307 src/sys/uvm/uvm_map.c

cvs diff -r1.306 -r1.307 src/sys/uvm/uvm_map.c (expand / switch to unified diff)

--- src/sys/uvm/uvm_map.c 2011/11/23 01:00:52 1.306
+++ src/sys/uvm/uvm_map.c 2011/12/20 13:47:38 1.307
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: uvm_map.c,v 1.306 2011/11/23 01:00:52 matt Exp $ */ 1/* $NetBSD: uvm_map.c,v 1.307 2011/12/20 13:47:38 yamt Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1997 Charles D. Cranor and Washington University. 4 * Copyright (c) 1997 Charles D. Cranor and Washington University.
5 * Copyright (c) 1991, 1993, The Regents of the University of California. 5 * Copyright (c) 1991, 1993, The Regents of the University of California.
6 * 6 *
7 * All rights reserved. 7 * All rights reserved.
8 * 8 *
9 * This code is derived from software contributed to Berkeley by 9 * This code is derived from software contributed to Berkeley by
10 * The Mach Operating System project at Carnegie-Mellon University. 10 * The Mach Operating System project at Carnegie-Mellon University.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions 13 * modification, are permitted provided that the following conditions
14 * are met: 14 * are met:
@@ -56,27 +56,27 @@ @@ -56,27 +56,27 @@
56 * School of Computer Science 56 * School of Computer Science
57 * Carnegie Mellon University 57 * Carnegie Mellon University
58 * Pittsburgh PA 15213-3890 58 * Pittsburgh PA 15213-3890
59 * 59 *
60 * any improvements or extensions that they make and grant Carnegie the 60 * any improvements or extensions that they make and grant Carnegie the
61 * rights to redistribute these changes. 61 * rights to redistribute these changes.
62 */ 62 */
63 63
64/* 64/*
65 * uvm_map.c: uvm map operations 65 * uvm_map.c: uvm map operations
66 */ 66 */
67 67
68#include <sys/cdefs.h> 68#include <sys/cdefs.h>
69__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.306 2011/11/23 01:00:52 matt Exp $"); 69__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.307 2011/12/20 13:47:38 yamt Exp $");
70 70
71#include "opt_ddb.h" 71#include "opt_ddb.h"
72#include "opt_uvmhist.h" 72#include "opt_uvmhist.h"
73#include "opt_uvm.h" 73#include "opt_uvm.h"
74#include "opt_sysv.h" 74#include "opt_sysv.h"
75 75
76#include <sys/param.h> 76#include <sys/param.h>
77#include <sys/systm.h> 77#include <sys/systm.h>
78#include <sys/mman.h> 78#include <sys/mman.h>
79#include <sys/proc.h> 79#include <sys/proc.h>
80#include <sys/malloc.h> 80#include <sys/malloc.h>
81#include <sys/pool.h> 81#include <sys/pool.h>
82#include <sys/kernel.h> 82#include <sys/kernel.h>
@@ -1226,26 +1226,33 @@ uvm_map(struct vm_map *map, vaddr_t *sta @@ -1226,26 +1226,33 @@ uvm_map(struct vm_map *map, vaddr_t *sta
1226 } else if (new_entry) { 1226 } else if (new_entry) {
1227 uvm_mapent_free(new_entry); 1227 uvm_mapent_free(new_entry);
1228 } 1228 }
1229 1229
1230#if defined(DEBUG) 1230#if defined(DEBUG)
1231 if (!error && VM_MAP_IS_KERNEL(map)) { 1231 if (!error && VM_MAP_IS_KERNEL(map)) {
1232 uvm_km_check_empty(map, *startp, *startp + size); 1232 uvm_km_check_empty(map, *startp, *startp + size);
1233 } 1233 }
1234#endif /* defined(DEBUG) */ 1234#endif /* defined(DEBUG) */
1235 1235
1236 return error; 1236 return error;
1237} 1237}
1238 1238
 1239/*
 1240 * uvm_map_prepare:
 1241 *
 1242 * called with map unlocked.
 1243 * on success, returns the map locked.
 1244 */
 1245
1239int 1246int
1240uvm_map_prepare(struct vm_map *map, vaddr_t start, vsize_t size, 1247uvm_map_prepare(struct vm_map *map, vaddr_t start, vsize_t size,
1241 struct uvm_object *uobj, voff_t uoffset, vsize_t align, uvm_flag_t flags, 1248 struct uvm_object *uobj, voff_t uoffset, vsize_t align, uvm_flag_t flags,
1242 struct uvm_map_args *args) 1249 struct uvm_map_args *args)
1243{ 1250{
1244 struct vm_map_entry *prev_entry; 1251 struct vm_map_entry *prev_entry;
1245 vm_prot_t prot = UVM_PROTECTION(flags); 1252 vm_prot_t prot = UVM_PROTECTION(flags);
1246 vm_prot_t maxprot = UVM_MAXPROTECTION(flags); 1253 vm_prot_t maxprot = UVM_MAXPROTECTION(flags);
1247 1254
1248 UVMHIST_FUNC("uvm_map_prepare"); 1255 UVMHIST_FUNC("uvm_map_prepare");
1249 UVMHIST_CALLED(maphist); 1256 UVMHIST_CALLED(maphist);
1250 1257
1251 UVMHIST_LOG(maphist, "(map=0x%x, start=0x%x, size=%d, flags=0x%x)", 1258 UVMHIST_LOG(maphist, "(map=0x%x, start=0x%x, size=%d, flags=0x%x)",
@@ -1362,26 +1369,33 @@ retry: @@ -1362,26 +1369,33 @@ retry:
1362 } 1369 }
1363 1370
1364 args->uma_flags = flags; 1371 args->uma_flags = flags;
1365 args->uma_prev = prev_entry; 1372 args->uma_prev = prev_entry;
1366 args->uma_start = start; 1373 args->uma_start = start;
1367 args->uma_size = size; 1374 args->uma_size = size;
1368 args->uma_uobj = uobj; 1375 args->uma_uobj = uobj;
1369 args->uma_uoffset = uoffset; 1376 args->uma_uoffset = uoffset;
1370 1377
1371 UVMHIST_LOG(maphist, "<- done!", 0,0,0,0); 1378 UVMHIST_LOG(maphist, "<- done!", 0,0,0,0);
1372 return 0; 1379 return 0;
1373} 1380}
1374 1381
 1382/*
 1383 * uvm_map_enter:
 1384 *
 1385 * called with map locked.
 1386 * unlock the map before returning.
 1387 */
 1388
1375int 1389int
1376uvm_map_enter(struct vm_map *map, const struct uvm_map_args *args, 1390uvm_map_enter(struct vm_map *map, const struct uvm_map_args *args,
1377 struct vm_map_entry *new_entry) 1391 struct vm_map_entry *new_entry)
1378{ 1392{
1379 struct vm_map_entry *prev_entry = args->uma_prev; 1393 struct vm_map_entry *prev_entry = args->uma_prev;
1380 struct vm_map_entry *dead = NULL; 1394 struct vm_map_entry *dead = NULL;
1381 1395
1382 const uvm_flag_t flags = args->uma_flags; 1396 const uvm_flag_t flags = args->uma_flags;
1383 const vm_prot_t prot = UVM_PROTECTION(flags); 1397 const vm_prot_t prot = UVM_PROTECTION(flags);
1384 const vm_prot_t maxprot = UVM_MAXPROTECTION(flags); 1398 const vm_prot_t maxprot = UVM_MAXPROTECTION(flags);
1385 const vm_inherit_t inherit = UVM_INHERIT(flags); 1399 const vm_inherit_t inherit = UVM_INHERIT(flags);
1386 const int amapwaitflag = (flags & UVM_FLAG_NOWAIT) ? 1400 const int amapwaitflag = (flags & UVM_FLAG_NOWAIT) ?
1387 AMAP_EXTEND_NOWAIT : 0; 1401 AMAP_EXTEND_NOWAIT : 0;
@@ -1397,26 +1411,27 @@ uvm_map_enter(struct vm_map *map, const  @@ -1397,26 +1411,27 @@ uvm_map_enter(struct vm_map *map, const
1397 const int kmap = (vm_map_pmap(map) == pmap_kernel()); 1411 const int kmap = (vm_map_pmap(map) == pmap_kernel());
1398 int merged = 0; 1412 int merged = 0;
1399 int error; 1413 int error;
1400 int newetype; 1414 int newetype;
1401 1415
1402 UVMHIST_FUNC("uvm_map_enter"); 1416 UVMHIST_FUNC("uvm_map_enter");
1403 UVMHIST_CALLED(maphist); 1417 UVMHIST_CALLED(maphist);
1404 1418
1405 UVMHIST_LOG(maphist, "(map=0x%x, start=0x%x, size=%d, flags=0x%x)", 1419 UVMHIST_LOG(maphist, "(map=0x%x, start=0x%x, size=%d, flags=0x%x)",
1406 map, start, size, flags); 1420 map, start, size, flags);
1407 UVMHIST_LOG(maphist, " uobj/offset 0x%x/%d", uobj, uoffset,0,0); 1421 UVMHIST_LOG(maphist, " uobj/offset 0x%x/%d", uobj, uoffset,0,0);
1408 1422
1409 KASSERT(map->hint == prev_entry); /* bimerge case assumes this */ 1423 KASSERT(map->hint == prev_entry); /* bimerge case assumes this */
 1424 KASSERT(vm_map_locked_p(map));
1410 1425
1411 if (flags & UVM_FLAG_QUANTUM) { 1426 if (flags & UVM_FLAG_QUANTUM) {
1412 KASSERT(new_entry); 1427 KASSERT(new_entry);
1413 KASSERT(new_entry->flags & UVM_MAP_QUANTUM); 1428 KASSERT(new_entry->flags & UVM_MAP_QUANTUM);
1414 } 1429 }
1415 1430
1416 if (uobj) 1431 if (uobj)
1417 newetype = UVM_ET_OBJ; 1432 newetype = UVM_ET_OBJ;
1418 else 1433 else
1419 newetype = 0; 1434 newetype = 0;
1420 1435
1421 if (flags & UVM_FLAG_COPYONW) { 1436 if (flags & UVM_FLAG_COPYONW) {
1422 newetype |= UVM_ET_COPYONWRITE; 1437 newetype |= UVM_ET_COPYONWRITE;
@@ -4948,26 +4963,27 @@ uvm_mapent_unreserve(struct vm_map *map, @@ -4948,26 +4963,27 @@ uvm_mapent_unreserve(struct vm_map *map,
4948 */ 4963 */
4949 4964
4950int 4965int
4951uvm_mapent_trymerge(struct vm_map *map, struct vm_map_entry *entry, int flags) 4966uvm_mapent_trymerge(struct vm_map *map, struct vm_map_entry *entry, int flags)
4952{ 4967{
4953 struct uvm_object *uobj; 4968 struct uvm_object *uobj;
4954 struct vm_map_entry *next; 4969 struct vm_map_entry *next;
4955 struct vm_map_entry *prev; 4970 struct vm_map_entry *prev;
4956 vsize_t size; 4971 vsize_t size;
4957 int merged = 0; 4972 int merged = 0;
4958 bool copying; 4973 bool copying;
4959 int newetype; 4974 int newetype;
4960 4975
 4976 KASSERT(vm_map_locked_p(map));
4961 if (VM_MAP_USE_KMAPENT(map)) { 4977 if (VM_MAP_USE_KMAPENT(map)) {
4962 return 0; 4978 return 0;
4963 } 4979 }
4964 if (entry->aref.ar_amap != NULL) { 4980 if (entry->aref.ar_amap != NULL) {
4965 return 0; 4981 return 0;
4966 } 4982 }
4967 if ((entry->flags & UVM_MAP_NOMERGE) != 0) { 4983 if ((entry->flags & UVM_MAP_NOMERGE) != 0) {
4968 return 0; 4984 return 0;
4969 } 4985 }
4970 4986
4971 uobj = entry->object.uvm_obj; 4987 uobj = entry->object.uvm_obj;
4972 size = entry->end - entry->start; 4988 size = entry->end - entry->start;
4973 copying = (flags & UVM_MERGE_COPYING) != 0; 4989 copying = (flags & UVM_MERGE_COPYING) != 0;