do_mmap(): simplify demand paging flags; avoid zeroobj and allocate pages directly

This commit is contained in:
Balazs Gerofi
2016-08-17 14:00:05 +09:00
parent 1a207e19c2
commit 9efd568e07
2 changed files with 8 additions and 11 deletions

View File

@@ -1079,25 +1079,18 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot,
vrflags |= PROT_TO_VR_FLAG(prot); vrflags |= PROT_TO_VR_FLAG(prot);
vrflags |= (flags & MAP_PRIVATE)? VR_PRIVATE: 0; vrflags |= (flags & MAP_PRIVATE)? VR_PRIVATE: 0;
vrflags |= (flags & MAP_LOCKED)? VR_LOCKED: 0; vrflags |= (flags & MAP_LOCKED)? VR_LOCKED: 0;
vrflags |= VR_DEMAND_PAGING;
if (flags & MAP_ANONYMOUS) { if (flags & MAP_ANONYMOUS) {
if (0) { if (!anon_on_demand) {
/* dummy */ populated_mapping = 1;
} }
#ifdef USE_NOCACHE_MMAP #ifdef USE_NOCACHE_MMAP
#define X_MAP_NOCACHE MAP_32BIT #define X_MAP_NOCACHE MAP_32BIT
else if (flags & X_MAP_NOCACHE) { else if (flags & X_MAP_NOCACHE) {
vrflags &= ~VR_DEMAND_PAGING;
vrflags |= VR_IO_NOCACHE; vrflags |= VR_IO_NOCACHE;
} }
#endif #endif
else {
vrflags |= VR_DEMAND_PAGING;
if (!anon_on_demand) {
populated_mapping = 1;
}
}
}
else {
vrflags |= VR_DEMAND_PAGING;
} }
if (flags & (MAP_POPULATE | MAP_LOCKED)) { if (flags & (MAP_POPULATE | MAP_LOCKED)) {

View File

@@ -172,6 +172,10 @@ static int zeroobj_get_page(struct memobj *memobj, off_t off, int p2align,
struct zeroobj *obj = to_zeroobj(memobj); struct zeroobj *obj = to_zeroobj(memobj);
struct page *page; 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", dkprintf("zeroobj_get_page(%p,%#lx,%d,%p)\n",
memobj, off, p2align, physp); memobj, off, p2align, physp);
if (off & ~PAGE_MASK) { if (off & ~PAGE_MASK) {