Files
mckernel/test/issues/452/C452.patch
Tomoki Shirasawa ed21b6849d procfs: if memory_range_lock fails, process later
Change-Id: I3c5f24548455a63d8d5a4482f5081347f631885a
Refs: #452
2019-12-05 07:08:13 +00:00

220 lines
6.6 KiB
Diff

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()
- {