From 332e24fb438866dc46dc7d0a0500b5efac0959d3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 27 Mar 2008 05:42:43 +0000 Subject: [PATCH] Fixed a quasi-livelock in steal_pages() as proposed in ticket #1929. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24605 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 5b6b0b3eac..27b4644712 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1223,11 +1223,17 @@ steal_pages(vm_page **pages, size_t count, bool reserve) continue; } if (tried) { - // we had our go, but there are pages left, let someone else - // try + // We tried all potential pages, but one or more couldn't be stolen + // at that time (likely because their cache was locked). No one + // else will have any better luck, so we'll just retry a little + // later. + // TODO: Think about better strategies. E.g. if our condition + // variables had timeouts, we could just wait with timeout on + // the free page queue condition variable, which could might + // succeed earlier. locker.Unlock(); - sFreePageCondition.NotifyOne(); - locker.Lock(); + snooze(10000); + continue; } // we need to wait for pages to become inactive