diff --git a/kernel/syscall.c b/kernel/syscall.c index 159f21ff..bd9eec9f 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1079,25 +1079,18 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, vrflags |= PROT_TO_VR_FLAG(prot); vrflags |= (flags & MAP_PRIVATE)? VR_PRIVATE: 0; vrflags |= (flags & MAP_LOCKED)? VR_LOCKED: 0; + vrflags |= VR_DEMAND_PAGING; if (flags & MAP_ANONYMOUS) { - if (0) { - /* dummy */ + if (!anon_on_demand) { + populated_mapping = 1; } #ifdef USE_NOCACHE_MMAP #define X_MAP_NOCACHE MAP_32BIT else if (flags & X_MAP_NOCACHE) { + vrflags &= ~VR_DEMAND_PAGING; vrflags |= VR_IO_NOCACHE; } #endif - else { - vrflags |= VR_DEMAND_PAGING; - if (!anon_on_demand) { - populated_mapping = 1; - } - } - } - else { - vrflags |= VR_DEMAND_PAGING; } if (flags & (MAP_POPULATE | MAP_LOCKED)) { diff --git a/kernel/zeroobj.c b/kernel/zeroobj.c index c8fc5c2a..a70a89f2 100644 --- a/kernel/zeroobj.c +++ b/kernel/zeroobj.c @@ -172,6 +172,10 @@ static int zeroobj_get_page(struct memobj *memobj, off_t off, int p2align, struct zeroobj *obj = to_zeroobj(memobj); struct page *page; + /* Don't bother about zero page, page fault handler will + * allocate and clear pages */ + return 0; + dkprintf("zeroobj_get_page(%p,%#lx,%d,%p)\n", memobj, off, p2align, physp); if (off & ~PAGE_MASK) {