MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vm_swapout_object_deactivate

Function vm_swapout_object_deactivate

freebsd/vm/vm_swapout.c:206–248  ·  view source on GitHub ↗

* vm_swapout_object_deactivate * * Deactivate enough pages to satisfy the inactive target * requirements. * * The object and map must be locked. */

Source from the content-addressed store, hash-verified

204 * The object and map must be locked.
205 */
206static void
207vm_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 }
245unlock_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

Callers 1

Calls 3

blockcount_readFunction · 0.85
should_yieldFunction · 0.85

Tested by

no test coverage detected