Patch by Zhao Shuai with changes by myself:
* Init swap support in main(). * Added "bool swappable" parameter to VMCacheFactory::CreateAnonymousCache(). A cache supporting swapping is created when true. Adjusted invocations accordingly. * The page writer does now write non-locked swappable pages (when memory is low). * Fixed header guard of VMAnonymousNoSwapCache.h. * Swap support is compiled conditionally, controlled by the ENABLE_SWAP_SUPPORT in src/system/kernel/vm/VMAnonymousCache.h. It is disabled ATM. Since no swap files are added, it wouldn't have much effect anyway. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26625 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
a6d2523e37
commit
c586076dca
@ -50,6 +50,8 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "vm/VMAnonymousCache.h"
|
||||||
|
|
||||||
|
|
||||||
//#define TRACE_BOOT
|
//#define TRACE_BOOT
|
||||||
#ifdef TRACE_BOOT
|
#ifdef TRACE_BOOT
|
||||||
@ -185,6 +187,10 @@ _start(kernel_args *bootKernelArgs, int currentCPU)
|
|||||||
notifications_init();
|
notifications_init();
|
||||||
TRACE("init VFS\n");
|
TRACE("init VFS\n");
|
||||||
vfs_init(&sKernelArgs);
|
vfs_init(&sKernelArgs);
|
||||||
|
#if ENABLE_SWAP_SUPPORT
|
||||||
|
TRACE("init swap support\n");
|
||||||
|
swap_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
// bring up the AP cpus in a lock step fashion
|
// bring up the AP cpus in a lock step fashion
|
||||||
TRACE("waking up AP cpus\n");
|
TRACE("waking up AP cpus\n");
|
||||||
|
@ -22,6 +22,9 @@
|
|||||||
#include <util/DoublyLinkedList.h>
|
#include <util/DoublyLinkedList.h>
|
||||||
#include <util/OpenHashTable.h>
|
#include <util/OpenHashTable.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if ENABLE_SWAP_SUPPORT
|
||||||
|
|
||||||
//#define TRACE_STORE
|
//#define TRACE_STORE
|
||||||
#ifdef TRACE_STORE
|
#ifdef TRACE_STORE
|
||||||
# define TRACE(x) dprintf x
|
# define TRACE(x) dprintf x
|
||||||
@ -725,3 +728,5 @@ swap_init(void)
|
|||||||
sAvailSwapSpace = 0;
|
sAvailSwapSpace = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // ENABLE_SWAP_SUPPORT
|
||||||
|
|
||||||
|
@ -12,6 +12,12 @@
|
|||||||
#include <vm_types.h>
|
#include <vm_types.h>
|
||||||
|
|
||||||
|
|
||||||
|
// uncomment to build in swap support
|
||||||
|
//#define ENABLE_SWAP_SUPPORT 1
|
||||||
|
|
||||||
|
#if ENABLE_SWAP_SUPPORT
|
||||||
|
|
||||||
|
|
||||||
typedef page_num_t swap_addr_t;
|
typedef page_num_t swap_addr_t;
|
||||||
struct swap_block;
|
struct swap_block;
|
||||||
|
|
||||||
@ -49,4 +55,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void swap_init(void);
|
||||||
|
|
||||||
|
#endif // ENABLE_SWAP_SUPPORT
|
||||||
|
|
||||||
#endif /* _KERNEL_VM_STORE_ANONYMOUS_H */
|
#endif /* _KERNEL_VM_STORE_ANONYMOUS_H */
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
* Distributed under the terms of the NewOS License.
|
* Distributed under the terms of the NewOS License.
|
||||||
*/
|
*/
|
||||||
#ifndef _KERNEL_VM_STORE_ANONYMOUS_H
|
#ifndef _KERNEL_VM_STORE_ANONYMOUS_NO_SWAP_H
|
||||||
#define _KERNEL_VM_STORE_ANONYMOUS_H
|
#define _KERNEL_VM_STORE_ANONYMOUS_NO_SWAP_H
|
||||||
|
|
||||||
#include <vm_types.h>
|
#include <vm_types.h>
|
||||||
|
|
||||||
@ -39,4 +39,4 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* _KERNEL_VM_STORE_ANONYMOUS_H */
|
#endif /* _KERNEL_VM_STORE_ANONYMOUS_NO_SWAP_H */
|
||||||
|
@ -1401,7 +1401,7 @@ map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
|
|||||||
|
|
||||||
// create an anonymous cache
|
// create an anonymous cache
|
||||||
status = VMCacheFactory::CreateAnonymousCache(newCache,
|
status = VMCacheFactory::CreateAnonymousCache(newCache,
|
||||||
(protection & B_STACK_AREA) != 0, 0, USER_STACK_GUARD_PAGES);
|
(protection & B_STACK_AREA) != 0, 0, USER_STACK_GUARD_PAGES, true);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
@ -1639,7 +1639,8 @@ vm_create_anonymous_area(team_id team, const char *name, void **address,
|
|||||||
status = VMCacheFactory::CreateAnonymousCache(cache,
|
status = VMCacheFactory::CreateAnonymousCache(cache,
|
||||||
canOvercommit, isStack ? 2 : 0,
|
canOvercommit, isStack ? 2 : 0,
|
||||||
isStack ? ((protection & B_USER_PROTECTION) != 0 ?
|
isStack ? ((protection & B_USER_PROTECTION) != 0 ?
|
||||||
USER_STACK_GUARD_PAGES : KERNEL_STACK_GUARD_PAGES) : 0);
|
USER_STACK_GUARD_PAGES : KERNEL_STACK_GUARD_PAGES) : 0,
|
||||||
|
wiring == B_NO_LOCK);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
@ -2302,7 +2303,7 @@ vm_copy_on_write_area(vm_cache* lowerCache)
|
|||||||
|
|
||||||
// create an anonymous cache
|
// create an anonymous cache
|
||||||
status_t status = VMCacheFactory::CreateAnonymousCache(upperCache, false, 0,
|
status_t status = VMCacheFactory::CreateAnonymousCache(upperCache, false, 0,
|
||||||
0);
|
0, true);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
@ -961,6 +961,7 @@ VMCache::_RemoveConsumer(VMCache* consumer)
|
|||||||
|
|
||||||
#include <heap.h>
|
#include <heap.h>
|
||||||
|
|
||||||
|
#include "VMAnonymousCache.h"
|
||||||
#include "VMAnonymousNoSwapCache.h"
|
#include "VMAnonymousNoSwapCache.h"
|
||||||
#include "VMDeviceCache.h"
|
#include "VMDeviceCache.h"
|
||||||
#include "VMNullCache.h"
|
#include "VMNullCache.h"
|
||||||
@ -969,8 +970,28 @@ VMCache::_RemoveConsumer(VMCache* consumer)
|
|||||||
|
|
||||||
/*static*/ status_t
|
/*static*/ status_t
|
||||||
VMCacheFactory::CreateAnonymousCache(VMCache*& _cache, bool canOvercommit,
|
VMCacheFactory::CreateAnonymousCache(VMCache*& _cache, bool canOvercommit,
|
||||||
int32 numPrecommittedPages, int32 numGuardPages)
|
int32 numPrecommittedPages, int32 numGuardPages, bool swappable)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_SWAP_SUPPORT
|
||||||
|
if (swappable) {
|
||||||
|
VMAnonymousCache* cache = new(nogrow) VMAnonymousCache;
|
||||||
|
if (cache == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
status_t error = cache->Init(canOvercommit, numPrecommittedPages,
|
||||||
|
numGuardPages);
|
||||||
|
if (error != B_OK) {
|
||||||
|
cache->Delete();
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
T(Create(cache));
|
||||||
|
|
||||||
|
_cache = cache;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
VMAnonymousNoSwapCache* cache = new(nogrow) VMAnonymousNoSwapCache;
|
VMAnonymousNoSwapCache* cache = new(nogrow) VMAnonymousNoSwapCache;
|
||||||
if (cache == NULL)
|
if (cache == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
@ -989,10 +989,16 @@ page_writer(void* /*unused*/)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
vm_cache *cache = page->cache;
|
vm_cache *cache = page->cache;
|
||||||
// TODO: write back temporary ones as soon as we have swap file support
|
|
||||||
if (cache->temporary
|
// Don't write back wired (locked) pages and don't write RAM pages
|
||||||
/*&& low_resource_state(B_KERNEL_RESOURCE_PAGES)
|
// until we're low on pages.
|
||||||
== B_NO_LOW_RESOURCE*/) {
|
if (page->wired_count > 0
|
||||||
|
#if ENABLE_SWAP_SUPPORT
|
||||||
|
|| cache->temporary
|
||||||
|
&& low_resource_state(B_KERNEL_RESOURCE_PAGES)
|
||||||
|
== B_NO_LOW_RESOURCE
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user