From 50431b7584d41d62e439b7f6ac46c2e18cba3530 Mon Sep 17 00:00:00 2001 From: "Masamichi Takagi m-takagi@ab.jp.nec.com" Date: Tue, 30 Oct 2012 21:03:47 +0900 Subject: [PATCH] make mmap try to reserve memory areas with (size/2)-aligned virtual addresses --- kernel/syscall.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel/syscall.c b/kernel/syscall.c index fef8e312..c472a30c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -395,16 +395,27 @@ SYSCALL_DECLARE(mmap) // #define MAP_ANONYMOUS 0x20 kprintf("syscall.c,!MAP_FIXED,MAP_ANONYMOUS\n"); unsigned long flags = aal_mc_spinlock_lock(&cpu_local_var(current)->vm->memory_range_lock); + +#if 1 + unsigned long sz = aal_mc_syscall_arg1(ctx); + unsigned long amt_align = (sz & (PAGE_SIZE*2-1)) ? PAGE_SIZE : sz/2; + unsigned long s = ((region->map_end + amt_align - 1) & ~(amt_align - 1)); + kprintf("(%d),syscall.c,!MAP_FIXED,MAP_ANONYMOUS,sz=%lx,amt_align=%lx,s=%lx\n", aal_mc_get_processor_id(), sz, amt_align, s); + unsigned long map_end_aligned = ((region->map_end + amt_align - 1) & ~(amt_align - 1)); +#else unsigned long s = (region->map_end + PAGE_SIZE - 1) & PAGE_MASK; + unsigned long map_end_aligned = region->map_end; +#endif + unsigned long len = (aal_mc_syscall_arg1(ctx) + PAGE_SIZE - 1) & PAGE_MASK; - // lockr = aal_mc_spinlock_lock(&cpu_status_lock); region->map_end = extend_process_region(cpu_local_var(current), region->map_start, region->map_end, s + len); aal_mc_spinlock_unlock(&cpu_local_var(current)->vm->memory_range_lock, flags); - kprintf("syscall.c,returning to caller...\n"); + // kprintf("syscall.c,mmap,map_end=%lx,s+len=%lx\n", region->map_end, s+len); + if (region->map_end == s + len) { return s; } else { return -EINVAL; } } else if ((aal_mc_syscall_arg3(ctx) & 0x02) == 0x02) {