use no IRQ disable spinlocks for page_table lock and disable debug msgs in mmap() by default
This commit is contained in:
@@ -123,12 +123,12 @@ long sys_brk(int n, ihk_mc_user_context_t *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* try to extend memory region */
|
/* 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 =
|
region->brk_end =
|
||||||
extend_process_region(cpu_local_var(current),
|
extend_process_region(cpu_local_var(current),
|
||||||
region->brk_start, region->brk_end,
|
region->brk_start, region->brk_end,
|
||||||
address, 0);
|
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);
|
dkprintf("SC(%d)[sys_brk] brk_end set to %lx\n", ihk_mc_get_processor_id(), region->brk_end);
|
||||||
|
|
||||||
r = region->brk_end;
|
r = region->brk_end;
|
||||||
@@ -372,7 +372,7 @@ SYSCALL_DECLARE(mmap)
|
|||||||
struct vm_regions *region = &cpu_local_var(current)->vm->region;
|
struct vm_regions *region = &cpu_local_var(current)->vm->region;
|
||||||
unsigned long lockr;
|
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_arg0(ctx), ihk_mc_syscall_arg1(ctx),
|
||||||
ihk_mc_syscall_arg2(ctx), ihk_mc_syscall_arg3(ctx),
|
ihk_mc_syscall_arg2(ctx), ihk_mc_syscall_arg3(ctx),
|
||||||
ihk_mc_syscall_arg4(ctx), ihk_mc_syscall_arg5(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");
|
//kprintf("syscall.c,mmap,dumping kmsg...\n");
|
||||||
// send_kmsg(ctx);
|
// send_kmsg(ctx);
|
||||||
// return -EINVAL; // debug
|
// return -EINVAL; // debug
|
||||||
|
|
||||||
if((ihk_mc_syscall_arg3(ctx) & 0x10) == 0x10) {
|
if((ihk_mc_syscall_arg3(ctx) & 0x10) == 0x10) {
|
||||||
// libc/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
|
// libc/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
|
||||||
// #define MAP_FIXED 0x10
|
// #define MAP_FIXED 0x10
|
||||||
@@ -442,20 +442,20 @@ SYSCALL_DECLARE(mmap)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} 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
|
// 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)
|
// 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
|
// 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)
|
// 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);
|
memset((void*)phys_to_virt(pa), 0, e - s);
|
||||||
}
|
}
|
||||||
if ((ihk_mc_syscall_arg3(ctx) & 0x20) == 0x20) {
|
if ((ihk_mc_syscall_arg3(ctx) & 0x20) == 0x20) {
|
||||||
// #define MAP_ANONYMOUS 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
|
return ihk_mc_syscall_arg0(ctx); // maybe we should return zero
|
||||||
} else {
|
} else {
|
||||||
kprintf("syscall.c,MAP_FIXED,!MAP_ANONYMOUS\n");
|
dkprintf("syscall.c,MAP_FIXED,!MAP_ANONYMOUS\n");
|
||||||
// lseek(mmap_fd, mmap_off, SEEK_SET);
|
// lseek(mmap_fd, mmap_off, SEEK_SET);
|
||||||
// read(mmap_fd, mmap_addr, mmap_len);
|
// read(mmap_fd, mmap_addr, mmap_len);
|
||||||
SYSCALL_ARGS_6(MO, D, D, D, D, D);
|
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) {
|
} else if ((ihk_mc_syscall_arg3(ctx) & 0x20) == 0x20) {
|
||||||
// #define MAP_ANONYMOUS 0x20
|
// #define MAP_ANONYMOUS 0x20
|
||||||
kprintf("syscall.c,!MAP_FIXED,MAP_ANONYMOUS\n");
|
dkprintf("syscall.c,!MAP_FIXED,MAP_ANONYMOUS\n");
|
||||||
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);
|
||||||
unsigned long s = (region->map_end + PAGE_SIZE - 1) & PAGE_MASK;
|
unsigned long s = (region->map_end + PAGE_SIZE - 1) & PAGE_MASK;
|
||||||
unsigned long map_end_aligned = region->map_end;
|
unsigned long map_end_aligned = region->map_end;
|
||||||
unsigned long len = (ihk_mc_syscall_arg1(ctx) + PAGE_SIZE - 1) & PAGE_MASK;
|
unsigned long len = (ihk_mc_syscall_arg1(ctx) + PAGE_SIZE - 1) & PAGE_MASK;
|
||||||
@@ -488,7 +488,7 @@ SYSCALL_DECLARE(mmap)
|
|||||||
s + len, 0);
|
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);
|
dkprintf("syscall.c,mmap,map_end=%lx,s+len=%lx\n", region->map_end, s+len);
|
||||||
#ifdef USE_LARGE_PAGES
|
#ifdef USE_LARGE_PAGES
|
||||||
if (region->map_end >= s + len) {
|
if (region->map_end >= s + len) {
|
||||||
@@ -505,7 +505,7 @@ SYSCALL_DECLARE(mmap)
|
|||||||
} else if ((ihk_mc_syscall_arg3(ctx) & 0x02) == 0x02) {
|
} else if ((ihk_mc_syscall_arg3(ctx) & 0x02) == 0x02) {
|
||||||
// #define MAP_PRIVATE 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*/
|
#if 1 /* takagidebug*/
|
||||||
unsigned long amt_align = 0x100000; /* takagi */
|
unsigned long amt_align = 0x100000; /* takagi */
|
||||||
@@ -526,14 +526,14 @@ SYSCALL_DECLARE(mmap)
|
|||||||
region->map_end,
|
region->map_end,
|
||||||
s + len, 0);
|
s + len, 0);
|
||||||
#endif
|
#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; }
|
if (region->map_end < s + len) { return -EINVAL; }
|
||||||
s = region->map_end - len;
|
s = region->map_end - len;
|
||||||
|
|
||||||
struct syscall_request request IHK_DMA_ALIGN;
|
struct syscall_request request IHK_DMA_ALIGN;
|
||||||
request.number = n;
|
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);
|
// lseek(mmap_fd, mmap_off, SEEK_SET);
|
||||||
// read(mmap_fd, mmap_addr, mmap_len);
|
// read(mmap_fd, mmap_addr, mmap_len);
|
||||||
SYSCALL_ARGS_6(MO, D, D, D, D, D);
|
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) {
|
switch (code) {
|
||||||
case ARCH_SET_FS:
|
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);
|
ihk_mc_get_processor_id(), address);
|
||||||
cpu_local_var(current)->thread.tlsblock_base = address;
|
cpu_local_var(current)->thread.tlsblock_base = address;
|
||||||
err = ihk_mc_arch_set_special_register(type, address);
|
err = ihk_mc_arch_set_special_register(type, address);
|
||||||
@@ -696,7 +696,6 @@ SYSCALL_DECLARE(clone)
|
|||||||
int i;
|
int i;
|
||||||
int cpuid = -1;
|
int cpuid = -1;
|
||||||
int clone_flags = ihk_mc_syscall_arg0(ctx);
|
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 ihk_mc_cpu_info *cpu_info = ihk_mc_get_cpu_info();
|
||||||
struct process *new;
|
struct process *new;
|
||||||
|
|
||||||
@@ -704,7 +703,7 @@ SYSCALL_DECLARE(clone)
|
|||||||
ihk_mc_get_processor_id(),
|
ihk_mc_get_processor_id(),
|
||||||
(unsigned long)ihk_mc_syscall_arg1(ctx));
|
(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++) {
|
for (i = 0; i < cpu_info->ncpus; i++) {
|
||||||
if (get_cpu_local_var(i)->status == CPU_STATUS_IDLE) {
|
if (get_cpu_local_var(i)->status == CPU_STATUS_IDLE) {
|
||||||
cpuid = i;
|
cpuid = i;
|
||||||
@@ -970,7 +969,7 @@ SYSCALL_DECLARE(exit)
|
|||||||
* This unblocks any pthread_join() waiters. */
|
* This unblocks any pthread_join() waiters. */
|
||||||
if (cpu_local_var(current)->thread.clear_child_tid) {
|
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;
|
*cpu_local_var(current)->thread.clear_child_tid = 0;
|
||||||
barrier();
|
barrier();
|
||||||
|
|||||||
Reference in New Issue
Block a user