From 88675a7eb21fdf0d3d6bf4baad7e15c0c8f76219 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 4 Jan 2010 20:43:25 +0000 Subject: [PATCH] steal_pages(): Recheck sUnreservedFreePages after incrementing sPageDeficit. Since the former is no longer guarded by any lock, there's a race condition with vm_page_unreserve_pages() which would cause us to wait longer than necessary. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34898 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index ae44aa4294..5abddea4f6 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1470,8 +1470,14 @@ steal_pages(vm_page **pages, size_t count) // we need to wait for pages to become inactive - ConditionVariableEntry freeConditionEntry; sPageDeficit++; + if (sUnreservedFreePages >= 0) { + // There are enough pages available now. No need to wait after all. + sPageDeficit--; + return stolen; + } + + ConditionVariableEntry freeConditionEntry; freeConditionEntry.Add(&sFreePageQueue); locker.Unlock();