In r118390, the swap pager's approach to striping swap allocation over

multiple devices was changed.  However, swapoff_one() was not fully and
correctly converted.  In particular, with r118390's introduction of a per-
device blist, the maximum swap block size, "dmmax", became irrelevant to
swapoff_one()'s operation.  Moreover, swapoff_one() was performing out-of-
range operations on the per-device blist that were silently ignored by
blist_fill().

This change corrects both of these problems with swapoff_one(), which will
allow us to potentially increase MAX_PAGEOUT_CLUSTER.  Previously,
swapoff_one() would panic inside of blist_fill() if you increased
MAX_PAGEOUT_CLUSTER.

Reviewed by:	kib, markj
MFC after:	3 days
This commit is contained in:
alc 2017-05-27 16:40:00 +00:00
parent 920fd40ca7
commit 33fb89b4ed

View File

@ -2310,9 +2310,13 @@ swapoff_one(struct swdevt *sp, struct ucred *cred)
*/
mtx_lock(&sw_dev_mtx);
sp->sw_flags |= SW_CLOSING;
for (dvbase = 0; dvbase < sp->sw_end; dvbase += dmmax) {
for (dvbase = 0; dvbase < nblks; dvbase += BLIST_BMAP_RADIX) {
/*
* blist_fill() cannot allocate more than BLIST_BMAP_RADIX
* blocks per call.
*/
swap_pager_avail -= blist_fill(sp->sw_blist,
dvbase, dmmax);
dvbase, ulmin(nblks - dvbase, BLIST_BMAP_RADIX));
}
swap_total -= (vm_ooffset_t)nblks * PAGE_SIZE;
mtx_unlock(&sw_dev_mtx);