Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/swap_pager.c
Show First 20 Lines • Show All 979 Lines • ▼ Show 20 Lines | if (destroysource && srcobject->handle != NULL) { | ||||
VM_OBJECT_WLOCK(srcobject); | VM_OBJECT_WLOCK(srcobject); | ||||
vm_object_pip_wakeup(srcobject); | vm_object_pip_wakeup(srcobject); | ||||
} | } | ||||
/* | /* | ||||
* Transfer source to destination. | * Transfer source to destination. | ||||
*/ | */ | ||||
swp_pager_init_freerange(&s_free, &n_free); | 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); | srcaddr = swp_pager_meta_ctl(srcobject, i + offset, SWM_POP); | ||||
if (srcaddr == SWAPBLK_NONE) | if (srcaddr == SWAPBLK_NONE) | ||||
continue; | continue; | ||||
dstaddr = swp_pager_meta_ctl(dstobject, i, 0); | dstaddr = swp_pager_meta_ctl(dstobject, i, 0); | ||||
if (dstaddr != SWAPBLK_NONE) { | if (dstaddr != SWAPBLK_NONE) { | ||||
/* | /* | ||||
* Destination has valid swapblk or it is represented | * Destination has valid swapblk or it is represented | ||||
* by a resident page. We destroy the source block. | * by a resident page. We destroy the source block. | ||||
▲ Show 20 Lines • Show All 2,025 Lines • Show Last 20 Lines |