Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_unix.c
Show First 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | if (!old_mlock && map->flags & MAP_WIREFUTURE) { | ||||
goto done; | goto done; | ||||
} | } | ||||
} | } | ||||
if (map->size + (new - old) > vmemlim) { | if (map->size + (new - old) > vmemlim) { | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
error = racct_set(td->td_proc, RACCT_DATA, new - base); | error = racct_set(td->td_proc, RACCT_DATA, new - base); | ||||
if (error != 0) { | if (error != 0) { | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
error = racct_set(td->td_proc, RACCT_VMEM, | error = racct_set(td->td_proc, RACCT_VMEM, | ||||
map->size + (new - old)); | map->size + (new - old)); | ||||
if (error != 0) { | if (error != 0) { | ||||
racct_set_force(td->td_proc, RACCT_DATA, old - base); | racct_set_force(td->td_proc, RACCT_DATA, | ||||
old - base); | |||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
if (!old_mlock && map->flags & MAP_WIREFUTURE) { | if (!old_mlock && map->flags & MAP_WIREFUTURE) { | ||||
error = racct_set(td->td_proc, RACCT_MEMLOCK, | error = racct_set(td->td_proc, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap)) + (new - old)); | ptoa(pmap_wired_count(map->pmap)) + | ||||
(new - old)); | |||||
if (error != 0) { | if (error != 0) { | ||||
racct_set_force(td->td_proc, RACCT_DATA, | racct_set_force(td->td_proc, RACCT_DATA, | ||||
old - base); | old - base); | ||||
racct_set_force(td->td_proc, RACCT_VMEM, | racct_set_force(td->td_proc, RACCT_VMEM, | ||||
map->size); | map->size); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
} | } | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | |||||
#endif | #endif | ||||
prot = VM_PROT_RW; | prot = VM_PROT_RW; | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
#if defined(__amd64__) | #if defined(__amd64__) | ||||
if (i386_read_exec && SV_PROC_FLAG(td->td_proc, SV_ILP32)) | if (i386_read_exec && SV_PROC_FLAG(td->td_proc, SV_ILP32)) | ||||
prot |= VM_PROT_EXECUTE; | prot |= VM_PROT_EXECUTE; | ||||
#endif | #endif | ||||
#endif | #endif | ||||
rv = vm_map_insert(map, NULL, 0, old, new, prot, VM_PROT_ALL, 0); | rv = vm_map_insert(map, NULL, 0, old, new, prot, VM_PROT_ALL, 0); | ||||
if (rv != KERN_SUCCESS) { | if (rv != KERN_SUCCESS) { | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
racct_set_force(td->td_proc, RACCT_DATA, old - base); | racct_set_force(td->td_proc, | ||||
racct_set_force(td->td_proc, RACCT_VMEM, map->size); | RACCT_DATA, old - base); | ||||
racct_set_force(td->td_proc, | |||||
RACCT_VMEM, map->size); | |||||
if (!old_mlock && map->flags & MAP_WIREFUTURE) { | if (!old_mlock && map->flags & MAP_WIREFUTURE) { | ||||
racct_set_force(td->td_proc, RACCT_MEMLOCK, | racct_set_force(td->td_proc, | ||||
RACCT_MEMLOCK, | |||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
} | } | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | |||||
#endif | #endif | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
vm->vm_dsize += btoc(new - old); | vm->vm_dsize += btoc(new - old); | ||||
/* | /* | ||||
* Handle the MAP_WIREFUTURE case for legacy applications, | * Handle the MAP_WIREFUTURE case for legacy applications, | ||||
* by marking the newly mapped range of pages as wired. | * by marking the newly mapped range of pages as wired. | ||||
Show All 11 Lines | #endif | ||||
} else if (new < old) { | } else if (new < old) { | ||||
rv = vm_map_delete(map, new, old); | rv = vm_map_delete(map, new, old); | ||||
if (rv != KERN_SUCCESS) { | if (rv != KERN_SUCCESS) { | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto done; | goto done; | ||||
} | } | ||||
vm->vm_dsize -= btoc(old - new); | vm->vm_dsize -= btoc(old - new); | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
racct_set_force(td->td_proc, RACCT_DATA, new - base); | racct_set_force(td->td_proc, RACCT_DATA, new - base); | ||||
racct_set_force(td->td_proc, RACCT_VMEM, map->size); | racct_set_force(td->td_proc, RACCT_VMEM, map->size); | ||||
if (!old_mlock && map->flags & MAP_WIREFUTURE) { | if (!old_mlock && map->flags & MAP_WIREFUTURE) { | ||||
racct_set_force(td->td_proc, RACCT_MEMLOCK, | racct_set_force(td->td_proc, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
} | } | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | |||||
#endif | #endif | ||||
} | } | ||||
done: | done: | ||||
vm_map_unlock(map); | vm_map_unlock(map); | ||||
if (do_map_wirefuture) | if (do_map_wirefuture) | ||||
(void) vm_map_wire(map, old, new, | (void) vm_map_wire(map, old, new, | ||||
VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); | VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); | ||||
Show All 23 Lines |