summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-10-30 07:11:06 +0000
committeralc <alc@FreeBSD.org>2003-10-30 07:11:06 +0000
commit28c9cd809b29e5971a70612915d818363b59734c (patch)
tree3983d4a07cf94bfaaf41ff4c99446b9057bc7583 /sys/vm
parentf8e7e9370697955c03d99d7a096cb240247784d2 (diff)
downloadFreeBSD-src-28c9cd809b29e5971a70612915d818363b59734c.zip
FreeBSD-src-28c9cd809b29e5971a70612915d818363b59734c.tar.gz
- Synchronize access to swdevhd using sw_dev_mtx.
- Use swp_sizecheck() rather than assignment to swap_pager_full in swaponsomething().
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/swap_pager.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index ea697ca..73cddff 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -597,23 +597,23 @@ swp_pager_getswapspace(int npages)
blk = blist_alloc(sp->sw_blist, npages);
if (blk != SWAPBLK_NONE) {
blk += sp->sw_first;
- swap_pager_avail -= npages;
sp->sw_used += npages;
+ swap_pager_avail -= npages;
swp_sizecheck();
swdevhd = TAILQ_NEXT(sp, sw_list);
- mtx_unlock(&sw_dev_mtx);
- return(blk);
+ goto done;
}
}
sp = TAILQ_NEXT(sp, sw_list);
}
- mtx_unlock(&sw_dev_mtx);
if (swap_pager_full != 2) {
printf("swap_pager_getswapspace(%d): failed\n", npages);
swap_pager_full = 2;
swap_pager_almost_full = 1;
}
swdevhd = NULL;
+done:
+ mtx_unlock(&sw_dev_mtx);
return (blk);
}
@@ -2174,9 +2174,9 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks, sw_strategy_t *strateg
sp->sw_end = dvbase + nblks;
TAILQ_INSERT_TAIL(&swtailq, sp, sw_list);
nswapdev++;
- mtx_unlock(&sw_dev_mtx);
swap_pager_avail += nblks;
- swap_pager_full = 0;
+ swp_sizecheck();
+ mtx_unlock(&sw_dev_mtx);
}
/*
@@ -2278,9 +2278,9 @@ found:
mtx_lock(&sw_dev_mtx);
TAILQ_REMOVE(&swtailq, sp, sw_list);
nswapdev--;
- mtx_unlock(&sw_dev_mtx);
if (swdevhd == sp)
swdevhd = NULL;
+ mtx_unlock(&sw_dev_mtx);
blist_destroy(sp->sw_blist);
free(sp, M_VMPGDATA);
OpenPOWER on IntegriCloud