Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/swap_pager.c
Show First 20 Lines • Show All 370 Lines • ▼ Show 20 Lines | |||||
static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, | static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, | ||||
int *, pgo_getpages_iodone_t, void *); | int *, pgo_getpages_iodone_t, void *); | ||||
static void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); | static void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); | ||||
static boolean_t | static boolean_t | ||||
swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *after); | swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *after); | ||||
static void swap_pager_init(void); | static void swap_pager_init(void); | ||||
static void swap_pager_unswapped(vm_page_t); | static void swap_pager_unswapped(vm_page_t); | ||||
static void swap_pager_swapoff(struct swdevt *sp); | static void swap_pager_swapoff(struct swdevt *sp); | ||||
static void swap_pager_update_writecount(vm_object_t object, | |||||
vm_offset_t start, vm_offset_t end); | |||||
static void swap_pager_release_writecount(vm_object_t object, | |||||
vm_offset_t start, vm_offset_t end); | |||||
struct pagerops swappagerops = { | struct pagerops swappagerops = { | ||||
.pgo_init = swap_pager_init, /* early system initialization of pager */ | .pgo_init = swap_pager_init, /* early system initialization of pager */ | ||||
.pgo_alloc = swap_pager_alloc, /* allocate an OBJT_SWAP object */ | .pgo_alloc = swap_pager_alloc, /* allocate an OBJT_SWAP object */ | ||||
.pgo_dealloc = swap_pager_dealloc, /* deallocate an OBJT_SWAP object */ | .pgo_dealloc = swap_pager_dealloc, /* deallocate an OBJT_SWAP object */ | ||||
.pgo_getpages = swap_pager_getpages, /* pagein */ | .pgo_getpages = swap_pager_getpages, /* pagein */ | ||||
.pgo_getpages_async = swap_pager_getpages_async, /* pagein (async) */ | .pgo_getpages_async = swap_pager_getpages_async, /* pagein (async) */ | ||||
.pgo_putpages = swap_pager_putpages, /* pageout */ | .pgo_putpages = swap_pager_putpages, /* pageout */ | ||||
.pgo_haspage = swap_pager_haspage, /* get backing store status for page */ | .pgo_haspage = swap_pager_haspage, /* get backing store status for page */ | ||||
.pgo_pageunswapped = swap_pager_unswapped, /* remove swap related to page */ | .pgo_pageunswapped = swap_pager_unswapped, /* remove swap related to page */ | ||||
.pgo_update_writecount = swap_pager_update_writecount, | |||||
.pgo_release_writecount = swap_pager_release_writecount, | |||||
}; | }; | ||||
/* | /* | ||||
* swap_*() routines are externally accessible. swp_*() routines are | * swap_*() routines are externally accessible. swp_*() routines are | ||||
* internal. | * internal. | ||||
*/ | */ | ||||
static int nswap_lowat = 128; /* in pages, swap_pager_almost_full warn */ | static int nswap_lowat = 128; /* in pages, swap_pager_almost_full warn */ | ||||
static int nswap_hiwat = 512; /* in pages, swap_pager_almost_full warn */ | static int nswap_hiwat = 512; /* in pages, swap_pager_almost_full warn */ | ||||
▲ Show 20 Lines • Show All 209 Lines • ▼ Show 20 Lines | swap_pager_alloc_init(void *handle, struct ucred *cred, vm_ooffset_t size, | ||||
/* | /* | ||||
* The un_pager.swp.swp_blks trie is initialized by | * The un_pager.swp.swp_blks trie is initialized by | ||||
* vm_object_allocate() to ensure the correct order of | * vm_object_allocate() to ensure the correct order of | ||||
* visibility to other threads. | * visibility to other threads. | ||||
*/ | */ | ||||
object = vm_object_allocate(OBJT_SWAP, OFF_TO_IDX(offset + | object = vm_object_allocate(OBJT_SWAP, OFF_TO_IDX(offset + | ||||
PAGE_MASK + size)); | PAGE_MASK + size)); | ||||
object->un_pager.swp.writemappings = 0; | |||||
object->handle = handle; | object->handle = handle; | ||||
if (cred != NULL) { | if (cred != NULL) { | ||||
object->cred = cred; | object->cred = cred; | ||||
object->charge = size; | object->charge = size; | ||||
} | } | ||||
return (object); | return (object); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,276 Lines • ▼ Show 20 Lines | if (object->type != OBJT_SWAP) { | ||||
/* | /* | ||||
* Ensure that swap_pager_swapoff()'s iteration over | * Ensure that swap_pager_swapoff()'s iteration over | ||||
* object_list does not see a garbage pctrie. | * object_list does not see a garbage pctrie. | ||||
*/ | */ | ||||
atomic_thread_fence_rel(); | atomic_thread_fence_rel(); | ||||
object->type = OBJT_SWAP; | object->type = OBJT_SWAP; | ||||
object->un_pager.swp.writemappings = 0; | |||||
KASSERT(object->handle == NULL, ("default pager with handle")); | KASSERT(object->handle == NULL, ("default pager with handle")); | ||||
} | } | ||||
rdpi = rounddown(pindex, SWAP_META_PAGES); | rdpi = rounddown(pindex, SWAP_META_PAGES); | ||||
sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks, rdpi); | sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks, rdpi); | ||||
if (sb == NULL) { | if (sb == NULL) { | ||||
if (swapblk == SWAPBLK_NONE) | if (swapblk == SWAPBLK_NONE) | ||||
return (SWAPBLK_NONE); | return (SWAPBLK_NONE); | ||||
▲ Show 20 Lines • Show All 1,071 Lines • ▼ Show 20 Lines | if (nsw_wcount_async + n >= 0) { | ||||
nsw_wcount_async = 0; | nsw_wcount_async = 0; | ||||
msleep(&nsw_wcount_async, &swbuf_mtx, PSWP, | msleep(&nsw_wcount_async, &swbuf_mtx, PSWP, | ||||
"swpsysctl", 0); | "swpsysctl", 0); | ||||
} | } | ||||
} | } | ||||
mtx_unlock(&swbuf_mtx); | mtx_unlock(&swbuf_mtx); | ||||
return (0); | return (0); | ||||
} | |||||
static void | |||||
swap_pager_update_writecount(vm_object_t object, vm_offset_t start, | |||||
vm_offset_t end) | |||||
{ | |||||
VM_OBJECT_WLOCK(object); | |||||
KASSERT((object->flags & OBJ_NOSPLIT) != 0, | |||||
("Splittable object with writecount")); | |||||
object->un_pager.swp.writemappings += (vm_ooffset_t)end - start; | |||||
VM_OBJECT_WUNLOCK(object); | |||||
} | |||||
static void | |||||
swap_pager_release_writecount(vm_object_t object, vm_offset_t start, | |||||
vm_offset_t end) | |||||
{ | |||||
VM_OBJECT_WLOCK(object); | |||||
KASSERT((object->flags & OBJ_NOSPLIT) != 0, | |||||
("Splittable object with writecount")); | |||||
object->un_pager.swp.writemappings -= (vm_ooffset_t)end - start; | |||||
VM_OBJECT_WUNLOCK(object); | |||||
} | } |