Index: sys/vm/swap_pager.c =================================================================== --- sys/vm/swap_pager.c +++ sys/vm/swap_pager.c @@ -985,7 +985,18 @@ * Transfer source to destination. */ swp_pager_init_freerange(&s_free, &n_free); - for (i = 0; i < dstobject->size; ++i) { + + /* + * Search srcobject pindex of corresponding dstobject between 0 and + * dstobject->size to transfer. + * + * Based on experiments, about 80% to 95% of vm_indexes are + * SWAPBLK_NONE. Calling swap_pager_find_least() adds extra + * pctrie lookups. However, skipping SWAPBLK_NONE gives us saving + * of pctrie lookups in total. + */ + for (i = 0; (i = swap_pager_find_least(srcobject, i + offset) - offset) + < dstobject->size; ++i) { srcaddr = swp_pager_meta_ctl(srcobject, i + offset, SWM_POP); if (srcaddr == SWAPBLK_NONE) continue;