Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/swap_pager.c
Show First 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | |||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <vm/vm_map.h> | #include <vm/vm_map.h> | ||||
#include <vm/vm_kern.h> | #include <vm/vm_kern.h> | ||||
#include <vm/vm_object.h> | #include <vm/vm_object.h> | ||||
#include <vm/vm_page.h> | #include <vm/vm_page.h> | ||||
#include <vm/vm_pager.h> | #include <vm/vm_pager.h> | ||||
#include <vm/vm_pageout.h> | #include <vm/vm_pageout.h> | ||||
#include <vm/vm_param.h> | #include <vm/vm_param.h> | ||||
#include <vm/vm_radix.h> | |||||
#include <vm/swap_pager.h> | #include <vm/swap_pager.h> | ||||
#include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
#include <geom/geom.h> | #include <geom/geom.h> | ||||
/* | /* | ||||
* MAX_PAGEOUT_CLUSTER must be a power of 2 between 1 and 64. | * MAX_PAGEOUT_CLUSTER must be a power of 2 between 1 and 64. | ||||
▲ Show 20 Lines • Show All 2,349 Lines • ▼ Show 20 Lines | swap_pager_iter_find_least(struct pctrie_iter *blks, vm_pindex_t pindex) | ||||
* We get here if a swblk is present in the trie but it | * We get here if a swblk is present in the trie but it | ||||
* doesn't map any blocks. | * doesn't map any blocks. | ||||
*/ | */ | ||||
MPASS(0); | MPASS(0); | ||||
return (OBJ_MAX_SIZE); | return (OBJ_MAX_SIZE); | ||||
} | } | ||||
/* | /* | ||||
* Returns the least page index which is greater than or equal to the parameter | * Find the first index >= pindex that has either a valid page or a swap | ||||
* pindex and for which there is a swap block allocated. Returns OBJ_MAX_SIZE | * block. | ||||
* if are no allocated swap blocks for the object after the requested pindex. | |||||
*/ | */ | ||||
vm_pindex_t | vm_pindex_t | ||||
swap_pager_find_least(vm_object_t object, vm_pindex_t pindex) | swap_pager_seek_data(vm_object_t object, vm_pindex_t pindex) | ||||
{ | { | ||||
struct pctrie_iter blks; | struct pctrie_iter blks, pages; | ||||
vm_page_t m; | |||||
vm_pindex_t swap_index; | |||||
VM_OBJECT_ASSERT_WLOCKED(object); | |||||
vm_page_iter_init(&pages, object); | |||||
m = vm_page_iter_lookup_ge(&pages, pindex); | |||||
if (m != NULL) { | |||||
if (!vm_page_any_valid(m)) | |||||
m = NULL; | |||||
else if (pages.index == pindex) | |||||
return (pages.index); | |||||
} | |||||
swblk_iter_init_only(&blks, object); | swblk_iter_init_only(&blks, object); | ||||
return (swap_pager_iter_find_least(&blks, pindex)); | swap_index = swap_pager_iter_find_least(&blks, pindex); | ||||
if (swap_index == pindex) | |||||
return (swap_index); | |||||
if (swap_index == OBJ_MAX_SIZE) | |||||
swap_index = object->size; | |||||
if (m == NULL) | |||||
return (swap_index); | |||||
while ((m = vm_radix_iter_step(&pages)) != NULL && | |||||
pages.index < swap_index) { | |||||
if (vm_page_any_valid(m)) | |||||
return (pages.index); | |||||
} | |||||
return (swap_index); | |||||
} | |||||
/* | |||||
* Find the first index >= pindex that has neither a valid page nor a swap | |||||
* block. | |||||
*/ | |||||
vm_pindex_t | |||||
swap_pager_seek_hole(vm_object_t object, vm_pindex_t pindex) | |||||
{ | |||||
struct pctrie_iter blks, pages; | |||||
struct swblk *sb; | |||||
vm_page_t m; | |||||
VM_OBJECT_ASSERT_WLOCKED(object); | |||||
vm_page_iter_init(&pages, object); | |||||
swblk_iter_init_only(&blks, object); | |||||
while (((m = vm_page_iter_lookup(&pages, pindex)) != NULL && | |||||
vm_page_any_valid(m)) || | |||||
((sb = swblk_iter_lookup(&blks, pindex)) != NULL && | |||||
sb->d[pindex % SWAP_META_PAGES] != SWAPBLK_NONE)) | |||||
pindex++; | |||||
return (pindex); | |||||
} | } | ||||
/* | /* | ||||
* Is every page in the backing object or swap shadowed in the parent, and | * Is every page in the backing object or swap shadowed in the parent, and | ||||
* unbusy and valid in swap? | * unbusy and valid in swap? | ||||
*/ | */ | ||||
bool | bool | ||||
swap_pager_scan_all_shadowed(vm_object_t object) | swap_pager_scan_all_shadowed(vm_object_t object) | ||||
▲ Show 20 Lines • Show All 938 Lines • Show Last 20 Lines |