diff options
| -rw-r--r-- | sys/conf/files | 2 | ||||
| -rw-r--r-- | sys/vm/vm_pageout.c | 8 | ||||
| -rw-r--r-- | sys/vm/vm_pageout.h | 2 | ||||
| -rw-r--r-- | sys/vm/vm_swapout.c | 18 |
4 files changed, 25 insertions, 5 deletions
diff --git a/sys/conf/files b/sys/conf/files index 495881e7ae0c..9dc3d34f3bd6 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -5413,7 +5413,7 @@ vm/vm_pager.c standard vm/vm_phys.c standard vm/vm_radix.c standard vm/vm_reserv.c standard -vm/vm_swapout.c optional racct +vm/vm_swapout.c standard vm/vm_unix.c standard vm/vnode_pager.c standard xen/features.c optional xenhvm diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 418a9cff8abf..fa4c356258f0 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1683,7 +1683,7 @@ reinsert: * results to present a coherent view of paging activity on this domain. */ static int -vm_pageout_inactive_dispatch(struct vm_domain *vmd, int shortage) +vm_pageout_inactive_dispatch(struct vm_domain *vmd, u_int shortage) { u_int freed, pps, slop, threads, us; @@ -1797,6 +1797,12 @@ vm_pageout_inactive(struct vm_domain *vmd, int shortage, int *addl_shortage) vm_pageout_mightbe_oom(vmd, page_shortage, starting_page_shortage); /* + * Kick the swapout thread to enforce RSS limits. + */ + if (page_shortage > 0) + vm_swapout_run(); + + /* * See the description of addl_page_shortage above. */ *addl_shortage = addl_page_shortage + deficit; diff --git a/sys/vm/vm_pageout.h b/sys/vm/vm_pageout.h index 5cfb6e5ca198..7413960eb9b4 100644 --- a/sys/vm/vm_pageout.h +++ b/sys/vm/vm_pageout.h @@ -103,5 +103,7 @@ void vm_wait_severe(void); int vm_pageout_flush(vm_page_t *mc, int count, int flags, bool *eio); void vm_pageout_oom(int shortage); +void vm_swapout_run(void); + #endif /* _KERNEL */ #endif /* _VM_VM_PAGEOUT_H_ */ diff --git a/sys/vm/vm_swapout.c b/sys/vm/vm_swapout.c index e85a049f46fe..a0c61c33fa5a 100644 --- a/sys/vm/vm_swapout.c +++ b/sys/vm/vm_swapout.c @@ -135,6 +135,19 @@ MTX_SYSINIT(vm_daemon, &vm_daemon_mtx, "vm daemon", MTX_DEF); static void vm_swapout_map_deactivate_pages(vm_map_t, long); static void vm_swapout_object_deactivate(pmap_t, vm_object_t, long); +void +vm_swapout_run(void) +{ + static int lastrun = 0; + + mtx_lock(&vm_daemon_mtx); + if (ticks - lastrun >= hz || ticks < lastrun) { + wakeup(&vm_daemon_needed); + lastrun = ticks; + } + mtx_unlock(&vm_daemon_mtx); +} + static void vm_swapout_object_deactivate_page(pmap_t pmap, vm_page_t m, bool unmap) { @@ -287,15 +300,14 @@ vm_daemon(void) if (racct_enable && vm_daemon_timeout == 0) vm_daemon_timeout = hz; - while (TRUE) { + while (true) { mtx_lock(&vm_daemon_mtx); msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", vm_daemon_timeout); mtx_unlock(&vm_daemon_mtx); /* - * scan the processes for exceeding their rlimits or if - * process is swapped out -- deactivate pages + * Scan for processes exceeding their rlimits. */ tryagain = 0; attempts = 0; |
