| @@ -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 | |
1239 | int | | 1246 | int |
1240 | uvm_map_prepare(struct vm_map *map, vaddr_t start, vsize_t size, | | 1247 | uvm_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 | |
1375 | int | | 1389 | int |
1376 | uvm_map_enter(struct vm_map *map, const struct uvm_map_args *args, | | 1390 | uvm_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 | |
4950 | int | | 4965 | int |
4951 | uvm_mapent_trymerge(struct vm_map *map, struct vm_map_entry *entry, int flags) | | 4966 | uvm_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; |