summaryrefslogtreecommitdiffstats
path: root/sys/vm/swap_pager.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r--sys/vm/swap_pager.c503
1 files changed, 199 insertions, 304 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 16ec7bb..2f3b268 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -39,7 +39,7 @@
* from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
*
* @(#)swap_pager.c 8.9 (Berkeley) 3/21/94
- * $Id: swap_pager.c,v 1.40 1995/05/18 02:59:20 davidg Exp $
+ * $Id: swap_pager.c,v 1.41 1995/05/30 08:15:55 rgrimes Exp $
*/
/*
@@ -71,9 +71,6 @@
#define NPENDINGIO 10
#endif
-int swap_pager_input __P((sw_pager_t, vm_page_t *, int, int));
-int swap_pager_output __P((sw_pager_t, vm_page_t *, int, int, int *));
-
int nswiodone;
int swap_pager_full;
extern int vm_swap_size;
@@ -106,35 +103,35 @@ struct swpagerclean {
struct swpclean swap_pager_done; /* list of completed page cleans */
struct swpclean swap_pager_inuse; /* list of pending page cleans */
struct swpclean swap_pager_free; /* list of free pager clean structs */
-struct pagerlst swap_pager_list; /* list of "named" anon regions */
-struct pagerlst swap_pager_un_list; /* list of "unnamed" anon pagers */
+struct pagerlst swap_pager_object_list; /* list of "named" anon region objects */
+struct pagerlst swap_pager_un_object_list; /* list of "unnamed" anon region objects */
#define SWAP_FREE_NEEDED 0x1 /* need a swap block */
#define SWAP_FREE_NEEDED_BY_PAGEOUT 0x2
int swap_pager_needflags;
struct pagerlst *swp_qs[] = {
- &swap_pager_list, &swap_pager_un_list, (struct pagerlst *) 0
+ &swap_pager_object_list, &swap_pager_un_object_list, (struct pagerlst *) 0
};
-int swap_pager_putmulti();
-
+/*
+ * pagerops for OBJT_SWAP - "swap pager".
+ */
struct pagerops swappagerops = {
swap_pager_init,
swap_pager_alloc,
swap_pager_dealloc,
- swap_pager_getpage,
- swap_pager_getmulti,
- swap_pager_putpage,
- swap_pager_putmulti,
- swap_pager_haspage
+ swap_pager_getpages,
+ swap_pager_putpages,
+ swap_pager_haspage,
+ swap_pager_sync
};
int npendingio = NPENDINGIO;
-int require_swap_init;
void swap_pager_finish();
int dmmin, dmmax;
+
static inline void
swapsizecheck()
{
@@ -149,10 +146,8 @@ swapsizecheck()
void
swap_pager_init()
{
- dfltpagerops = &swappagerops;
-
- TAILQ_INIT(&swap_pager_list);
- TAILQ_INIT(&swap_pager_un_list);
+ TAILQ_INIT(&swap_pager_object_list);
+ TAILQ_INIT(&swap_pager_un_object_list);
/*
* Initialize clean lists
@@ -161,8 +156,6 @@ swap_pager_init()
TAILQ_INIT(&swap_pager_done);
TAILQ_INIT(&swap_pager_free);
- require_swap_init = 1;
-
/*
* Calculate the swap allocation constants.
*/
@@ -172,88 +165,56 @@ swap_pager_init()
}
-/*
- * Allocate a pager structure and associated resources.
- * Note that if we are called from the pageout daemon (handle == NULL)
- * we should not wait for memory as it could resulting in deadlock.
- */
-vm_pager_t
-swap_pager_alloc(handle, size, prot, offset)
- void *handle;
- register vm_size_t size;
- vm_prot_t prot;
- vm_offset_t offset;
+void
+swap_pager_swap_init()
{
- register vm_pager_t pager;
- register sw_pager_t swp;
- int waitok;
- int i, j;
-
- if (require_swap_init) {
- swp_clean_t spc;
- struct buf *bp;
+ swp_clean_t spc;
+ struct buf *bp;
+ int i;
- /*
- * kva's are allocated here so that we dont need to keep doing
- * kmem_alloc pageables at runtime
- */
- for (i = 0, spc = swcleanlist; i < npendingio; i++, spc++) {
- spc->spc_kva = kmem_alloc_pageable(pager_map, PAGE_SIZE * MAX_PAGEOUT_CLUSTER);
- if (!spc->spc_kva) {
- break;
- }
- spc->spc_bp = malloc(sizeof(*bp), M_TEMP, M_KERNEL);
- if (!spc->spc_bp) {
- kmem_free_wakeup(pager_map, spc->spc_kva, PAGE_SIZE);
- break;
- }
- spc->spc_flags = 0;
- TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list);
- }
- require_swap_init = 0;
- if (size == 0)
- return (NULL);
- }
/*
- * If this is a "named" anonymous region, look it up and return the
- * appropriate pager if it exists.
+ * kva's are allocated here so that we dont need to keep doing
+ * kmem_alloc pageables at runtime
*/
- if (handle) {
- pager = vm_pager_lookup(&swap_pager_list, handle);
- if (pager != NULL) {
- /*
- * Use vm_object_lookup to gain a reference to the
- * object and also to remove from the object cache.
- */
- if (vm_object_lookup(pager) == NULL)
- panic("swap_pager_alloc: bad object");
- return (pager);
+ for (i = 0, spc = swcleanlist; i < npendingio; i++, spc++) {
+ spc->spc_kva = kmem_alloc_pageable(pager_map, PAGE_SIZE * MAX_PAGEOUT_CLUSTER);
+ if (!spc->spc_kva) {
+ break;
}
+ spc->spc_bp = malloc(sizeof(*bp), M_TEMP, M_KERNEL);
+ if (!spc->spc_bp) {
+ kmem_free_wakeup(pager_map, spc->spc_kva, PAGE_SIZE);
+ break;
+ }
+ spc->spc_flags = 0;
+ TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list);
}
- /*
- * Pager doesn't exist, allocate swap management resources and
- * initialize.
- */
- waitok = handle ? M_WAITOK : M_KERNEL;
- pager = (vm_pager_t) malloc(sizeof *pager, M_VMPAGER, waitok);
- if (pager == NULL)
- return (NULL);
- swp = (sw_pager_t) malloc(sizeof *swp, M_VMPGDATA, waitok);
+}
+
+int
+swap_pager_swp_alloc(object, wait)
+ vm_object_t object;
+ int wait;
+{
+ register sw_pager_t swp;
+ int i, j;
+
+ if (object->pg_data != NULL)
+ panic("swap_pager_swp_alloc: swp already allocated");
+
+ swp = (sw_pager_t) malloc(sizeof *swp, M_VMPGDATA, wait);
if (swp == NULL) {
- free((caddr_t) pager, M_VMPAGER);
- return (NULL);
+ return 1;
}
- size = round_page(size);
- swp->sw_osize = size;
- swp->sw_nblocks = (btodb(size) + btodb(SWB_NPAGES * PAGE_SIZE) - 1) / btodb(SWB_NPAGES * PAGE_SIZE);
- swp->sw_blocks = (sw_blk_t)
- malloc(swp->sw_nblocks * sizeof(*swp->sw_blocks),
- M_VMPGDATA, waitok);
+
+ swp->sw_nblocks = (btodb(object->size) + btodb(SWB_NPAGES * PAGE_SIZE) - 1) / btodb(SWB_NPAGES * PAGE_SIZE);
+
+ swp->sw_blocks = (sw_blk_t) malloc(swp->sw_nblocks * sizeof(*swp->sw_blocks), M_VMPGDATA, wait);
if (swp->sw_blocks == NULL) {
free((caddr_t) swp, M_VMPGDATA);
- free((caddr_t) pager, M_VMPAGER);
- return (NULL);
+ return 1;
}
+
for (i = 0; i < swp->sw_nblocks; i++) {
swp->sw_blocks[i].swb_valid = 0;
swp->sw_blocks[i].swb_locked = 0;
@@ -263,30 +224,59 @@ swap_pager_alloc(handle, size, prot, offset)
swp->sw_poip = 0;
swp->sw_allocsize = 0;
- if (handle) {
- vm_object_t object;
- swp->sw_flags = SW_NAMED;
- TAILQ_INSERT_TAIL(&swap_pager_list, pager, pg_list);
- /*
- * Consistant with other pagers: return with object
- * referenced. Can't do this with handle == NULL since it
- * might be the pageout daemon calling.
- */
- object = vm_object_allocate(offset + size);
- object->flags &= ~OBJ_INTERNAL;
- vm_object_enter(object, pager);
- object->pager = pager;
+ object->pg_data = swp;
+
+ if (object->handle != NULL) {
+ TAILQ_INSERT_TAIL(&swap_pager_object_list, object, pager_object_list);
+ } else {
+ TAILQ_INSERT_TAIL(&swap_pager_un_object_list, object, pager_object_list);
+ }
+
+ return 0;
+}
+
+/*
+ * Allocate a pager structure and associated resources.
+ * Note that if we are called from the pageout daemon (handle == NULL)
+ * we should not wait for memory as it could resulting in deadlock.
+ */
+vm_object_t
+swap_pager_alloc(handle, size, prot, offset)
+ void *handle;
+ register vm_size_t size;
+ vm_prot_t prot;
+ vm_offset_t offset;
+{
+ vm_object_t object;
+ int i;
+
+ /*
+ * If this is a "named" anonymous region, look it up and use the
+ * object if it exists, otherwise allocate a new one.
+ */
+ if (handle) {
+ object = vm_pager_object_lookup(&swap_pager_object_list, handle);
+ if (object != NULL) {
+ vm_object_reference(object);
+ } else {
+ /*
+ * XXX - there is a race condition here. Two processes
+ * can request the same named object simultaneuously,
+ * and if one blocks for memory, the result is a disaster.
+ * Probably quite rare, but is yet another reason to just
+ * rip support of "named anonymous regions" out altogether.
+ */
+ object = vm_object_allocate(OBJT_SWAP, offset + size);
+ object->handle = handle;
+ (void) swap_pager_swp_alloc(object, M_WAITOK);
+ }
} else {
- swp->sw_flags = 0;
- TAILQ_INSERT_TAIL(&swap_pager_un_list, pager, pg_list);
+ object = vm_object_allocate(OBJT_SWAP, offset + size);
+ (void) swap_pager_swp_alloc(object, M_WAITOK);
}
- pager->pg_handle = handle;
- pager->pg_ops = &swappagerops;
- pager->pg_type = PG_SWAP;
- pager->pg_data = (caddr_t) swp;
- return (pager);
+ return (object);
}
/*
@@ -296,11 +286,12 @@ swap_pager_alloc(handle, size, prot, offset)
*/
inline static int *
-swap_pager_diskaddr(swp, offset, valid)
- sw_pager_t swp;
+swap_pager_diskaddr(object, offset, valid)
+ vm_object_t object;
vm_offset_t offset;
int *valid;
{
+ sw_pager_t swp = object->pg_data;
register sw_blk_t swb;
int ix;
@@ -308,7 +299,7 @@ swap_pager_diskaddr(swp, offset, valid)
*valid = 0;
ix = offset / (SWB_NPAGES * PAGE_SIZE);
if ((swp->sw_blocks == NULL) || (ix >= swp->sw_nblocks) ||
- (offset >= swp->sw_osize)) {
+ (offset >= object->size)) {
return (FALSE);
}
swb = &swp->sw_blocks[ix];
@@ -378,18 +369,19 @@ swap_pager_freeswapspace(sw_pager_t swp, unsigned from, unsigned to)
* this routine frees swap blocks from a specified pager
*/
void
-_swap_pager_freespace(swp, start, size)
- sw_pager_t swp;
+swap_pager_freespace(object, start, size)
+ vm_object_t object;
vm_offset_t start;
vm_offset_t size;
{
+ sw_pager_t swp = object->pg_data;
vm_offset_t i;
int s;
s = splbio();
for (i = start; i < round_page(start + size); i += PAGE_SIZE) {
int valid;
- int *addr = swap_pager_diskaddr(swp, i, &valid);
+ int *addr = swap_pager_diskaddr(object, i, &valid);
if (addr && *addr != SWB_EMPTY) {
swap_pager_freeswapspace(swp, *addr, *addr + btodb(PAGE_SIZE) - 1);
@@ -402,15 +394,6 @@ _swap_pager_freespace(swp, start, size)
splx(s);
}
-void
-swap_pager_freespace(pager, start, size)
- vm_pager_t pager;
- vm_offset_t start;
- vm_offset_t size;
-{
- _swap_pager_freespace((sw_pager_t) pager->pg_data, start, size);
-}
-
static void
swap_pager_free_swap(swp)
sw_pager_t swp;
@@ -477,7 +460,7 @@ swap_pager_free_swap(swp)
void
swap_pager_reclaim()
{
- vm_pager_t p;
+ vm_object_t object;
sw_pager_t swp;
int i, j, k;
int s;
@@ -493,7 +476,7 @@ swap_pager_reclaim()
*/
s = splbio();
if (in_reclaim) {
- tsleep((caddr_t) &in_reclaim, PSWP, "swrclm", 0);
+ tsleep(&in_reclaim, PSWP, "swrclm", 0);
splx(s);
return;
}
@@ -503,14 +486,14 @@ swap_pager_reclaim()
/* for each pager queue */
for (k = 0; swp_qs[k]; k++) {
- p = swp_qs[k]->tqh_first;
- while (p && (reclaimcount < MAXRECLAIM)) {
+ object = swp_qs[k]->tqh_first;
+ while (object && (reclaimcount < MAXRECLAIM)) {
/*
* see if any blocks associated with a pager has been
* allocated but not used (written)
*/
- swp = (sw_pager_t) p->pg_data;
+ swp = (sw_pager_t) object->pg_data;
for (i = 0; i < swp->sw_nblocks; i++) {
sw_blk_t swb = &swp->sw_blocks[i];
@@ -527,7 +510,7 @@ swap_pager_reclaim()
}
}
}
- p = p->pg_list.tqe_next;
+ object = object->pager_object_list.tqe_next;
}
}
@@ -541,7 +524,7 @@ rfinished:
}
splx(s);
in_reclaim = 0;
- wakeup((caddr_t) &in_reclaim);
+ wakeup(&in_reclaim);
}
@@ -551,10 +534,10 @@ rfinished:
*/
void
-swap_pager_copy(srcpager, srcoffset, dstpager, dstoffset, offset)
- vm_pager_t srcpager;
+swap_pager_copy(srcobject, srcoffset, dstobject, dstoffset, offset)
+ vm_object_t srcobject;
vm_offset_t srcoffset;
- vm_pager_t dstpager;
+ vm_object_t dstobject;
vm_offset_t dstoffset;
vm_offset_t offset;
{
@@ -566,41 +549,37 @@ swap_pager_copy(srcpager, srcoffset, dstpager, dstoffset, offset)
if (vm_swap_size)
no_swap_space = 0;
- if (no_swap_space)
- return;
-
- srcswp = (sw_pager_t) srcpager->pg_data;
+ srcswp = (sw_pager_t) srcobject->pg_data;
origsize = srcswp->sw_allocsize;
- dstswp = (sw_pager_t) dstpager->pg_data;
+ dstswp = (sw_pager_t) dstobject->pg_data;
/*
- * remove the source pager from the swap_pager internal queue
+ * remove the source object from the swap_pager internal queue
*/
- s = splbio();
- if (srcswp->sw_flags & SW_NAMED) {
- TAILQ_REMOVE(&swap_pager_list, srcpager, pg_list);
- srcswp->sw_flags &= ~SW_NAMED;
+ if (srcobject->handle == NULL) {
+ TAILQ_REMOVE(&swap_pager_un_object_list, srcobject, pager_object_list);
} else {
- TAILQ_REMOVE(&swap_pager_un_list, srcpager, pg_list);
+ TAILQ_REMOVE(&swap_pager_object_list, srcobject, pager_object_list);
}
+ s = splbio();
while (srcswp->sw_poip) {
- tsleep((caddr_t) srcswp, PVM, "spgout", 0);
+ tsleep(srcswp, PVM, "spgout", 0);
}
splx(s);
/*
* clean all of the pages that are currently active and finished
*/
- (void) swap_pager_clean();
+ swap_pager_sync();
s = splbio();
/*
* transfer source to destination
*/
- for (i = 0; i < dstswp->sw_osize; i += PAGE_SIZE) {
+ for (i = 0; i < dstobject->size; i += PAGE_SIZE) {
int srcvalid, dstvalid;
- int *srcaddrp = swap_pager_diskaddr(srcswp, i + offset + srcoffset,
+ int *srcaddrp = swap_pager_diskaddr(srcobject, i + offset + srcoffset,
&srcvalid);
int *dstaddrp;
@@ -614,7 +593,7 @@ swap_pager_copy(srcpager, srcoffset, dstpager, dstoffset, offset)
* dest.
*/
if (srcvalid) {
- dstaddrp = swap_pager_diskaddr(dstswp, i + dstoffset,
+ dstaddrp = swap_pager_diskaddr(dstobject, i + dstoffset,
&dstvalid);
/*
* if the dest already has a valid block,
@@ -657,43 +636,47 @@ swap_pager_copy(srcpager, srcoffset, dstpager, dstoffset, offset)
free((caddr_t) srcswp->sw_blocks, M_VMPGDATA);
srcswp->sw_blocks = 0;
free((caddr_t) srcswp, M_VMPGDATA);
- srcpager->pg_data = 0;
- free((caddr_t) srcpager, M_VMPAGER);
+ srcobject->pg_data = NULL;
return;
}
void
-swap_pager_dealloc(pager)
- vm_pager_t pager;
+swap_pager_dealloc(object)
+ vm_object_t object;
{
register sw_pager_t swp;
int s;
+ swp = (sw_pager_t) object->pg_data;
+
+ /* "Can't" happen. */
+ if (swp == NULL)
+ panic("swap_pager_dealloc: no swp data");
+
/*
* Remove from list right away so lookups will fail if we block for
* pageout completion.
*/
- s = splbio();
- swp = (sw_pager_t) pager->pg_data;
- if (swp->sw_flags & SW_NAMED) {
- TAILQ_REMOVE(&swap_pager_list, pager, pg_list);
- swp->sw_flags &= ~SW_NAMED;
+ if (object->handle == NULL) {
+ TAILQ_REMOVE(&swap_pager_un_object_list, object, pager_object_list);
} else {
- TAILQ_REMOVE(&swap_pager_un_list, pager, pg_list);
+ TAILQ_REMOVE(&swap_pager_object_list, object, pager_object_list);
}
+
/*
* Wait for all pageouts to finish and remove all entries from
* cleaning list.
*/
+ s = splbio();
while (swp->sw_poip) {
- tsleep((caddr_t) swp, PVM, "swpout", 0);
+ tsleep(swp, PVM, "swpout", 0);
}
splx(s);
- (void) swap_pager_clean();
+ swap_pager_sync();
/*
* Free left over swap blocks
@@ -708,88 +691,7 @@ swap_pager_dealloc(pager)
free((caddr_t) swp->sw_blocks, M_VMPGDATA);
swp->sw_blocks = 0;
free((caddr_t) swp, M_VMPGDATA);
- pager->pg_data = 0;
- free((caddr_t) pager, M_VMPAGER);
-}
-
-/*
- * swap_pager_getmulti can get multiple pages.
- */
-int
-swap_pager_getmulti(pager, m, count, reqpage, sync)
- vm_pager_t pager;
- vm_page_t *m;
- int count;
- int reqpage;
- boolean_t sync;
-{
- if (reqpage >= count)
- panic("swap_pager_getmulti: reqpage >= count");
- return swap_pager_input((sw_pager_t) pager->pg_data, m, count, reqpage);
-}
-
-/*
- * swap_pager_getpage gets individual pages
- */
-int
-swap_pager_getpage(pager, m, sync)
- vm_pager_t pager;
- vm_page_t m;
- boolean_t sync;
-{
- vm_page_t marray[1];
-
- marray[0] = m;
- return swap_pager_input((sw_pager_t) pager->pg_data, marray, 1, 0);
-}
-
-int
-swap_pager_putmulti(pager, m, c, sync, rtvals)
- vm_pager_t pager;
- vm_page_t *m;
- int c;
- boolean_t sync;
- int *rtvals;
-{
- int flags;
-
- if (pager == NULL) {
- (void) swap_pager_clean();
- return VM_PAGER_OK;
- }
- flags = B_WRITE;
- if (!sync)
- flags |= B_ASYNC;
-
- return swap_pager_output((sw_pager_t) pager->pg_data, m, c, flags, rtvals);
-}
-
-/*
- * swap_pager_putpage writes individual pages
- */
-int
-swap_pager_putpage(pager, m, sync)
- vm_pager_t pager;
- vm_page_t m;
- boolean_t sync;
-{
- int flags;
- vm_page_t marray[1];
- int rtvals[1];
-
-
- if (pager == NULL) {
- (void) swap_pager_clean();
- return VM_PAGER_OK;
- }
- marray[0] = m;
- flags = B_WRITE;
- if (!sync)
- flags |= B_ASYNC;
-
- swap_pager_output((sw_pager_t) pager->pg_data, marray, 1, flags, rtvals);
-
- return rtvals[0];
+ object->pg_data = 0;
}
static inline int
@@ -811,17 +713,24 @@ swap_pager_block_offset(swp, offset)
}
/*
- * _swap_pager_haspage returns TRUE if the pager has data that has
+ * swap_pager_haspage returns TRUE if the pager has data that has
* been written out.
*/
-static boolean_t
-_swap_pager_haspage(swp, offset)
- sw_pager_t swp;
+boolean_t
+swap_pager_haspage(object, offset, before, after)
+ vm_object_t object;
vm_offset_t offset;
+ int *before;
+ int *after;
{
+ sw_pager_t swp = object->pg_data;
register sw_blk_t swb;
int ix;
+ if (before != NULL)
+ *before = 0;
+ if (after != NULL)
+ *after = 0;
ix = offset / (SWB_NPAGES * PAGE_SIZE);
if (swp->sw_blocks == NULL || ix >= swp->sw_nblocks) {
return (FALSE);
@@ -836,19 +745,6 @@ _swap_pager_haspage(swp, offset)
}
/*
- * swap_pager_haspage is the externally accessible version of
- * _swap_pager_haspage above. this routine takes a vm_pager_t
- * for an argument instead of sw_pager_t.
- */
-boolean_t
-swap_pager_haspage(pager, offset)
- vm_pager_t pager;
- vm_offset_t offset;
-{
- return _swap_pager_haspage((sw_pager_t) pager->pg_data, offset);
-}
-
-/*
* swap_pager_freepage is a convienience routine that clears the busy
* bit and deallocates a page.
*/
@@ -887,16 +783,17 @@ swap_pager_iodone1(bp)
{
bp->b_flags |= B_DONE;
bp->b_flags &= ~B_ASYNC;
- wakeup((caddr_t) bp);
+ wakeup(bp);
}
int
-swap_pager_input(swp, m, count, reqpage)
- register sw_pager_t swp;
+swap_pager_getpages(object, m, count, reqpage)
+ vm_object_t object;
vm_page_t *m;
int count, reqpage;
{
+ register sw_pager_t swp = object->pg_data;
register struct buf *bp;
sw_blk_t swb[count];
register int s;
@@ -905,7 +802,6 @@ swap_pager_input(swp, m, count, reqpage)
vm_offset_t kva, off[count];
swp_clean_t spc;
vm_offset_t paging_offset;
- vm_object_t object;
int reqaddr[count];
int sequential;
@@ -1029,17 +925,17 @@ swap_pager_input(swp, m, count, reqpage)
if (swap_pager_free.tqh_first == NULL) {
s = splbio();
if (curproc == pageproc)
- (void) swap_pager_clean();
+ swap_pager_sync();
else
pagedaemon_wakeup();
while (swap_pager_free.tqh_first == NULL) {
swap_pager_needflags |= SWAP_FREE_NEEDED;
if (curproc == pageproc)
swap_pager_needflags |= SWAP_FREE_NEEDED_BY_PAGEOUT;
- tsleep((caddr_t) &swap_pager_free,
+ tsleep(&swap_pager_free,
PVM, "swpfre", 0);
if (curproc == pageproc)
- (void) swap_pager_clean();
+ swap_pager_sync();
else
pagedaemon_wakeup();
}
@@ -1091,7 +987,7 @@ swap_pager_input(swp, m, count, reqpage)
*/
s = splbio();
while ((bp->b_flags & B_DONE) == 0) {
- tsleep((caddr_t) bp, PVM, "swread", 0);
+ tsleep(bp, PVM, "swread", 0);
}
if (bp->b_flags & B_ERROR) {
@@ -1104,7 +1000,7 @@ swap_pager_input(swp, m, count, reqpage)
--swp->sw_piip;
if (swp->sw_piip == 0)
- wakeup((caddr_t) swp);
+ wakeup(swp);
/*
@@ -1124,7 +1020,7 @@ swap_pager_input(swp, m, count, reqpage)
if (spc) {
m[reqpage]->object->last_read = m[reqpage]->offset;
if (bp->b_flags & B_WANTED)
- wakeup((caddr_t) bp);
+ wakeup(bp);
/*
* if we have used an spc, we need to free it.
*/
@@ -1134,7 +1030,7 @@ swap_pager_input(swp, m, count, reqpage)
crfree(bp->b_wcred);
TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list);
if (swap_pager_needflags & SWAP_FREE_NEEDED) {
- wakeup((caddr_t) &swap_pager_free);
+ wakeup(&swap_pager_free);
}
if( swap_pager_needflags & SWAP_FREE_NEEDED_BY_PAGEOUT)
pagedaemon_wakeup();
@@ -1185,7 +1081,7 @@ swap_pager_input(swp, m, count, reqpage)
for (i = 0; i < count; i++) {
m[i]->dirty = VM_PAGE_BITS_ALL;
}
- _swap_pager_freespace(swp, m[0]->offset + paging_offset, count * PAGE_SIZE);
+ swap_pager_freespace(object, m[0]->offset + paging_offset, count * PAGE_SIZE);
}
} else {
swap_pager_ridpages(m, count, reqpage);
@@ -1195,13 +1091,14 @@ swap_pager_input(swp, m, count, reqpage)
}
int
-swap_pager_output(swp, m, count, flags, rtvals)
- register sw_pager_t swp;
+swap_pager_putpages(object, m, count, sync, rtvals)
+ vm_object_t object;
vm_page_t *m;
int count;
- int flags;
+ boolean_t sync;
int *rtvals;
{
+ register sw_pager_t swp = object->pg_data;
register struct buf *bp;
sw_blk_t swb[count];
register int s;
@@ -1210,7 +1107,6 @@ swap_pager_output(swp, m, count, flags, rtvals)
vm_offset_t kva, off, foff;
swp_clean_t spc;
vm_offset_t paging_offset;
- vm_object_t object;
int reqaddr[count];
int failed;
@@ -1341,8 +1237,8 @@ swap_pager_output(swp, m, count, flags, rtvals)
/*
* For synchronous writes, we clean up all completed async pageouts.
*/
- if ((flags & B_ASYNC) == 0) {
- swap_pager_clean();
+ if (sync == TRUE) {
+ swap_pager_sync();
}
kva = 0;
@@ -1354,7 +1250,7 @@ swap_pager_output(swp, m, count, flags, rtvals)
swap_pager_free.tqh_first->spc_list.tqe_next->spc_list.tqe_next == NULL) {
s = splbio();
if (curproc == pageproc) {
- (void) swap_pager_clean();
+ swap_pager_sync();
#if 0
splx(s);
return VM_PAGER_AGAIN;
@@ -1367,14 +1263,13 @@ swap_pager_output(swp, m, count, flags, rtvals)
if (curproc == pageproc) {
swap_pager_needflags |= SWAP_FREE_NEEDED_BY_PAGEOUT;
if((cnt.v_free_count + cnt.v_cache_count) > cnt.v_free_reserved)
- wakeup((caddr_t) &cnt.v_free_count);
+ wakeup(&cnt.v_free_count);
}
swap_pager_needflags |= SWAP_FREE_NEEDED;
- tsleep((caddr_t) &swap_pager_free,
- PVM, "swpfre", 0);
+ tsleep(&swap_pager_free, PVM, "swpfre", 0);
if (curproc == pageproc)
- (void) swap_pager_clean();
+ swap_pager_sync();
else
pagedaemon_wakeup();
}
@@ -1434,7 +1329,7 @@ swap_pager_output(swp, m, count, flags, rtvals)
* place a "cleaning" entry on the inuse queue.
*/
s = splbio();
- if (flags & B_ASYNC) {
+ if (sync == FALSE) {
spc->spc_flags = 0;
spc->spc_swp = swp;
for (i = 0; i < count; i++)
@@ -1461,9 +1356,9 @@ swap_pager_output(swp, m, count, flags, rtvals)
* perform the I/O
*/
VOP_STRATEGY(bp);
- if ((flags & (B_READ | B_ASYNC)) == B_ASYNC) {
+ if (sync == FALSE) {
if ((bp->b_flags & B_DONE) == B_DONE) {
- swap_pager_clean();
+ swap_pager_sync();
}
splx(s);
for (i = 0; i < count; i++) {
@@ -1475,7 +1370,7 @@ swap_pager_output(swp, m, count, flags, rtvals)
* wait for the sync I/O to complete
*/
while ((bp->b_flags & B_DONE) == 0) {
- tsleep((caddr_t) bp, PVM, "swwrt", 0);
+ tsleep(bp, PVM, "swwrt", 0);
}
if (bp->b_flags & B_ERROR) {
printf("swap_pager: I/O error - pageout failed; blkno %d, size %d, error %d\n",
@@ -1487,12 +1382,12 @@ swap_pager_output(swp, m, count, flags, rtvals)
--swp->sw_poip;
if (swp->sw_poip == 0)
- wakeup((caddr_t) swp);
+ wakeup(swp);
if (bp->b_vp)
pbrelvp(bp);
if (bp->b_flags & B_WANTED)
- wakeup((caddr_t) bp);
+ wakeup(bp);
splx(s);
@@ -1532,7 +1427,7 @@ swap_pager_output(swp, m, count, flags, rtvals)
crfree(bp->b_wcred);
TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list);
if (swap_pager_needflags & SWAP_FREE_NEEDED) {
- wakeup((caddr_t) &swap_pager_free);
+ wakeup(&swap_pager_free);
}
if( swap_pager_needflags & SWAP_FREE_NEEDED_BY_PAGEOUT)
pagedaemon_wakeup();
@@ -1540,15 +1435,15 @@ swap_pager_output(swp, m, count, flags, rtvals)
return (rv);
}
-boolean_t
-swap_pager_clean()
+void
+swap_pager_sync()
{
register swp_clean_t spc, tspc;
register int s;
tspc = NULL;
if (swap_pager_done.tqh_first == NULL)
- return FALSE;
+ return;
for (;;) {
s = splbio();
/*
@@ -1580,7 +1475,7 @@ doclean:
spc->spc_flags = 0;
TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list);
if (swap_pager_needflags & SWAP_FREE_NEEDED) {
- wakeup((caddr_t) &swap_pager_free);
+ wakeup(&swap_pager_free);
}
if( swap_pager_needflags & SWAP_FREE_NEEDED_BY_PAGEOUT)
pagedaemon_wakeup();
@@ -1588,7 +1483,7 @@ doclean:
splx(s);
}
- return (tspc ? TRUE : FALSE);
+ return;
}
void
@@ -1602,7 +1497,7 @@ swap_pager_finish(spc)
if ((object->paging_in_progress == 0) &&
(object->flags & OBJ_PIPWNT)) {
object->flags &= ~OBJ_PIPWNT;
- thread_wakeup((int) object);
+ wakeup(object);
}
/*
@@ -1662,7 +1557,7 @@ swap_pager_iodone(bp)
pbrelvp(bp);
if (bp->b_flags & B_WANTED)
- wakeup((caddr_t) bp);
+ wakeup(bp);
if (bp->b_rcred != NOCRED)
crfree(bp->b_rcred);
@@ -1671,12 +1566,12 @@ swap_pager_iodone(bp)
nswiodone += spc->spc_count;
if (--spc->spc_swp->sw_poip == 0) {
- wakeup((caddr_t) spc->spc_swp);
+ wakeup(spc->spc_swp);
}
if ((swap_pager_needflags & SWAP_FREE_NEEDED) ||
swap_pager_inuse.tqh_first == 0) {
swap_pager_needflags &= ~SWAP_FREE_NEEDED;
- wakeup((caddr_t) &swap_pager_free);
+ wakeup(&swap_pager_free);
}
if( swap_pager_needflags & SWAP_FREE_NEEDED_BY_PAGEOUT) {
@@ -1685,7 +1580,7 @@ swap_pager_iodone(bp)
}
if (vm_pageout_pages_needed) {
- wakeup((caddr_t) &vm_pageout_pages_needed);
+ wakeup(&vm_pageout_pages_needed);
vm_pageout_pages_needed = 0;
}
if ((swap_pager_inuse.tqh_first == NULL) ||
OpenPOWER on IntegriCloud