procfs: if memory_range_lock fails, process later
Change-Id: I3c5f24548455a63d8d5a4482f5081347f631885a Refs: #452
This commit is contained in:
committed by
Masamichi Takagi
parent
37605740a4
commit
ed21b6849d
219
test/issues/452/C452.patch
Normal file
219
test/issues/452/C452.patch
Normal file
@ -0,0 +1,219 @@
|
||||
diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||
index 5dd6243..709231d 100644
|
||||
--- a/arch/arm64/kernel/include/syscall_list.h
|
||||
+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||
@@ -128,6 +128,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 8ef9bd0..16361ea 100644
|
||||
--- a/arch/x86_64/kernel/include/syscall_list.h
|
||||
+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||
@@ -170,6 +170,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 32fb880..d45f734 100644
|
||||
--- a/kernel/include/process.h
|
||||
+++ b/kernel/include/process.h
|
||||
@@ -575,6 +575,7 @@ struct process {
|
||||
int process_rank; /* Rank in partition */
|
||||
int coredump_barrier_count, coredump_barrier_count2;
|
||||
mcs_rwlock_lock_t coredump_lock; // lock for coredump
|
||||
+ int debug_flags;
|
||||
};
|
||||
|
||||
/*
|
||||
diff --git a/kernel/procfs.c b/kernel/procfs.c
|
||||
index 277dbfe..ea78af3 100644
|
||||
--- a/kernel/procfs.c
|
||||
+++ b/kernel/procfs.c
|
||||
@@ -445,6 +445,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
+ kprintf("read /proc/*/maps %d\n", result? 1: 0);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -521,6 +522,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
+ kprintf("read /proc/*/pagemap %d\n", result? 1: 0);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -573,6 +575,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
+ kprintf("read /proc/*/status %d\n", result? 1: 0);
|
||||
goto out;
|
||||
}
|
||||
range = lookup_process_memory_range(vm, 0, -1);
|
||||
diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||
index 7d4964e..6a9f3df 100644
|
||||
--- a/kernel/syscall.c
|
||||
+++ b/kernel/syscall.c
|
||||
@@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
||||
}
|
||||
|
||||
ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock);
|
||||
+ 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_FIXED) {
|
||||
/* clear specified address range */
|
||||
@@ -9617,6 +9629,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()
|
||||
{
|
||||
diff --git a/test/issues/452/C452.patch b/test/issues/452/C452.patch
|
||||
index 4393b4e..e69de29 100644
|
||||
--- a/test/issues/452/C452.patch
|
||||
+++ b/test/issues/452/C452.patch
|
||||
@@ -1,107 +0,0 @@
|
||||
-diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||
-index 5dd6243..709231d 100644
|
||||
---- a/arch/arm64/kernel/include/syscall_list.h
|
||||
-+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||
-@@ -128,6 +128,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 8ef9bd0..16361ea 100644
|
||||
---- a/arch/x86_64/kernel/include/syscall_list.h
|
||||
-+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||
-@@ -170,6 +170,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 32fb880..d45f734 100644
|
||||
---- a/kernel/include/process.h
|
||||
-+++ b/kernel/include/process.h
|
||||
-@@ -575,6 +575,7 @@ struct process {
|
||||
- int process_rank; /* Rank in partition */
|
||||
- int coredump_barrier_count, coredump_barrier_count2;
|
||||
- mcs_rwlock_lock_t coredump_lock; // lock for coredump
|
||||
-+ int debug_flags;
|
||||
- };
|
||||
-
|
||||
- /*
|
||||
-diff --git a/kernel/procfs.c b/kernel/procfs.c
|
||||
-index 35d4778..615b7ac 100644
|
||||
---- a/kernel/procfs.c
|
||||
-+++ b/kernel/procfs.c
|
||||
-@@ -446,6 +446,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
- else {
|
||||
- *result = -EAGAIN;
|
||||
- }
|
||||
-+ kprintf("read /proc/*/maps %d\n", result? 1: 0);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
-@@ -522,6 +523,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
- else {
|
||||
- *result = -EAGAIN;
|
||||
- }
|
||||
-+ kprintf("read /proc/*/pagemap %d\n", result? 1: 0);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
-@@ -574,6 +576,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
- else {
|
||||
- *result = -EAGAIN;
|
||||
- }
|
||||
-+ kprintf("read /proc/*/status %d\n", result? 1: 0);
|
||||
- goto out;
|
||||
- }
|
||||
- range = lookup_process_memory_range(vm, 0, -1);
|
||||
-diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||
-index 7d4964e..6a9f3df 100644
|
||||
---- a/kernel/syscall.c
|
||||
-+++ b/kernel/syscall.c
|
||||
-@@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
||||
- }
|
||||
-
|
||||
- ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock);
|
||||
-+ 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_FIXED) {
|
||||
- /* clear specified address range */
|
||||
-@@ -9617,6 +9629,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