diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-08-03 21:22:42 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-08-03 21:22:42 +0000 |
| commit | 12692209a6d7ae8e99ff660d96cd2ad4abeca2fb (patch) | |
| tree | 4d1c6e0cb674ca5a7ebf2ffe35ef3a6bb974a6a4 /sys/vm | |
| parent | b131d40522c1109b93144d4e42f91b53e2db9e10 (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/swap_pager.c | 59 |
1 files changed, 21 insertions, 38 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index faca86477b42..64a2144a3a65 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -241,7 +241,6 @@ struct pagerops swappagerops = { static struct buf *getchainbuf(struct bio *bp, struct vnode *vp, int flags); static void flushchainbuf(struct buf *nbp); -static void waitchainbuf(struct bio *bp, int count, int done); /* * dmmax is in page-sized chunks with the new swap system. It was @@ -605,7 +604,7 @@ swp_pager_getswapspace(npages) } static struct swdevt * -swap_pager_find_dev(daddr_t blk, int npages) +swp_pager_find_dev(daddr_t blk, int npages) { struct swdevt *sp; @@ -643,7 +642,7 @@ swp_pager_freeswapspace(daddr_t blk, int npages) GIANT_REQUIRED; - sp = swap_pager_find_dev(blk, npages); + sp = swp_pager_find_dev(blk, npages); /* per-swap area stats */ sp->sw_used -= npages; @@ -988,7 +987,7 @@ swap_pager_strategy(vm_object_t object, struct bio *bp) bp->bio_error = 0; bp->bio_flags &= ~BIO_ERROR; bp->bio_resid = bp->bio_bcount; - *(u_int *) &bp->bio_driver1 = 0; + bp->bio_children = 0; start = bp->bio_pblkno; count = howmany(bp->bio_bcount, PAGE_SIZE); @@ -1106,7 +1105,15 @@ swap_pager_strategy(vm_object_t object, struct bio *bp) /* * Wait for completion. */ - waitchainbuf(bp, 0, 1); + while (bp->bio_children > 0) { + bp->bio_flags |= BIO_FLAG1; + tsleep(bp, PRIBIO + 4, "bpchain", 0); + } + if (bp->bio_resid != 0 && !(bp->bio_flags & BIO_ERROR)) { + bp->bio_flags |= BIO_ERROR; + bp->bio_error = EINVAL; + } + biodone(bp); } /* @@ -1800,7 +1807,7 @@ swap_pager_isswapped(vm_object_t object, struct swdevt *sp) daddr_t v = swap->swb_pages[i]; if (v == SWAPBLK_NONE) continue; - if (swap_pager_find_dev(v, 1) == sp) + if (swp_pager_find_dev(v, 1) == sp) return 1; } } @@ -1901,7 +1908,7 @@ restart: for (j = 0; j < SWAP_META_PAGES; ++j) { v = swap->swb_pages[j]; if (v != SWAPBLK_NONE && - swap_pager_find_dev(v, 1) == sp) + swp_pager_find_dev(v, 1) == sp) break; } if (j < SWAP_META_PAGES) { @@ -2220,10 +2227,8 @@ static void vm_pager_chain_iodone(struct buf *nbp) { struct bio *bp; - u_int *count; bp = nbp->b_caller1; - count = (u_int *)&(bp->bio_driver1); if (bp != NULL) { if (nbp->b_ioflags & BIO_ERROR) { bp->bio_flags |= BIO_ERROR; @@ -2235,7 +2240,7 @@ vm_pager_chain_iodone(struct buf *nbp) bp->bio_resid -= nbp->b_bcount; } nbp->b_caller1 = NULL; - --(*count); + bp->bio_children--; if (bp->bio_flags & BIO_FLAG1) { bp->bio_flags &= ~BIO_FLAG1; wakeup(bp); @@ -2257,17 +2262,17 @@ static struct buf * getchainbuf(struct bio *bp, struct vnode *vp, int flags) { struct buf *nbp; - u_int *count; GIANT_REQUIRED; nbp = getpbuf(NULL); - count = (u_int *)&(bp->bio_driver1); nbp->b_caller1 = bp; - ++(*count); + bp->bio_children++; - if (*count > 4) - waitchainbuf(bp, 4, 0); + while (bp->bio_children > 4) { + bp->bio_flags |= BIO_FLAG1; + tsleep(bp, PRIBIO + 4, "bpchain", 0); + } nbp->b_iocmd = bp->bio_cmd; nbp->b_ioflags = 0; @@ -2296,28 +2301,6 @@ flushchainbuf(struct buf *nbp) } } -static void -waitchainbuf(struct bio *bp, int limit, int done) -{ - int s; - u_int *count; - - GIANT_REQUIRED; - count = (u_int *)&(bp->bio_driver1); - s = splbio(); - while (*count > limit) { - bp->bio_flags |= BIO_FLAG1; - tsleep(bp, PRIBIO + 4, "bpchain", 0); - } - if (done) { - if (bp->bio_resid != 0 && !(bp->bio_flags & BIO_ERROR)) { - bp->bio_flags |= BIO_ERROR; - bp->bio_error = EINVAL; - } - biodone(bp); - } - splx(s); -} /* * swapdev_strategy: @@ -2349,7 +2332,7 @@ swapdev_strategy(ap) * the block size is left in PAGE_SIZE'd chunks (for the newswap) * here. */ - sp = swap_pager_find_dev(bp->b_blkno, sz); + sp = swp_pager_find_dev(bp->b_blkno, sz); bp->b_dev = sp->sw_device; /* * Convert from PAGE_SIZE'd to DEV_BSIZE'd chunks for the actual I/O |
