From 134a2fd160e5d09966687e31fb2051b5da110390 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 26 Jul 2008 14:39:05 +0000 Subject: [PATCH] Patch by Zhao Shuai with some modifications by myself: * Renamed sModifiedTemporaryPages to sModifiedNoSwapPages to better express what this variable is about. * Changed tracking of sModifiedNoSwapPages. It really counts non-swappable pages only, now (if swap support is enabled). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26641 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_page.cpp | 34 +++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index f0f47f7f14..975082ae8c 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -58,7 +58,7 @@ static addr_t sPhysicalPageOffset; static size_t sNumPages; static size_t sReservedPages; static vint32 sPageDeficit; -static size_t sModifiedTemporaryPages; +static size_t sModifiedNoSwapPages; static ConditionVariable sFreePageCondition; static spinlock sPageLock; @@ -621,8 +621,8 @@ dump_page_stats(int argc, char **argv) sFreePageQueue.count); kprintf("clear queue: %p, count = %ld\n", &sClearPageQueue, sClearPageQueue.count); - kprintf("modified queue: %p, count = %ld (%ld temporary)\n", - &sModifiedPageQueue, sModifiedPageQueue.count, sModifiedTemporaryPages); + kprintf("modified queue: %p, count = %ld (%ld no_swap)\n", + &sModifiedPageQueue, sModifiedPageQueue.count, sModifiedNoSwapPages); kprintf("active queue: %p, count = %ld\n", &sActivePageQueue, sActivePageQueue.count); kprintf("inactive queue: %p, count = %ld\n", &sInactivePageQueue, @@ -708,11 +708,15 @@ set_page_state_nolock(vm_page *page, int pageState) if (pageState != PAGE_STATE_INACTIVE && page->cache != NULL) panic("to be freed page %p has cache", page); } - if (page->cache != NULL && page->cache->temporary) { + if (page->cache != NULL && page->cache->temporary +#if ENABLE_SWAP_SUPPORT + && page->wired_count > 0 +#endif + ) { if (pageState == PAGE_STATE_MODIFIED) - sModifiedTemporaryPages++; + sModifiedNoSwapPages++; else if (page->state == PAGE_STATE_MODIFIED) - sModifiedTemporaryPages--; + sModifiedNoSwapPages--; } #ifdef PAGE_ALLOCATION_TRACING @@ -747,8 +751,12 @@ move_page_to_active_or_inactive_queue(vm_page *page, bool dequeued) page->state = state; enqueue_page(state == PAGE_STATE_ACTIVE ? &sActivePageQueue : &sInactivePageQueue, page); - if (page->cache->temporary) - sModifiedTemporaryPages--; + if (page->cache->temporary) { +#if ENABLE_SWAP_SUPPORT + if (page->wired_count > 0) +#endif + sModifiedNoSwapPages--; + } } else set_page_state_nolock(page, state); } @@ -953,7 +961,7 @@ page_writer(void* /*unused*/) marker.state = PAGE_STATE_UNUSED; while (true) { - if (sModifiedPageQueue.count - sModifiedTemporaryPages < 1024) { + if (sModifiedPageQueue.count - sModifiedNoSwapPages < 1024) { int32 count = 0; get_sem_count(sWriterWaitSem, &count); if (count == 0) @@ -1819,8 +1827,12 @@ vm_page_free(vm_cache *cache, vm_page *page) InterruptsSpinLocker _(sPageLock); if (page->cache == NULL && page->state == PAGE_STATE_MODIFIED - && cache->temporary) - sModifiedTemporaryPages--; + && cache->temporary) { +#if ENABLE_SWAP_SUPPORT + if (page->wired_count > 0) +#endif + sModifiedNoSwapPages--; + } set_page_state_nolock(page, PAGE_STATE_FREE); }