From a79bfd6a01062ef840bfe379ec090f69c62b3f06 Mon Sep 17 00:00:00 2001 From: "Balazs Gerofi bgerofi@riken.jp" Date: Fri, 10 May 2013 13:22:18 +0900 Subject: [PATCH] use no IRQ disable spinlocks for page_table lock and disable debug msgs in mmap() by default --- kernel/syscall.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/kernel/syscall.c b/kernel/syscall.c index 227fe18c..4040381a 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -123,12 +123,12 @@ long sys_brk(int n, ihk_mc_user_context_t *ctx) } /* try to extend memory region */ - unsigned long flags = ihk_mc_spinlock_lock(&cpu_local_var(current)->vm->memory_range_lock); + ihk_mc_spinlock_lock_noirq(&cpu_local_var(current)->vm->memory_range_lock); region->brk_end = extend_process_region(cpu_local_var(current), region->brk_start, region->brk_end, address, 0); - ihk_mc_spinlock_unlock(&cpu_local_var(current)->vm->memory_range_lock, flags); + ihk_mc_spinlock_unlock_noirq(&cpu_local_var(current)->vm->memory_range_lock); dkprintf("SC(%d)[sys_brk] brk_end set to %lx\n", ihk_mc_get_processor_id(), region->brk_end); r = region->brk_end; @@ -372,7 +372,7 @@ SYSCALL_DECLARE(mmap) struct vm_regions *region = &cpu_local_var(current)->vm->region; unsigned long lockr; - kprintf("syscall.c,mmap,addr=%lx,len=%lx,prot=%lx,flags=%x,fd=%x,offset=%lx\n", + dkprintf("syscall.c,mmap,addr=%lx,len=%lx,prot=%lx,flags=%x,fd=%x,offset=%lx\n", ihk_mc_syscall_arg0(ctx), ihk_mc_syscall_arg1(ctx), ihk_mc_syscall_arg2(ctx), ihk_mc_syscall_arg3(ctx), ihk_mc_syscall_arg4(ctx), ihk_mc_syscall_arg5(ctx) @@ -380,7 +380,7 @@ SYSCALL_DECLARE(mmap) //kprintf("syscall.c,mmap,dumping kmsg...\n"); // send_kmsg(ctx); // return -EINVAL; // debug - + if((ihk_mc_syscall_arg3(ctx) & 0x10) == 0x10) { // libc/sysdeps/unix/sysv/linux/x86_64/bits/mman.h // #define MAP_FIXED 0x10 @@ -442,20 +442,20 @@ SYSCALL_DECLARE(mmap) } #endif } else { - kprintf("syscall.c,pa found=%lx\n", pa); + dkprintf("syscall.c,pa found=%lx\n", pa); // we need to clear to avoid BSS contamination, even when reusing physical memory range // because ld.so performs mmap (va:0, size:va of second section including BSS, FIXED, prot:RX, offset:0) // this causes contamination of BSS section when libc.so is large enough to reach BSS section // then performs mmap (va:second section including BSS, FIXED, prot:RW, offset:second section in file) - kprintf("syscall.c,clearing from %lx to %lx\n", s, e); + dkprintf("syscall.c,clearing from %lx to %lx\n", s, e); memset((void*)phys_to_virt(pa), 0, e - s); } if ((ihk_mc_syscall_arg3(ctx) & 0x20) == 0x20) { // #define MAP_ANONYMOUS 0x20 - kprintf("syscall.c,MAP_FIXED,MAP_ANONYMOUS\n"); + dkprintf("syscall.c,MAP_FIXED,MAP_ANONYMOUS\n"); return ihk_mc_syscall_arg0(ctx); // maybe we should return zero } else { - kprintf("syscall.c,MAP_FIXED,!MAP_ANONYMOUS\n"); + dkprintf("syscall.c,MAP_FIXED,!MAP_ANONYMOUS\n"); // lseek(mmap_fd, mmap_off, SEEK_SET); // read(mmap_fd, mmap_addr, mmap_len); SYSCALL_ARGS_6(MO, D, D, D, D, D); @@ -464,8 +464,8 @@ SYSCALL_DECLARE(mmap) } } else if ((ihk_mc_syscall_arg3(ctx) & 0x20) == 0x20) { // #define MAP_ANONYMOUS 0x20 - kprintf("syscall.c,!MAP_FIXED,MAP_ANONYMOUS\n"); - unsigned long flags = ihk_mc_spinlock_lock(&cpu_local_var(current)->vm->memory_range_lock); + dkprintf("syscall.c,!MAP_FIXED,MAP_ANONYMOUS\n"); + ihk_mc_spinlock_lock_noirq(&cpu_local_var(current)->vm->memory_range_lock); unsigned long s = (region->map_end + PAGE_SIZE - 1) & PAGE_MASK; unsigned long map_end_aligned = region->map_end; unsigned long len = (ihk_mc_syscall_arg1(ctx) + PAGE_SIZE - 1) & PAGE_MASK; @@ -488,7 +488,7 @@ SYSCALL_DECLARE(mmap) s + len, 0); } - ihk_mc_spinlock_unlock(&cpu_local_var(current)->vm->memory_range_lock, flags); + ihk_mc_spinlock_unlock_noirq(&cpu_local_var(current)->vm->memory_range_lock); dkprintf("syscall.c,mmap,map_end=%lx,s+len=%lx\n", region->map_end, s+len); #ifdef USE_LARGE_PAGES if (region->map_end >= s + len) { @@ -505,7 +505,7 @@ SYSCALL_DECLARE(mmap) } else if ((ihk_mc_syscall_arg3(ctx) & 0x02) == 0x02) { // #define MAP_PRIVATE 0x02 - unsigned long flags = ihk_mc_spinlock_lock(&cpu_local_var(current)->vm->memory_range_lock); + ihk_mc_spinlock_lock_noirq(&cpu_local_var(current)->vm->memory_range_lock); #if 1 /* takagidebug*/ unsigned long amt_align = 0x100000; /* takagi */ @@ -526,14 +526,14 @@ SYSCALL_DECLARE(mmap) region->map_end, s + len, 0); #endif - ihk_mc_spinlock_unlock(&cpu_local_var(current)->vm->memory_range_lock, flags); + ihk_mc_spinlock_unlock_noirq(&cpu_local_var(current)->vm->memory_range_lock); if (region->map_end < s + len) { return -EINVAL; } s = region->map_end - len; struct syscall_request request IHK_DMA_ALIGN; request.number = n; - kprintf("syscall.c,!MAP_FIXED,!MAP_ANONYMOUS,MAP_PRIVATE\n"); + dkprintf("syscall.c,!MAP_FIXED,!MAP_ANONYMOUS,MAP_PRIVATE\n"); // lseek(mmap_fd, mmap_off, SEEK_SET); // read(mmap_fd, mmap_addr, mmap_len); SYSCALL_ARGS_6(MO, D, D, D, D, D); @@ -663,7 +663,7 @@ long do_arch_prctl(unsigned long code, unsigned long address) switch (code) { case ARCH_SET_FS: - kprintf("[%d] arch_prctl: ARCH_SET_FS: 0x%lX\n", + dkprintf("[%d] arch_prctl: ARCH_SET_FS: 0x%lX\n", ihk_mc_get_processor_id(), address); cpu_local_var(current)->thread.tlsblock_base = address; err = ihk_mc_arch_set_special_register(type, address); @@ -696,7 +696,6 @@ SYSCALL_DECLARE(clone) int i; int cpuid = -1; int clone_flags = ihk_mc_syscall_arg0(ctx); - //unsigned long flags; /* spinlock */ struct ihk_mc_cpu_info *cpu_info = ihk_mc_get_cpu_info(); struct process *new; @@ -704,7 +703,7 @@ SYSCALL_DECLARE(clone) ihk_mc_get_processor_id(), (unsigned long)ihk_mc_syscall_arg1(ctx)); - //flags = ihk_mc_spinlock_lock(&cpu_status_lock); + //ihk_mc_spinlock_lock_noirq(&cpu_status_lock); for (i = 0; i < cpu_info->ncpus; i++) { if (get_cpu_local_var(i)->status == CPU_STATUS_IDLE) { cpuid = i; @@ -970,7 +969,7 @@ SYSCALL_DECLARE(exit) * This unblocks any pthread_join() waiters. */ if (cpu_local_var(current)->thread.clear_child_tid) { - kprintf("exit clear_child!\n"); + dkprintf("exit clear_child!\n"); *cpu_local_var(current)->thread.clear_child_tid = 0; barrier();