diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -482,7 +482,8 @@ /* * Metadata functions */ -static daddr_t swp_pager_meta_build(vm_object_t, vm_pindex_t, daddr_t); +static void swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, + daddr_t swapblk, daddr_t *s_free, daddr_t *n_free); static void swp_pager_meta_free(vm_object_t, vm_pindex_t, vm_pindex_t); static void swp_pager_meta_transfer(vm_object_t src, vm_object_t dst, vm_pindex_t pindex, vm_pindex_t count); @@ -998,7 +999,7 @@ int swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_pindex_t size) { - daddr_t addr, blk, n_free, s_free; + daddr_t blk, n_free, s_free; vm_pindex_t i, j; int n; @@ -1013,11 +1014,8 @@ return (-1); } for (j = 0; j < n; ++j) { - addr = swp_pager_meta_build(object, - start + i + j, blk + j); - if (addr != SWAPBLK_NONE) - swp_pager_update_freerange(&s_free, &n_free, - addr); + swp_pager_meta_build(object, start + i + j, blk + j, + &s_free, &n_free); } } swp_pager_freeswapspace(s_free, n_free); @@ -1029,8 +1027,6 @@ swp_pager_xfer_source(vm_object_t srcobject, vm_object_t dstobject, vm_pindex_t pindex, daddr_t addr) { - daddr_t dstaddr __diagused; - KASSERT((srcobject->flags & OBJ_SWAP) != 0, ("%s: srcobject not swappable", __func__)); KASSERT((dstobject->flags & OBJ_SWAP) != 0, @@ -1046,9 +1042,7 @@ * swp_pager_meta_build() can sleep. */ VM_OBJECT_WUNLOCK(srcobject); - dstaddr = swp_pager_meta_build(dstobject, pindex, addr); - KASSERT(dstaddr == SWAPBLK_NONE, - ("Unexpected destination swapblk")); + swp_pager_meta_build(dstobject, pindex, addr, NULL, NULL); VM_OBJECT_WLOCK(srcobject); return (true); @@ -1474,7 +1468,7 @@ int flags, int *rtvals) { struct buf *bp; - daddr_t addr, blk, n_free, s_free; + daddr_t blk, n_free, s_free; vm_page_t mreq; int i, j, n; bool async; @@ -1520,11 +1514,8 @@ for (j = 0; j < n; ++j) { mreq = ma[i + j]; vm_page_aflag_clear(mreq, PGA_SWAP_FREE); - addr = swp_pager_meta_build(mreq->object, mreq->pindex, - blk + j); - if (addr != SWAPBLK_NONE) - swp_pager_update_freerange(&s_free, &n_free, - addr); + swp_pager_meta_build(mreq->object, mreq->pindex, + blk + j, &s_free, &n_free); MPASS(mreq->dirty == VM_PAGE_BITS_ALL); mreq->oflags |= VPO_SWAPINPROG; } @@ -2013,10 +2004,11 @@ * * The specified swapblk is added to the object's swap metadata. If * the swapblk is not valid, it is freed instead. Any previously - * assigned swapblk is returned. + * assigned swapblk is added to the provided freerange. */ -static daddr_t -swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk) +static void +swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk, + daddr_t *s_free, daddr_t *n_free) { static volatile int swblk_zone_exhausted, swpctrie_zone_exhausted; struct swblk *sb, *sb1; @@ -2030,7 +2022,7 @@ sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks, rdpi); if (sb == NULL) { if (swapblk == SWAPBLK_NONE) - return (SWAPBLK_NONE); + return; for (;;) { sb = uma_zalloc(swblk_zone, M_NOWAIT | (curproc == pageproc ? M_USE_RESERVE : 0)); @@ -2107,7 +2099,12 @@ */ if (swapblk == SWAPBLK_NONE) swp_pager_free_empty_swblk(object, sb); - return (prev_swapblk); + + if (prev_swapblk != SWAPBLK_NONE) { + KASSERT(s_free != NULL && n_free != NULL, + ("Unexpected previously-assigned swapblk")); + swp_pager_update_freerange(s_free, n_free, prev_swapblk); + } } /*