summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-11 00:52:28 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-11 01:04:43 +0100
commit07f78f7000400bd9d2b3a9f665e7cdfea0cd3df9 (patch)
treeae5c33c93ff9c3d3fe73fcfdb2ca9a3ebbb35b6c /vm
parenta6b9fff286f4b984d4d82afacdf48bd1401d04ab (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.c10
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;
}