From 4437ecc69a166a45b802e4652316b10e71cd16bb Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Sat, 31 Dec 2016 10:09:49 +0900 Subject: [PATCH] do_mmap(): indicate user level allocations for anonymous mappings --- kernel/fileobj.c | 5 ++++- kernel/syscall.c | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel/fileobj.c b/kernel/fileobj.c index 80808dd0..7257cebd 100644 --- a/kernel/fileobj.c +++ b/kernel/fileobj.c @@ -497,7 +497,10 @@ static int fileobj_get_page(struct memobj *memobj, off_t off, if (!page) { npages = 1 << p2align; - virt = ihk_mc_alloc_pages(npages, IHK_MC_AP_NOWAIT); + + virt = ihk_mc_alloc_pages(npages, IHK_MC_AP_NOWAIT | + (to_memobj(obj)->flags & MF_ZEROFILL) ? IHK_MC_AP_USER : 0); + if (!virt) { error = -ENOMEM; kprintf("fileobj_get_page(%p,%lx,%x,%p):" diff --git a/kernel/syscall.c b/kernel/syscall.c index 07ba71bd..0f5e5b3a 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1252,12 +1252,14 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, populated_mapping = 1; } +#if 0 /* XXX: Intel MPI 128MB mapping.. */ if (len == 134217728) { kprintf("%s: 128MB mapping -> no prefault\n", __FUNCTION__, len); populated_mapping = 0; } +#endif if (!(prot & PROT_WRITE)) { error = set_host_vma(addr, len, PROT_READ); @@ -1317,8 +1319,12 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, else if (!(vrflags & VR_DEMAND_PAGING) && ((vrflags & VR_PROT_MASK) != VR_PROT_NONE)) { npages = len >> PAGE_SHIFT; + /* Small allocations mostly benefit from closest RAM, + * otherwise follow user requested policy */ + unsigned long __flag = (len >= 1048576) ? IHK_MC_AP_USER : 0; - p = ihk_mc_alloc_aligned_pages(npages, p2align, IHK_MC_AP_NOWAIT); + p = ihk_mc_alloc_aligned_pages(npages, p2align, + IHK_MC_AP_NOWAIT | __flag); if (p == NULL) { ekprintf("%s: warning: failed to allocate %d contiguous pages" " (pgshift: %d), enabling demand paging\n",