Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_pageout.c
Show First 20 Lines • Show All 1,781 Lines • ▼ Show 20 Lines | vm_daemon(void) | ||||
struct vmspace *vm; | struct vmspace *vm; | ||||
int breakout, swapout_flags, tryagain, attempts; | int breakout, swapout_flags, tryagain, attempts; | ||||
#ifdef RACCT | #ifdef RACCT | ||||
uint64_t rsize, ravailable; | uint64_t rsize, ravailable; | ||||
#endif | #endif | ||||
while (TRUE) { | while (TRUE) { | ||||
mtx_lock(&vm_daemon_mtx); | mtx_lock(&vm_daemon_mtx); | ||||
msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", | |||||
#ifdef RACCT | #ifdef RACCT | ||||
msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", hz); | racct_enable ? hz : 0 | ||||
#else | #else | ||||
msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", 0); | 0 | ||||
#endif | #endif | ||||
); | |||||
swapout_flags = vm_pageout_req_swapout; | swapout_flags = vm_pageout_req_swapout; | ||||
vm_pageout_req_swapout = 0; | vm_pageout_req_swapout = 0; | ||||
mtx_unlock(&vm_daemon_mtx); | mtx_unlock(&vm_daemon_mtx); | ||||
if (swapout_flags) | if (swapout_flags) | ||||
swapout_procs(swapout_flags); | swapout_procs(swapout_flags); | ||||
/* | /* | ||||
* scan the processes for exceeding their rlimits or if | * scan the processes for exceeding their rlimits or if | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | FOREACH_PROC_IN_SYSTEM(p) { | ||||
continue; | continue; | ||||
size = vmspace_resident_count(vm); | size = vmspace_resident_count(vm); | ||||
if (size >= limit) { | if (size >= limit) { | ||||
vm_pageout_map_deactivate_pages( | vm_pageout_map_deactivate_pages( | ||||
&vm->vm_map, limit); | &vm->vm_map, limit); | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
rsize = IDX_TO_OFF(size); | rsize = IDX_TO_OFF(size); | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
racct_set(p, RACCT_RSS, rsize); | racct_set(p, RACCT_RSS, rsize); | ||||
ravailable = racct_get_available(p, RACCT_RSS); | ravailable = racct_get_available(p, RACCT_RSS); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
if (rsize > ravailable) { | if (rsize > ravailable) { | ||||
/* | /* | ||||
* Don't be overly aggressive; this might be | * Don't be overly aggressive; this | ||||
* an innocent process, and the limit could've | * might be an innocent process, | ||||
* been exceeded by some memory hog. Don't | * and the limit could've been exceeded | ||||
* try to deactivate more than 1/4th of process' | * by some memory hog. Don't try | ||||
* resident set size. | * to deactivate more than 1/4th | ||||
* of process' resident set size. | |||||
*/ | */ | ||||
if (attempts <= 8) { | if (attempts <= 8) { | ||||
if (ravailable < rsize - (rsize / 4)) | if (ravailable < rsize - | ||||
ravailable = rsize - (rsize / 4); | (rsize / 4)) { | ||||
ravailable = rsize - | |||||
(rsize / 4); | |||||
} | } | ||||
} | |||||
vm_pageout_map_deactivate_pages( | vm_pageout_map_deactivate_pages( | ||||
&vm->vm_map, OFF_TO_IDX(ravailable)); | &vm->vm_map, | ||||
OFF_TO_IDX(ravailable)); | |||||
/* Update RSS usage after paging out. */ | /* Update RSS usage after paging out. */ | ||||
size = vmspace_resident_count(vm); | size = vmspace_resident_count(vm); | ||||
rsize = IDX_TO_OFF(size); | rsize = IDX_TO_OFF(size); | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
racct_set(p, RACCT_RSS, rsize); | racct_set(p, RACCT_RSS, rsize); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
if (rsize > ravailable) | if (rsize > ravailable) | ||||
tryagain = 1; | tryagain = 1; | ||||
} | |||||
} | } | ||||
#endif | #endif | ||||
vmspace_free(vm); | vmspace_free(vm); | ||||
} | } | ||||
sx_sunlock(&allproc_lock); | sx_sunlock(&allproc_lock); | ||||
if (tryagain != 0 && attempts <= 10) | if (tryagain != 0 && attempts <= 10) | ||||
goto again; | goto again; | ||||
} | } | ||||
} | } | ||||
#endif /* !defined(NO_SWAPPING) */ | #endif /* !defined(NO_SWAPPING) */ |