* SWP_PAGER_META_TRANSFER() - free a range of blocks in the srcobject's swap * metadata, or transfer it into dstobject. * * This routine will free swap metadata structures as they are cleaned * out. */
| 2109 | * out. |
| 2110 | */ |
| 2111 | static void |
| 2112 | swp_pager_meta_transfer(vm_object_t srcobject, vm_object_t dstobject, |
| 2113 | vm_pindex_t pindex, vm_pindex_t count) |
| 2114 | { |
| 2115 | struct swblk *sb; |
| 2116 | daddr_t n_free, s_free; |
| 2117 | vm_pindex_t offset, last; |
| 2118 | int i, limit, start; |
| 2119 | |
| 2120 | VM_OBJECT_ASSERT_WLOCKED(srcobject); |
| 2121 | if (srcobject->type != OBJT_SWAP || count == 0) |
| 2122 | return; |
| 2123 | |
| 2124 | swp_pager_init_freerange(&s_free, &n_free); |
| 2125 | offset = pindex; |
| 2126 | last = pindex + count; |
| 2127 | for (;;) { |
| 2128 | sb = SWAP_PCTRIE_LOOKUP_GE(&srcobject->un_pager.swp.swp_blks, |
| 2129 | rounddown(pindex, SWAP_META_PAGES)); |
| 2130 | if (sb == NULL || sb->p >= last) |
| 2131 | break; |
| 2132 | start = pindex > sb->p ? pindex - sb->p : 0; |
| 2133 | limit = last - sb->p < SWAP_META_PAGES ? last - sb->p : |
| 2134 | SWAP_META_PAGES; |
| 2135 | for (i = start; i < limit; i++) { |
| 2136 | if (sb->d[i] == SWAPBLK_NONE) |
| 2137 | continue; |
| 2138 | if (dstobject == NULL || |
| 2139 | !swp_pager_xfer_source(srcobject, dstobject, |
| 2140 | sb->p + i - offset, sb->d[i])) { |
| 2141 | swp_pager_update_freerange(&s_free, &n_free, |
| 2142 | sb->d[i]); |
| 2143 | } |
| 2144 | sb->d[i] = SWAPBLK_NONE; |
| 2145 | } |
| 2146 | pindex = sb->p + SWAP_META_PAGES; |
| 2147 | if (swp_pager_swblk_empty(sb, 0, start) && |
| 2148 | swp_pager_swblk_empty(sb, limit, SWAP_META_PAGES)) { |
| 2149 | SWAP_PCTRIE_REMOVE(&srcobject->un_pager.swp.swp_blks, |
| 2150 | sb->p); |
| 2151 | uma_zfree(swblk_zone, sb); |
| 2152 | } |
| 2153 | } |
| 2154 | swp_pager_freeswapspace(s_free, n_free); |
| 2155 | } |
| 2156 | |
| 2157 | /* |
| 2158 | * SWP_PAGER_META_FREE() - free a range of blocks in the object's swap metadata |
no test coverage detected