diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-02-11 00:52:28 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-02-11 01:04:43 +0100 |
commit | 07f78f7000400bd9d2b3a9f665e7cdfea0cd3df9 (patch) | |
tree | ae5c33c93ff9c3d3fe73fcfdb2ca9a3ebbb35b6c /vm | |
parent | a6b9fff286f4b984d4d82afacdf48bd1401d04ab (diff) |
vm_page: Keep evicting out pages with external pager
`double_paging` used to be used to detect when we have not really flushed
a page yet (we have just pushed it to the external pager for now) and we
really want to flush something because allocations are paused. But when we
do not have a default pager, we are not double-paging but we should still
continue evicting pages.
Diffstat (limited to 'vm')
-rw-r--r-- | vm/vm_page.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/vm/vm_page.c b/vm/vm_page.c index 44573b10..fc1207ca 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -1096,6 +1096,7 @@ vm_page_seg_evict(struct vm_page_seg *seg, boolean_t external_only, boolean_t reclaim, double_paging; vm_object_t object; boolean_t was_active; + boolean_t internal; page = NULL; object = NULL; @@ -1169,9 +1170,9 @@ restart: assert(!page->laundry); assert(!(double_paging && page->external)); - if (object->internal || !alloc_paused || - ! IP_VALID(memory_manager_default) || - memory_manager_default_port(object->pager)) { + internal = object->internal || memory_manager_default_port(object->pager); + if (internal || !alloc_paused || + ! IP_VALID(memory_manager_default)) { double_paging = FALSE; } else { double_paging = page->laundry = TRUE; @@ -1221,7 +1222,8 @@ out: vm_pageout_page(page, FALSE, TRUE); /* flush it */ vm_object_unlock(object); - if (double_paging) { + if (!internal && alloc_paused) { + /* We have only told external pager, continue evicting. */ goto restart; } |