memory_range_lock: Enable interrupt when trylock fails
Also use read-write-lock Change-Id: I03150b7208325ec1fe422dcd5f931e4e41c8e40e Refs: #452
This commit is contained in:
committed by
Masamichi Takagi
parent
258156b57e
commit
0d3ef65092
107
test/issues/452/C452.patch
Normal file
107
test/issues/452/C452.patch
Normal file
@ -0,0 +1,107 @@
|
||||
diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||
index f911674..52c164f 100644
|
||||
--- a/arch/arm64/kernel/include/syscall_list.h
|
||||
+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||
@@ -134,6 +134,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||
SYSCALL_HANDLED(732, get_system)
|
||||
SYSCALL_HANDLED(733, util_register_desc)
|
||||
|
||||
+SYSCALL_HANDLED(740, setkdebug)
|
||||
+
|
||||
/* McKernel Specific */
|
||||
SYSCALL_HANDLED(801, swapout)
|
||||
SYSCALL_HANDLED(802, linux_mlock)
|
||||
diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h
|
||||
index 79eda7f..1f81b0a 100644
|
||||
--- a/arch/x86_64/kernel/include/syscall_list.h
|
||||
+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||
@@ -174,6 +174,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||
SYSCALL_HANDLED(732, get_system)
|
||||
SYSCALL_HANDLED(733, util_register_desc)
|
||||
|
||||
+SYSCALL_HANDLED(740, setkdebug)
|
||||
+
|
||||
/* McKernel Specific */
|
||||
SYSCALL_HANDLED(801, swapout)
|
||||
SYSCALL_HANDLED(802, linux_mlock)
|
||||
diff --git a/kernel/include/process.h b/kernel/include/process.h
|
||||
index 0a9ff47..ecb464f 100644
|
||||
--- a/kernel/include/process.h
|
||||
+++ b/kernel/include/process.h
|
||||
@@ -573,6 +573,7 @@ struct process {
|
||||
#endif // PROFILE_ENABLE
|
||||
int nr_processes; /* For partitioned execution */
|
||||
int process_rank; /* Rank in partition */
|
||||
+ int debug_flags;
|
||||
};
|
||||
|
||||
/*
|
||||
diff --git a/kernel/procfs.c b/kernel/procfs.c
|
||||
index 5f9675c..a1b6d22 100644
|
||||
--- a/kernel/procfs.c
|
||||
+++ b/kernel/procfs.c
|
||||
@@ -420,6 +420,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
if (strcmp(p, "maps") == 0) {
|
||||
struct vm_range *range;
|
||||
|
||||
+ kprintf("read /proc/*/maps\n");
|
||||
memory_range_read_lock(vm, &irqflags);
|
||||
|
||||
range = lookup_process_memory_range(vm, 0, -1);
|
||||
@@ -485,6 +486,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
start = (offset / sizeof(uint64_t)) << PAGE_SHIFT;
|
||||
end = start + ((count / sizeof(uint64_t)) << PAGE_SHIFT);
|
||||
|
||||
+ kprintf("read /proc/*/pagemap\n");
|
||||
memory_range_read_lock(vm, &irqflags);
|
||||
|
||||
while (start < end) {
|
||||
@@ -527,6 +529,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
goto err;
|
||||
}
|
||||
|
||||
+ kprintf("read /proc/*/status\n");
|
||||
memory_range_read_lock(proc->vm, &irqflags);
|
||||
range = lookup_process_memory_range(vm, 0, -1);
|
||||
while (range) {
|
||||
diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||
index 012ef13..9a34984 100644
|
||||
--- a/kernel/syscall.c
|
||||
+++ b/kernel/syscall.c
|
||||
@@ -1635,6 +1635,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
||||
flush_nfo_tlb();
|
||||
|
||||
memory_range_write_lock(thread->vm, &irqflags);
|
||||
+ if(thread->proc->debug_flags) {
|
||||
+ // sleep 5 sec
|
||||
+ unsigned long ts = rdtsc();
|
||||
+ unsigned long nanosecs = 5000000000L;
|
||||
+ unsigned long tscs = nanosecs * 1000 / ihk_mc_get_ns_per_tsc();
|
||||
+
|
||||
+ kprintf("kernel debug sleep 5sec...\n");
|
||||
+ while (rdtsc() - ts < tscs) {
|
||||
+ cpu_pause();
|
||||
+ }
|
||||
+ kprintf("kernel debug wake up\n");
|
||||
+ }
|
||||
|
||||
if (flags & MAP_HUGETLB) {
|
||||
pgshift = (flags >> MAP_HUGE_SHIFT) & 0x3F;
|
||||
@@ -9482,6 +9494,17 @@ SYSCALL_DECLARE(util_register_desc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+SYSCALL_DECLARE(setkdebug)
|
||||
+{
|
||||
+ int flags = ihk_mc_syscall_arg0(ctx);
|
||||
+ struct thread *mythread = cpu_local_var(current);
|
||||
+ struct process *proc = mythread->proc;
|
||||
+
|
||||
+ kprintf("set kernel debug flag pid=%d val=%d\n", proc->pid, flags);
|
||||
+ proc->debug_flags = flags;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void
|
||||
reset_cputime()
|
||||
{
|
||||
Reference in New Issue
Block a user