Page MenuHomeFreeBSD

D46629.id143212.diff
No OneTemporary

D46629.id143212.diff

Index: sys/vm/swap_pager.c
===================================================================
--- sys/vm/swap_pager.c
+++ sys/vm/swap_pager.c
@@ -2212,16 +2212,18 @@
swp_pager_init_freerange(&range);
offset = pindex;
last = pindex + count;
+restart:
sb = swblk_start_limit(srcobject, pindex, last);
start = (sb != NULL && sb->p < pindex) ? pindex - sb->p : 0;
for (; sb != NULL;
sb = swblk_start_limit(srcobject, pindex, last), start = 0) {
- limit = MIN(last - sb->p, SWAP_META_PAGES);
+ vm_pindex_t p = sb->p;
+ limit = MIN(last - p, SWAP_META_PAGES);
for (i = start; i < limit; i++) {
if (sb->d[i] == SWAPBLK_NONE)
continue;
- blk = swp_pager_meta_build(dstobject,
- sb->p + i - offset, sb->d[i], true);
+ blk = swp_pager_meta_build(dstobject, p + i - offset,
+ sb->d[i], true);
if (blk == sb->d[i]) {
/*
* Destination has no swapblk and is not
@@ -2229,15 +2231,18 @@
* swp_pager_meta_build() failed memory
* allocation already, likely to sleep in retry.
*/
+ sb->d[i] = SWAPBLK_NONE;
VM_OBJECT_WUNLOCK(srcobject);
- swp_pager_meta_build(dstobject,
- sb->p + i - offset, sb->d[i], false);
+ swp_pager_meta_build(dstobject, p + i - offset,
+ blk, false);
VM_OBJECT_WLOCK(srcobject);
- } else if (blk != SWAPBLK_NONE)
+ goto restart;
+ }
+ if (blk != SWAPBLK_NONE)
swp_pager_update_freerange(&range, sb->d[i]);
sb->d[i] = SWAPBLK_NONE;
}
- pindex = sb->p + SWAP_META_PAGES;
+ pindex = p + SWAP_META_PAGES;
if (swp_pager_swblk_empty(sb, 0, start) &&
swp_pager_swblk_empty(sb, limit, SWAP_META_PAGES)) {
swblk_lookup_remove(srcobject, sb);

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 23, 12:34 PM (17 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28957118
Default Alt Text
D46629.id143212.diff (1 KB)

Event Timeline