* vm_swapout_object_deactivate * * Deactivate enough pages to satisfy the inactive target * requirements. * * The object and map must be locked. */
| 204 | * The object and map must be locked. |
| 205 | */ |
| 206 | static void |
| 207 | vm_swapout_object_deactivate(pmap_t pmap, vm_object_t first_object, |
| 208 | long desired) |
| 209 | { |
| 210 | vm_object_t backing_object, object; |
| 211 | vm_page_t m; |
| 212 | bool unmap; |
| 213 | |
| 214 | VM_OBJECT_ASSERT_LOCKED(first_object); |
| 215 | if ((first_object->flags & OBJ_FICTITIOUS) != 0) |
| 216 | return; |
| 217 | for (object = first_object;; object = backing_object) { |
| 218 | if (pmap_resident_count(pmap) <= desired) |
| 219 | goto unlock_return; |
| 220 | VM_OBJECT_ASSERT_LOCKED(object); |
| 221 | if ((object->flags & OBJ_UNMANAGED) != 0 || |
| 222 | blockcount_read(&object->paging_in_progress) > 0) |
| 223 | goto unlock_return; |
| 224 | |
| 225 | unmap = true; |
| 226 | if (object->shadow_count > 1) |
| 227 | unmap = false; |
| 228 | |
| 229 | /* |
| 230 | * Scan the object's entire memory queue. |
| 231 | */ |
| 232 | TAILQ_FOREACH(m, &object->memq, listq) { |
| 233 | if (pmap_resident_count(pmap) <= desired) |
| 234 | goto unlock_return; |
| 235 | if (should_yield()) |
| 236 | goto unlock_return; |
| 237 | vm_swapout_object_deactivate_page(pmap, m, unmap); |
| 238 | } |
| 239 | if ((backing_object = object->backing_object) == NULL) |
| 240 | goto unlock_return; |
| 241 | VM_OBJECT_RLOCK(backing_object); |
| 242 | if (object != first_object) |
| 243 | VM_OBJECT_RUNLOCK(object); |
| 244 | } |
| 245 | unlock_return: |
| 246 | if (object != first_object) |
| 247 | VM_OBJECT_RUNLOCK(object); |
| 248 | } |
| 249 | |
| 250 | /* |
| 251 | * deactivate some number of pages in a map, try to do it fairly, but |
no test coverage detected