use no IRQ disable spinlocks for page_table lock and disable debug msgs in mmap() by default

This commit is contained in:
Balazs Gerofi bgerofi@riken.jp
2013-05-10 13:22:18 +09:00
parent c4d9b18ddf
commit a79bfd6a01

View File

@@ -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();