From 5ff3d4f2db5b4970385825bc8a48ecd268954594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 5 Nov 2007 11:37:02 +0000 Subject: [PATCH] * If steal_pages() stole more than originally asked for, it might have lost those pages in the non-reserve case. * vm_page_allocate_page() could also lose a stolen page in case more free pages were available after steal_pages() was called. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22834 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 6c687a21b2..5a2c1c2d9b 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -974,7 +974,7 @@ steal_pages(vm_page **pages, size_t count, bool reserve) break; if (steal_page(page, false)) { - if (reserve) { + if (reserve || stolen >= maxCount) { InterruptsSpinLocker _(sPageLock); enqueue_page(&sFreePageQueue, page); page->state = PAGE_STATE_FREE; @@ -1374,10 +1374,8 @@ vm_page_allocate_page(int pageState, bool reserved) size_t stolen = steal_pages(&page, 1, false); locker.Lock(); - if (stolen == 0) { - // just try again - continue; - } + if (stolen > 0) + break; } if (page->cache != NULL)