1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: stable/10/sys/vm/vm_mmap.c 284665 2015-06-21 06:28:26Z trasz $"); |
45 46#include "opt_compat.h" 47#include "opt_hwpmc_hooks.h" 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/capsicum.h> 52#include <sys/kernel.h> --- 1037 unchanged lines hidden (view full) --- 1090 if (nsize > lim_cur(proc, RLIMIT_MEMLOCK)) { 1091 PROC_UNLOCK(proc); 1092 return (ENOMEM); 1093 } 1094 PROC_UNLOCK(proc); 1095 if (npages + cnt.v_wire_count > vm_page_max_wired) 1096 return (EAGAIN); 1097#ifdef RACCT |
1098 if (racct_enable) { 1099 PROC_LOCK(proc); 1100 error = racct_set(proc, RACCT_MEMLOCK, nsize); 1101 PROC_UNLOCK(proc); 1102 if (error != 0) 1103 return (ENOMEM); 1104 } |
1105#endif 1106 error = vm_map_wire(map, start, end, 1107 VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); 1108#ifdef RACCT |
1109 if (racct_enable && error != KERN_SUCCESS) { |
1110 PROC_LOCK(proc); 1111 racct_set(proc, RACCT_MEMLOCK, 1112 ptoa(pmap_wired_count(map->pmap))); 1113 PROC_UNLOCK(proc); 1114 } 1115#endif 1116 return (error == KERN_SUCCESS ? 0 : ENOMEM); 1117} --- 31 unchanged lines hidden (view full) --- 1149 PROC_LOCK(td->td_proc); 1150 if (map->size > lim_cur(td->td_proc, RLIMIT_MEMLOCK)) { 1151 PROC_UNLOCK(td->td_proc); 1152 return (ENOMEM); 1153 } 1154 PROC_UNLOCK(td->td_proc); 1155 } 1156#ifdef RACCT |
1157 if (racct_enable) { 1158 PROC_LOCK(td->td_proc); 1159 error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size); 1160 PROC_UNLOCK(td->td_proc); 1161 if (error != 0) 1162 return (ENOMEM); 1163 } |
1164#endif 1165 1166 if (uap->how & MCL_FUTURE) { 1167 vm_map_lock(map); 1168 vm_map_modflags(map, MAP_WIREFUTURE, 0); 1169 vm_map_unlock(map); 1170 error = 0; 1171 } --- 5 unchanged lines hidden (view full) --- 1177 * from mlockall(). vm_map_wire() will wire pages, by 1178 * calling vm_fault_wire() for each page in the region. 1179 */ 1180 error = vm_map_wire(map, vm_map_min(map), vm_map_max(map), 1181 VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); 1182 error = (error == KERN_SUCCESS ? 0 : EAGAIN); 1183 } 1184#ifdef RACCT |
1185 if (racct_enable && error != KERN_SUCCESS) { |
1186 PROC_LOCK(td->td_proc); 1187 racct_set(td->td_proc, RACCT_MEMLOCK, 1188 ptoa(pmap_wired_count(map->pmap))); 1189 PROC_UNLOCK(td->td_proc); 1190 } 1191#endif 1192 1193 return (error); --- 25 unchanged lines hidden (view full) --- 1219 vm_map_lock(map); 1220 vm_map_modflags(map, 0, MAP_WIREFUTURE); 1221 vm_map_unlock(map); 1222 1223 /* Forcibly unwire all pages. */ 1224 error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map), 1225 VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); 1226#ifdef RACCT |
1227 if (racct_enable && error == KERN_SUCCESS) { |
1228 PROC_LOCK(td->td_proc); 1229 racct_set(td->td_proc, RACCT_MEMLOCK, 0); 1230 PROC_UNLOCK(td->td_proc); 1231 } 1232#endif 1233 1234 return (error); 1235} --- 27 unchanged lines hidden (view full) --- 1263 last = addr + size; 1264 start = trunc_page(addr); 1265 end = round_page(last); 1266 if (last < addr || end < addr) 1267 return (EINVAL); 1268 error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end, 1269 VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); 1270#ifdef RACCT |
1271 if (racct_enable && error == KERN_SUCCESS) { |
1272 PROC_LOCK(td->td_proc); 1273 map = &td->td_proc->p_vmspace->vm_map; 1274 racct_set(td->td_proc, RACCT_MEMLOCK, 1275 ptoa(pmap_wired_count(map->pmap))); 1276 PROC_UNLOCK(td->td_proc); 1277 } 1278#endif 1279 return (error == KERN_SUCCESS ? 0 : ENOMEM); --- 421 unchanged lines hidden --- |