bonefish+axeld:
* The page daemon now runs independently from the low memory state. * It now also increases its frequency and scanned pages, as well as decreases the interval between runs with increasing memory pressure. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22314 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,10 +15,14 @@
|
|||||||
#include <vm_page.h>
|
#include <vm_page.h>
|
||||||
|
|
||||||
|
|
||||||
|
const static uint32 kMinScanPagesCount = 512;
|
||||||
|
const static uint32 kMaxScanPagesCount = 8192;
|
||||||
|
const static bigtime_t kMinScanWaitInterval = 50000LL; // 50 ms
|
||||||
|
const static bigtime_t kMaxScanWaitInterval = 1000000LL; // 1 sec
|
||||||
|
|
||||||
|
static uint32 sLowPagesCount;
|
||||||
static sem_id sPageDaemonSem;
|
static sem_id sPageDaemonSem;
|
||||||
static uint32 sScanPagesCount;
|
|
||||||
static uint32 sNumPages;
|
static uint32 sNumPages;
|
||||||
static bigtime_t sScanWaitInterval;
|
|
||||||
|
|
||||||
|
|
||||||
class PageCacheLocker {
|
class PageCacheLocker {
|
||||||
@@ -163,24 +167,34 @@ check_page_activation(int32 index)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
page_daemon(void *unused)
|
page_daemon(void* /*unused*/)
|
||||||
{
|
{
|
||||||
|
bigtime_t scanWaitInterval = kMaxScanWaitInterval;
|
||||||
|
uint32 scanPagesCount = kMinScanPagesCount;
|
||||||
uint32 clearPage = 0;
|
uint32 clearPage = 0;
|
||||||
uint32 checkPage = sNumPages / 2;
|
uint32 checkPage = sNumPages / 2;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
acquire_sem_etc(sPageDaemonSem, 1, B_RELATIVE_TIMEOUT,
|
acquire_sem_etc(sPageDaemonSem, 1, B_RELATIVE_TIMEOUT,
|
||||||
sScanWaitInterval);
|
scanWaitInterval);
|
||||||
|
|
||||||
if (vm_low_memory_state() < B_LOW_MEMORY_NOTE) {
|
// Compute next run time
|
||||||
|
uint32 pagesLeft = vm_page_num_free_pages();
|
||||||
|
if (pagesLeft > sLowPagesCount) {
|
||||||
// don't do anything if we have enough free memory left
|
// don't do anything if we have enough free memory left
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 leftToFree = 32;
|
scanWaitInterval = kMinScanWaitInterval
|
||||||
// TODO: make this depending on the low memory state
|
+ (kMaxScanWaitInterval - kMinScanWaitInterval)
|
||||||
|
* pagesLeft / sLowPagesCount;
|
||||||
|
scanPagesCount = kMaxScanPagesCount
|
||||||
|
- (kMaxScanPagesCount - kMinScanPagesCount)
|
||||||
|
* pagesLeft / sLowPagesCount;
|
||||||
|
uint32 leftToFree = 32 + (scanPagesCount - 32)
|
||||||
|
* pagesLeft / sLowPagesCount;
|
||||||
|
|
||||||
for (uint32 i = 0; i < sScanPagesCount && leftToFree > 0; i++) {
|
for (uint32 i = 0; i < scanPagesCount && leftToFree > 0; i++) {
|
||||||
if (clearPage == 0)
|
if (clearPage == 0)
|
||||||
dprintf("clear through\n");
|
dprintf("clear through\n");
|
||||||
if (checkPage == 0)
|
if (checkPage == 0)
|
||||||
@@ -206,9 +220,10 @@ vm_daemon_init()
|
|||||||
sPageDaemonSem = create_sem(0, "page daemon");
|
sPageDaemonSem = create_sem(0, "page daemon");
|
||||||
|
|
||||||
sNumPages = vm_page_num_pages();
|
sNumPages = vm_page_num_pages();
|
||||||
// TODO: compute those depending on sNumPages and memory pressure!
|
|
||||||
sScanPagesCount = 512;
|
sLowPagesCount = sNumPages / 16;
|
||||||
sScanWaitInterval = 1000000;
|
if (sLowPagesCount < 1024)
|
||||||
|
sLowPagesCount = 1024;
|
||||||
|
|
||||||
// create a kernel thread to select pages for pageout
|
// create a kernel thread to select pages for pageout
|
||||||
thread_id thread = spawn_kernel_thread(&page_daemon, "page daemon",
|
thread_id thread = spawn_kernel_thread(&page_daemon, "page daemon",
|
||||||
|
|||||||
Reference in New Issue
Block a user