From 0b51ee4efd06f8fb34dc67256ba1533a4e11a644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 29 Apr 2008 16:48:27 +0000 Subject: [PATCH] * The page writer was calling remove_page_marker() without holding the sPageLock. This could easily mess up the page queue. * Now, remove_page_marker() gets the lock itself. This fixes bug #1900. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25250 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 66c0ec055c..067ba82295 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -891,6 +891,7 @@ remove_page_marker(struct vm_page &marker) if (marker.state == PAGE_STATE_UNUSED) return; + InterruptsSpinLocker locker(sPageLock); page_queue *queue; vm_page *page; @@ -1249,9 +1250,10 @@ steal_pages(vm_page **pages, size_t count, bool reserve) tried = true; } - InterruptsSpinLocker locker(sPageLock); remove_page_marker(marker); + InterruptsSpinLocker locker(sPageLock); + if (reserve && sReservedPages <= free_page_queue_count() || count == 0 || !reserve && (sInactivePageQueue.count > 0