diff --git a/kernel/include/page.h b/kernel/include/page.h index e0290386..efdb928d 100644 --- a/kernel/include/page.h +++ b/kernel/include/page.h @@ -66,4 +66,6 @@ static inline int page_is_multi_mapped(struct page *page) return (ihk_atomic_read(&page->count) > 1); } +/* Should we take page faults on ANONYMOUS mappings? */ +extern int anon_on_demand; #endif diff --git a/kernel/mem.c b/kernel/mem.c index e218e099..1ca26f10 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -56,6 +56,8 @@ extern int ihk_mc_pt_print_pte(struct page_table *pt, void *virt); struct tlb_flush_entry tlb_flush_vector[IHK_TLB_FLUSH_IRQ_VECTOR_SIZE]; +int anon_on_demand = 0; + static void reserve_pages(unsigned long start, unsigned long end, int type) { if (start < pa_start) { @@ -681,6 +683,11 @@ void mem_init(void) /* Prepare the kernel virtual map space */ virtual_allocator_init(); + + if (find_command_line("anon_on_demand")) { + kprintf("Demand paging on ANONYMOUS mappings enabled.\n"); + anon_on_demand = 1; + } } struct location { diff --git a/kernel/syscall.c b/kernel/syscall.c index 0beb8025..20720e2f 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1078,7 +1078,9 @@ SYSCALL_DECLARE(mmap) } #endif else { - vrflags |= VR_DEMAND_PAGING; + if (anon_on_demand) { + vrflags |= VR_DEMAND_PAGING; + } } } else {