Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/swap_pager.c
| Show First 20 Lines • Show All 1,956 Lines • ▼ Show 20 Lines | for (i = 0; i < SWAP_META_PAGES; i++) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* | /* | ||||
| * Look for a page corresponding to this block. If the | * Look for a page corresponding to this block. If the | ||||
| * found page has pending operations, sleep and restart | * found page has pending operations, sleep and restart | ||||
| * the scan. | * the scan. | ||||
| */ | */ | ||||
| m = vm_page_iter_lookup(&pages, blks.index + i); | m = vm_radix_iter_lookup(&pages, blks.index + i); | ||||
| if (m != NULL && (m->oflags & VPO_SWAPINPROG) != 0) { | if (m != NULL && (m->oflags & VPO_SWAPINPROG) != 0) { | ||||
| m->oflags |= VPO_SWAPSLEEP; | m->oflags |= VPO_SWAPSLEEP; | ||||
| VM_OBJECT_SLEEP(object, &object->handle, PSWP, | VM_OBJECT_SLEEP(object, &object->handle, PSWP, | ||||
| "swpoff", 0); | "swpoff", 0); | ||||
| break; | break; | ||||
| } | } | ||||
| /* | /* | ||||
| ▲ Show 20 Lines • Show All 404 Lines • ▼ Show 20 Lines | for (sb = swblk_iter_limit_init(&blks, object, pindex, last), | ||||
| start = swblk_start(sb, pindex); | start = swblk_start(sb, pindex); | ||||
| sb != NULL; sb = swblk_iter_next(&blks), start = 0) { | sb != NULL; sb = swblk_iter_next(&blks), start = 0) { | ||||
| limit = MIN(last - blks.index, SWAP_META_PAGES); | limit = MIN(last - blks.index, SWAP_META_PAGES); | ||||
| for (i = start; i < limit; i++) { | for (i = start; i < limit; i++) { | ||||
| if (sb->d[i] == SWAPBLK_NONE) | if (sb->d[i] == SWAPBLK_NONE) | ||||
| continue; | continue; | ||||
| swp_pager_update_freerange(&range, sb->d[i]); | swp_pager_update_freerange(&range, sb->d[i]); | ||||
| if (freed != NULL) { | if (freed != NULL) { | ||||
| m = vm_page_iter_lookup(&pages, blks.index + i); | m = vm_radix_iter_lookup(&pages, blks.index + i); | ||||
| if (m == NULL || vm_page_none_valid(m)) | if (m == NULL || vm_page_none_valid(m)) | ||||
| fc++; | fc++; | ||||
| } | } | ||||
| sb->d[i] = SWAPBLK_NONE; | sb->d[i] = SWAPBLK_NONE; | ||||
| } | } | ||||
| if (swp_pager_swblk_empty(sb, 0, start) && | if (swp_pager_swblk_empty(sb, 0, start) && | ||||
| swp_pager_swblk_empty(sb, limit, SWAP_META_PAGES)) { | swp_pager_swblk_empty(sb, limit, SWAP_META_PAGES)) { | ||||
| swblk_iter_remove(&blks); | swblk_iter_remove(&blks); | ||||
| ▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | |||||
| swap_pager_seek_data(vm_object_t object, vm_pindex_t pindex) | swap_pager_seek_data(vm_object_t object, vm_pindex_t pindex) | ||||
| { | { | ||||
| struct pctrie_iter blks, pages; | struct pctrie_iter blks, pages; | ||||
| vm_page_t m; | vm_page_t m; | ||||
| vm_pindex_t swap_index; | vm_pindex_t swap_index; | ||||
| VM_OBJECT_ASSERT_RLOCKED(object); | VM_OBJECT_ASSERT_RLOCKED(object); | ||||
| vm_page_iter_init(&pages, object); | vm_page_iter_init(&pages, object); | ||||
| m = vm_page_iter_lookup_ge(&pages, pindex); | m = vm_radix_iter_lookup_ge(&pages, pindex); | ||||
| if (m != NULL) { | if (m != NULL) { | ||||
| if (!vm_page_any_valid(m)) | if (!vm_page_any_valid(m)) | ||||
| m = NULL; | m = NULL; | ||||
| else if (pages.index == pindex) | else if (pages.index == pindex) | ||||
| return (pages.index); | return (pages.index); | ||||
| } | } | ||||
| swblk_iter_init_only(&blks, object); | swblk_iter_init_only(&blks, object); | ||||
| swap_index = swap_pager_iter_find_least(&blks, pindex); | swap_index = swap_pager_iter_find_least(&blks, pindex); | ||||
| ▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | swap_pager_scan_all_shadowed(vm_object_t object) | ||||
| /* | /* | ||||
| * Only check pages inside the parent object's range and inside the | * Only check pages inside the parent object's range and inside the | ||||
| * parent object's mapping of the backing object. | * parent object's mapping of the backing object. | ||||
| */ | */ | ||||
| pv = ps = pi = backing_offset_index - 1; | pv = ps = pi = backing_offset_index - 1; | ||||
| for (;;) { | for (;;) { | ||||
| if (pi == pv) { | if (pi == pv) { | ||||
| p = vm_page_iter_lookup_ge(&backing_pages, pv + 1); | p = vm_radix_iter_lookup_ge(&backing_pages, pv + 1); | ||||
| pv = p != NULL ? p->pindex : backing_object->size; | pv = p != NULL ? p->pindex : backing_object->size; | ||||
| } | } | ||||
| if (pi == ps) | if (pi == ps) | ||||
| ps = swap_pager_iter_find_least(&backing_blks, ps + 1); | ps = swap_pager_iter_find_least(&backing_blks, ps + 1); | ||||
| pi = MIN(pv, ps); | pi = MIN(pv, ps); | ||||
| if (pi >= pi_ubound) | if (pi >= pi_ubound) | ||||
| break; | break; | ||||
| ▲ Show 20 Lines • Show All 900 Lines • Show Last 20 Lines | |||||