diff options
Diffstat (limited to 'vm/vm_pageout.c')
-rw-r--r-- | vm/vm_pageout.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c index 85db021e..7dc9c12f 100644 --- a/vm/vm_pageout.c +++ b/vm/vm_pageout.c @@ -46,6 +46,7 @@ #include <kern/slab.h> #include <kern/task.h> #include <kern/thread.h> +#include <kern/printf.h> #include <vm/pmap.h> #include <vm/vm_map.h> #include <vm/vm_object.h> @@ -53,6 +54,13 @@ #include <vm/vm_pageout.h> #include <machine/locore.h> +#define DEBUG 0 + +/* + * Maximum delay, in milliseconds, between two pageout scans. + */ +#define VM_PAGEOUT_TIMEOUT 50 + /* * Event placeholder for pageout requests, synchronized with * the free page queue lock. @@ -251,17 +259,19 @@ vm_pageout_setup( vm_page_wire(m); } else { - vm_page_activate(m); + m->external_laundry = TRUE; /* - * If vm_page_external_pagedout is negative, + * If vm_page_external_laundry_count is negative, * the pageout daemon isn't expecting to be * notified. */ - if (vm_page_external_pagedout >= 0) { - vm_page_external_pagedout++; + if (vm_page_external_laundry_count >= 0) { + vm_page_external_laundry_count++; } + + vm_page_activate(m); } vm_page_unlock_queues(); @@ -460,9 +470,19 @@ void vm_pageout(void) FALSE); } else if (should_wait) { assert_wait(&vm_pageout_continue, FALSE); - thread_set_timeout(500); + thread_set_timeout(VM_PAGEOUT_TIMEOUT); simple_unlock(&vm_page_queue_free_lock); thread_block(NULL); + +#if DEBUG + if (current_thread()->wait_result != THREAD_AWAKENED) { + printf("vm_pageout: timeout," + " vm_page_laundry_count:%d" + " vm_page_external_laundry_count:%d\n", + vm_page_laundry_count, + vm_page_external_laundry_count); + } +#endif } else { simple_unlock(&vm_page_queue_free_lock); } |