Page MenuHomeFreeBSD

D36978.diff
No OneTemporary

D36978.diff

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);
+ }
}
/*

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 13, 2:54 AM (5 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31390485
Default Alt Text
D36978.diff (3 KB)

Event Timeline