From cfed176e681304337c5ceee6bc34e3fce05b3c02 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 28 Sep 2007 18:48:09 +0000 Subject: [PATCH] * I just saw the page writer passing a free page to write_page(). Apparently not everyone checks the page state for PAGE_STATE_BUSY. vm_page_write_modified_pages() does now at least. * Fixed typos in comments. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22349 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 18bf85b8fc..1ecd8b19bd 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -680,7 +680,7 @@ page_writer(void* /*unused*/) vm_page *pages[kNumPages]; uint32 numPages = 0; - // TODO: once the I/O scheduler is there, we should write back + // TODO: once the I/O scheduler is there, we should write // a lot more pages back. // TODO: make this laptop friendly, too (ie. only start doing // something if someone else did something or there is really @@ -730,7 +730,7 @@ page_writer(void* /*unused*/) writeStatus[i] = write_page(pages[i], false); } - // mark pages depending on if they could be written or not + // mark pages depending on whether they could be written or not for (uint32 i = 0; i < numPages; i++) { vm_cache *cache = pages[i]->cache; @@ -854,8 +854,10 @@ vm_page_write_modified_pages(vm_cache *cache, bool fsReenter) InterruptsSpinLocker locker(&sPageLock); remove_page_from_queue(&sModifiedPageQueue, page); dequeuedPage = true; - } else if (!vm_test_map_modification(page)) + } else if (page->state == PAGE_STATE_BUSY + || !vm_test_map_modification(page)) { continue; + } page->state = PAGE_STATE_BUSY;