diff options
author | dyson <dyson@FreeBSD.org> | 1996-06-10 04:58:48 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1996-06-10 04:58:48 +0000 |
commit | 8a5ac3e758caa10e44458e31497727cb944a2074 (patch) | |
tree | 789cfa7fe5ea69000e9b157e7f70cac47505ddba /sys/vm/swap_pager.c | |
parent | 7e7aae125715a7f21051c667b9d8de90034c1eff (diff) | |
download | FreeBSD-src-8a5ac3e758caa10e44458e31497727cb944a2074.zip FreeBSD-src-8a5ac3e758caa10e44458e31497727cb944a2074.tar.gz |
Mostly superficial code improvements, add a diagnostic. The
code improvements include significant simplification of the reservation
of the swap pager control blocks for reads. Add a panic for an inconsistent
swap pager control block count.
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r-- | sys/vm/swap_pager.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 37427ec..ec37003 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.66 1996/05/18 03:37:32 dyson Exp $ + * $Id: swap_pager.c,v 1.67 1996/05/23 00:45:50 dyson Exp $ */ /* @@ -112,6 +112,7 @@ static struct swpclean swap_pager_inuse; /* list of free pager clean structs */ static struct swpclean swap_pager_free; +int swap_pager_free_count; /* list of "named" anon region objects */ static struct pagerlst swap_pager_object_list; @@ -204,6 +205,7 @@ swap_pager_init() TAILQ_INIT(&swap_pager_inuse); TAILQ_INIT(&swap_pager_done); TAILQ_INIT(&swap_pager_free); + swap_pager_free_count = 0; /* * Calculate the swap allocation constants. @@ -235,6 +237,7 @@ swap_pager_swap_init() } spc->spc_flags = 0; TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list); + swap_pager_free_count++; } } @@ -980,11 +983,10 @@ swap_pager_getpages(object, m, count, reqpage) * into "m" for the page actually faulted */ - spc = NULL; /* we might not use an spc data structure */ - - if ((count == 1) && (TAILQ_FIRST(&swap_pager_free) != NULL)) { - spc = TAILQ_FIRST(&swap_pager_free); + spc = NULL; + if ((count == 1) && ((spc = TAILQ_FIRST(&swap_pager_free)) != NULL)) { TAILQ_REMOVE(&swap_pager_free, spc, spc_list); + swap_pager_free_count--; kva = spc->spc_kva; bp = spc->spc_bp; bzero(bp, sizeof *bp); @@ -1028,7 +1030,10 @@ swap_pager_getpages(object, m, count, reqpage) */ s = splbio(); while ((bp->b_flags & B_DONE) == 0) { - tsleep(bp, PVM, "swread", 0); + if (tsleep(bp, PVM, "swread", hz*20)) { + printf("swap_pager: indefinite wait buffer: device: %d, blkno: %d, size: %d\n", + bp->b_dev, bp->b_blkno, bp->b_bcount); + } } if (bp->b_flags & B_ERROR) { @@ -1065,6 +1070,7 @@ swap_pager_getpages(object, m, count, reqpage) if (bp->b_wcred != NOCRED) crfree(bp->b_wcred); TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list); + swap_pager_free_count++; if (swap_pager_needflags & SWAP_FREE_NEEDED) { wakeup(&swap_pager_free); } @@ -1289,9 +1295,7 @@ swap_pager_putpages(object, m, count, sync, rtvals) /* * get a swap pager clean data structure, block until we get it */ - if (TAILQ_FIRST(&swap_pager_free) == NULL || - TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list) == NULL || - TAILQ_NEXT(TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list),spc_list) == NULL) { + if (swap_pager_free_count <= 3) { s = splbio(); if (curproc == pageproc) { retryfree: @@ -1311,9 +1315,7 @@ retryfree: */ if (tsleep(&swap_pager_free, PVM, "swpfre", hz/5)) { swap_pager_sync(); - if (TAILQ_FIRST(&swap_pager_free) == NULL || - TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list) == NULL || - TAILQ_NEXT(TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list),spc_list) == NULL) { + if (swap_pager_free_count <= 3) { splx(s); return VM_PAGER_AGAIN; } @@ -1323,17 +1325,13 @@ retryfree: * the free swap control blocks. */ swap_pager_sync(); - if (TAILQ_FIRST(&swap_pager_free) == NULL || - TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list) == NULL || - TAILQ_NEXT(TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list),spc_list) == NULL) { + if (swap_pager_free_count <= 3) { goto retryfree; } } } else { pagedaemon_wakeup(); - while (TAILQ_FIRST(&swap_pager_free) == NULL || - TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list) == NULL || - TAILQ_NEXT(TAILQ_NEXT(TAILQ_FIRST(&swap_pager_free),spc_list),spc_list) == NULL) { + while (swap_pager_free_count <= 3) { swap_pager_needflags |= SWAP_FREE_NEEDED; tsleep(&swap_pager_free, PVM, "swpfre", 0); pagedaemon_wakeup(); @@ -1342,7 +1340,10 @@ retryfree: splx(s); } spc = TAILQ_FIRST(&swap_pager_free); + if (spc == NULL) + panic("swap_pager_putpages: free queue is empty, %d expected\n", swap_pager_free_count); TAILQ_REMOVE(&swap_pager_free, spc, spc_list); + swap_pager_free_count--; kva = spc->spc_kva; @@ -1492,6 +1493,7 @@ retryfree: if (bp->b_wcred != NOCRED) crfree(bp->b_wcred); TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list); + swap_pager_free_count++; if (swap_pager_needflags & SWAP_FREE_NEEDED) { wakeup(&swap_pager_free); } @@ -1540,6 +1542,7 @@ doclean: } spc->spc_flags = 0; TAILQ_INSERT_TAIL(&swap_pager_free, spc, spc_list); + swap_pager_free_count++; if (swap_pager_needflags & SWAP_FREE_NEEDED) { wakeup(&swap_pager_free); } @@ -1622,7 +1625,9 @@ swap_pager_iodone(bp) if (bp->b_vp) pbrelvp(bp); +/* if (bp->b_flags & B_WANTED) +*/ wakeup(bp); if (bp->b_rcred != NOCRED) |