Page MenuHomeFreeBSD

D22409.id64444.diff
No OneTemporary

D22409.id64444.diff

Index: sys/vm/swap_pager.c
===================================================================
--- sys/vm/swap_pager.c
+++ sys/vm/swap_pager.c
@@ -1,3 +1,4 @@
+#define xprintf printf
/*-
* SPDX-License-Identifier: BSD-4-Clause
*
@@ -421,6 +422,8 @@
* Metadata functions
*/
static daddr_t swp_pager_meta_build(vm_object_t, vm_pindex_t, daddr_t);
+static daddr_t swp_meta_lookup(vm_object_t object, vm_pindex_t pindex0,
+ int *before, int *after);
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);
@@ -1042,7 +1045,7 @@
* store exists before and after the requested page.
*/
static boolean_t
-swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before,
+old_swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before,
int *after)
{
daddr_t blk, blk0;
@@ -1089,7 +1092,52 @@
}
return (TRUE);
}
+static boolean_t
+new_swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before,
+ int *after)
+{
+ daddr_t blk0;
+ VM_OBJECT_ASSERT_LOCKED(object);
+
+ /*
+ * do we have good backing store at the requested index ?
+ */
+ blk0 = swp_meta_lookup(object, pindex, before, after);
+ if (blk0 == SWAPBLK_NONE) {
+ if (before)
+ *before = 0;
+ if (after)
+ *after = 0;
+ return (FALSE);
+ }
+
+ return (TRUE);
+}
+
+static boolean_t
+swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before,
+ int *after)
+{
+ int before3 = 0, after3 = 0;
+ int before2 = 0, after2 = 0;
+ if (before) {
+ before3 = *before;
+ before2 = SWB_NPAGES - 1;
+ }
+ if (after) {
+ after3 = *after;
+ after2 = SWB_NPAGES - 1;
+ }
+ boolean_t ret = old_swap_pager_haspage(object, pindex, before, after);
+ new_swap_pager_haspage(object, pindex, &before2, &after2);
+if(before && after && (*before != before2 || *after != after2 ) )
+{
+xprintf("diff %s:before(v:o/n)=%d/%d/%d, after(v:o/n)=%d/%d/%d\n", __func__, before3, *before, before2, after3, *after, after2);
+}
+ return ret;
+}
+
/*
* SWAP_PAGER_PAGE_UNSWAPPED() - remove swap backing store related to page
*
@@ -1210,7 +1258,7 @@
vm_object_pip_add(object, count);
pindex = bm->pindex;
- blk = swp_pager_meta_ctl(object, pindex, 0);
+ blk = swp_meta_lookup(object, pindex, NULL, NULL);
KASSERT(blk != SWAPBLK_NONE,
("no swap blocking containing %p(%jx)", object, (uintmax_t)pindex));
@@ -2098,6 +2146,108 @@
uma_zfree(swblk_zone, sb);
}
swp_pager_freeswapspace(s_free, n_free);
+}
+
+/*
+ * SWP_META_LOOKUP() - determine if we have good backing store for
+ * the requested page and optionally the number of continuous blocks.
+ *
+ * This routine looks up swapblk assignments in the swap meta data.
+ * In addition, if before and/or after are provided with a limit value,
+ * it looks for the number of continuous blocks backward and forward.
+ *
+ * Tis returns SWAPBLK_NONE if swblk at pindex isn't associated to
+ * swap meta data; *before and *after are not touched for this.
+ * Otherwise, return the swap address of pindex. If *before and/or
+ * *after are provided, the number of continuos blocks before and/or
+ * after is returned.
+ *
+ * Input - "object" and "pindex0"
+ * Input/Output - "before" and "after"
+ */
+static daddr_t
+swp_meta_lookup(vm_object_t object, vm_pindex_t pindex0, int *before,
+ int *after)
+{
+ struct swblk *sb, *sbb;
+ vm_pindex_t pindex, pindexb;
+ daddr_t r0;
+ int i, i0, end, offset;
+
+ VM_OBJECT_ASSERT_LOCKED(object);
+ /*
+ * The meta data only exists if the object is OBJT_SWAP
+ * and even then might not be allocated yet.
+ */
+ if (object->type != OBJT_SWAP)
+ return (SWAPBLK_NONE);
+
+ i0 = pindex0 % SWAP_META_PAGES;
+ pindex = rounddown(pindex0, SWAP_META_PAGES);
+
+ sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks, pindex);
+ if (sb == NULL || sb->d[i0] == SWAPBLK_NONE)
+ return (SWAPBLK_NONE);
+ r0 = sb->d[i0];
+
+ if (before) {
+ if (*before <= 0 || pindex0 == 0) {
+ *before = 0;
+ goto finished_backward;
+ }
+ offset = 1;
+ pindexb = pindex;
+ sbb = sb;
+ if (pindex0 < *before) /* some pindexes are less than 0. */
+ end = pindex0;
+ else
+ end = *before;
+ i = i0 - 1;
+ do {
+ for (; i >= 0; --i, ++offset) {
+ if (r0 - offset != sbb->d[i]) {
+ *before = offset - 1;
+ goto finished_backward;
+ }
+ if (offset == end) {
+ *before = offset;
+ goto finished_backward;
+ }
+ }
+ pindexb -= SWAP_META_PAGES;
+ i = SWAP_META_PAGES - 1;
+ } while ((sbb = SWAP_PCTRIE_LOOKUP(
+ &object->un_pager.swp.swp_blks, pindexb)) != NULL);
+ *before = offset - 1;
+ }
+finished_backward:
+ if (!after)
+ return (r0);
+ if (*after <= 0) {
+ *after = 0;
+ return (r0);
+ }
+
+ offset = 1;
+ end = *after; /* how do I check overflow? */
+ i = i0 + 1;
+ do {
+ for (; i < SWAP_META_PAGES; ++i, ++offset) {
+ if (r0 + offset != sb->d[i]) {
+ *after = offset - 1;
+ return (r0);
+ }
+ if (offset == end) {
+ *after = offset;
+ return (r0);
+ }
+ }
+ pindex += SWAP_META_PAGES;
+ i = 0;
+ } while ((sb = SWAP_PCTRIE_LOOKUP(&object->un_pager.swp.swp_blks,
+ pindex)) != NULL);
+ *after = offset - 1;
+ return (r0);
}
/*

File Metadata

Mime Type
text/plain
Expires
Tue, Jul 21, 11:34 PM (10 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35337508
Default Alt Text
D22409.id64444.diff (5 KB)

Event Timeline