Index: sys/vm/swap_pager.h =================================================================== --- sys/vm/swap_pager.h +++ sys/vm/swap_pager.h @@ -76,6 +76,7 @@ #ifdef _KERNEL extern int swap_pager_avail; +bool swap_is_filled(void); struct xswdev; int swap_dev_info(int name, struct xswdev *xs, char *devname, size_t len); Index: sys/vm/swap_pager.c =================================================================== --- sys/vm/swap_pager.c +++ sys/vm/swap_pager.c @@ -425,6 +425,12 @@ static void swp_pager_meta_free_all(vm_object_t); static daddr_t swp_pager_meta_ctl(vm_object_t, vm_pindex_t, int); +bool swap_is_filled() +{ + + return (swap_pager_full != 0); +} + static void swp_pager_init_freerange(daddr_t *start, daddr_t *num) { Index: sys/vm/vm_pageout.c =================================================================== --- sys/vm/vm_pageout.c +++ sys/vm/vm_pageout.c @@ -1734,8 +1734,13 @@ if (starting_page_shortage <= 0 || starting_page_shortage != page_shortage) vmd->vmd_oom_seq = 0; - else + else if (swap_is_filled()) vmd->vmd_oom_seq++; + /* if swap isn't filled, we will wait a bit for page daemon to + * page out to make some space. Don't increment nor decrement for now. + * After some swapouts are done, that will trigger page cleaning. + */ + if (vmd->vmd_oom_seq < vm_pageout_oom_seq) { if (vmd->vmd_oom) { vmd->vmd_oom = FALSE;