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.c63
1 files changed, 30 insertions, 33 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 05d8a327..828eab9 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.89 1998/02/23 08:22:24 dyson Exp $
+ * $Id: swap_pager.c,v 1.90 1998/02/25 03:55:47 dyson Exp $
*/
/*
@@ -60,7 +60,7 @@
#include <sys/rlist.h>
#ifndef MAX_PAGEOUT_CLUSTER
-#define MAX_PAGEOUT_CLUSTER 8
+#define MAX_PAGEOUT_CLUSTER 16
#endif
#ifndef NPENDINGIO
@@ -165,7 +165,6 @@ static int swap_pager_block_offset __P((vm_pindex_t pindex));
static daddr_t *swap_pager_diskaddr __P((vm_object_t object,
vm_pindex_t pindex, int *valid));
static void swap_pager_finish __P((swp_clean_t spc));
-static void swap_pager_freepage __P((vm_page_t m));
static void swap_pager_free_swap __P((vm_object_t object));
static void swap_pager_freeswapspace __P((vm_object_t object,
unsigned int from,
@@ -860,17 +859,6 @@ swap_pager_haspage(object, pindex, before, after)
}
/*
- * swap_pager_freepage is a convienience routine that clears the busy
- * bit and deallocates a page.
- */
-static void
-swap_pager_freepage(m)
- vm_page_t m;
-{
- vm_page_free(m);
-}
-
-/*
* Wakeup based upon spc state
*/
static void
@@ -914,9 +902,11 @@ swap_pager_ridpages(m, count, reqpage)
{
int i;
- for (i = 0; i < count; i++)
- if (i != reqpage)
- swap_pager_freepage(m[i]);
+ for (i = 0; i < count; i++) {
+ if (i != reqpage) {
+ vm_page_free(m[i]);
+ }
+ }
}
/*
@@ -967,7 +957,7 @@ swap_pager_getpages(object, m, count, reqpage)
return (VM_PAGER_FAIL);
}
for (j = i; j < count; j++) {
- swap_pager_freepage(m[j]);
+ vm_page_free(m[j]);
}
count = i;
break;
@@ -997,7 +987,7 @@ swap_pager_getpages(object, m, count, reqpage)
(reqaddr[i] != (reqaddr[reqpage] + (i - reqpage) * btodb(PAGE_SIZE))) ||
((reqaddr[i] / dmmax) != reqdskregion)) {
failed = 1;
- swap_pager_freepage(m[i]);
+ vm_page_free(m[i]);
if (first == 0)
first = i + 1;
}
@@ -1013,7 +1003,7 @@ swap_pager_getpages(object, m, count, reqpage)
(reqaddr[i] != (reqaddr[reqpage] + (i - reqpage) * btodb(PAGE_SIZE))) ||
((reqaddr[i] / dmmax) != reqdskregion)) {
failed = 1;
- swap_pager_freepage(m[i]);
+ vm_page_free(m[i]);
if (last == count)
last = i;
}
@@ -1427,7 +1417,6 @@ swap_pager_putpages(object, m, count, sync, rtvals)
bp->b_bcount = PAGE_SIZE * ix;
bp->b_bufsize = PAGE_SIZE * ix;
-
s = splvm();
swapdev_vp->v_numoutput++;
@@ -1560,7 +1549,7 @@ swap_pager_sync()
return;
}
-static void
+void
swap_pager_finish(spc)
register swp_clean_t spc;
{
@@ -1569,7 +1558,7 @@ swap_pager_finish(spc)
vm_page_t *ma;
ma = spc->spc_m;
- object = ma[spc->spc_first]->object;
+ object = spc->spc_object;
lastidx = spc->spc_first + spc->spc_count;
s = splvm();
@@ -1589,6 +1578,8 @@ swap_pager_finish(spc)
printf("swap_pager_finish: I/O error, clean of page %lx failed\n",
(u_long) VM_PAGE_TO_PHYS(ma[i]));
ma[i]->dirty = VM_PAGE_BITS_ALL;
+ ma[i]->flags |= PG_BUSY;
+ ma[i]->busy--;
PAGE_WAKEUP(ma[i]);
}
@@ -1603,8 +1594,9 @@ swap_pager_finish(spc)
for (i = spc->spc_first; i < lastidx; i++) {
if ((ma[i]->queue != PQ_ACTIVE) &&
((ma[i]->flags & PG_WANTED) ||
- pmap_ts_referenced(VM_PAGE_TO_PHYS(ma[i]))))
+ pmap_ts_referenced(VM_PAGE_TO_PHYS(ma[i])))) {
vm_page_activate(ma[i]);
+ }
}
}
@@ -1622,16 +1614,18 @@ static void
swap_pager_iodone(bp)
register struct buf *bp;
{
- int i, s;
+ int i, s, lastidx;
register swp_clean_t spc;
vm_object_t object;
+ vm_page_t *ma;
+
s = splvm();
spc = (swp_clean_t) bp->b_spc;
TAILQ_REMOVE(&swap_pager_inuse, spc, spc_list);
TAILQ_INSERT_TAIL(&swap_pager_done, spc, spc_list);
- object = bp->b_pages[0]->object;
+ object = spc->spc_object;
#if defined(DIAGNOSTIC)
if (object->paging_in_progress < spc->spc_count)
@@ -1645,19 +1639,22 @@ swap_pager_iodone(bp)
(bp->b_flags & B_READ) ? "pagein" : "pageout",
(u_long) bp->b_blkno, bp->b_bcount, bp->b_error);
} else {
- for (i = 0; i < bp->b_npages; i++) {
- /*
- * we wakeup any processes that are waiting on these pages.
- */
- PAGE_WAKEUP(bp->b_pages[i]);
- }
-
object->paging_in_progress -= spc->spc_count;
if ((object->paging_in_progress == 0) &&
(object->flags & OBJ_PIPWNT)) {
object->flags &= ~OBJ_PIPWNT;
wakeup(object);
}
+ ma = spc->spc_m;
+ lastidx = spc->spc_first + spc->spc_count;
+ for (i = spc->spc_first; i < lastidx; i++) {
+ /*
+ * we wakeup any processes that are waiting on these pages.
+ */
+ ma[i]->flags |= PG_BUSY;
+ ma[i]->busy--;
+ PAGE_WAKEUP(ma[i]);
+ }
}
if (bp->b_vp)
OpenPOWER on IntegriCloud