From 65d2b8a8e9fefd59eb270d7c0030ebe85b75d553 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 20 Apr 2009 15:19:41 +0000 Subject: [PATCH] * Introduces VMCache::CanWritePage() returning whether the given cache can theoretically write the given page. * page writer: Fixed the incorrect check whether a temporary page can be written by using the new CanWritePage(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30281 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/vm_types.h | 1 + src/system/kernel/cache/vnode_store.cpp | 8 ++++++++ src/system/kernel/cache/vnode_store.h | 1 + src/system/kernel/vm/VMAnonymousCache.cpp | 10 ++++++++++ src/system/kernel/vm/VMAnonymousCache.h | 1 + src/system/kernel/vm/vm_cache.cpp | 14 ++++++++++++++ src/system/kernel/vm/vm_page.cpp | 3 ++- 7 files changed, 37 insertions(+), 1 deletion(-) diff --git a/headers/private/kernel/vm_types.h b/headers/private/kernel/vm_types.h index 55f4491c65..a5b281c642 100644 --- a/headers/private/kernel/vm_types.h +++ b/headers/private/kernel/vm_types.h @@ -219,6 +219,7 @@ public: virtual status_t WriteAsync(off_t offset, const iovec* vecs, size_t count, size_t numBytes, uint32 flags, AsyncIOCallback* callback); + virtual bool CanWritePage(off_t offset); virtual status_t Fault(struct vm_address_space *aspace, off_t offset); diff --git a/src/system/kernel/cache/vnode_store.cpp b/src/system/kernel/cache/vnode_store.cpp index ab6f1715f4..adbeb9fa73 100644 --- a/src/system/kernel/cache/vnode_store.cpp +++ b/src/system/kernel/cache/vnode_store.cpp @@ -101,6 +101,14 @@ VMVnodeCache::Fault(struct vm_address_space *aspace, off_t offset) } +bool +VMVnodeCache::CanWritePage(off_t offset) +{ + // all pages can be written + return true; +} + + status_t VMVnodeCache::AcquireUnreferencedStoreRef() { diff --git a/src/system/kernel/cache/vnode_store.h b/src/system/kernel/cache/vnode_store.h index 3132d66212..aa49992c66 100644 --- a/src/system/kernel/cache/vnode_store.h +++ b/src/system/kernel/cache/vnode_store.h @@ -26,6 +26,7 @@ public: virtual status_t WriteAsync(off_t offset, const iovec* vecs, size_t count, size_t numBytes, uint32 flags, AsyncIOCallback* callback); + virtual bool CanWritePage(off_t offset); virtual status_t Fault(struct vm_address_space *aspace, off_t offset); diff --git a/src/system/kernel/vm/VMAnonymousCache.cpp b/src/system/kernel/vm/VMAnonymousCache.cpp index 5c99653454..ba18079d30 100644 --- a/src/system/kernel/vm/VMAnonymousCache.cpp +++ b/src/system/kernel/vm/VMAnonymousCache.cpp @@ -641,6 +641,16 @@ VMAnonymousCache::WriteAsync(off_t offset, const iovec* vecs, size_t count, } +bool +VMAnonymousCache::CanWritePage(off_t offset) +{ + // We can write the page, if we have not used all of our committed swap + // space or the page already has a swap slot assigned. + return fAllocatedSwapSize < fCommittedSwapSize + || _SwapBlockGetAddress(offset >> PAGE_SHIFT) != SWAP_SLOT_NONE; +} + + status_t VMAnonymousCache::Fault(struct vm_address_space *aspace, off_t offset) { diff --git a/src/system/kernel/vm/VMAnonymousCache.h b/src/system/kernel/vm/VMAnonymousCache.h index 2a1b58162a..a0919e7e1d 100644 --- a/src/system/kernel/vm/VMAnonymousCache.h +++ b/src/system/kernel/vm/VMAnonymousCache.h @@ -45,6 +45,7 @@ public: virtual status_t WriteAsync(off_t offset, const iovec* vecs, size_t count, size_t numBytes, uint32 flags, AsyncIOCallback* callback); + virtual bool CanWritePage(off_t offset); virtual status_t Fault(struct vm_address_space *aspace, off_t offset); diff --git a/src/system/kernel/vm/vm_cache.cpp b/src/system/kernel/vm/vm_cache.cpp index d9d676a6df..26160e6e1e 100644 --- a/src/system/kernel/vm/vm_cache.cpp +++ b/src/system/kernel/vm/vm_cache.cpp @@ -892,6 +892,20 @@ VMCache::WriteAsync(off_t offset, const iovec* vecs, size_t count, } +/*! \brief Returns whether the cache can write the page at the given offset. + + The cache must be locked when this function is invoked. + + @param offset The page offset. + @return \c true, if the page can be written, \c false otherwise. +*/ +bool +VMCache::CanWritePage(off_t offset) +{ + return false; +} + + status_t VMCache::Fault(struct vm_address_space *aspace, off_t offset) { diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 4c3a16af77..7c04735f59 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1247,7 +1247,8 @@ page_writer(void* /*unused*/) || (cache->temporary #if ENABLE_SWAP_SUPPORT && (!lowOnPages /*|| page->usage_count > 0*/ - || swap_available_pages() == 0) + || !cache->CanWritePage( + (off_t)page->cache_offset << PAGE_SHIFT)) #endif )) { continue;