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
@ -601,6 +601,20 @@ extern unsigned long do_kill(struct thread *, int, int, int, struct siginfo *, i
|
||||
extern void terminate_host(int pid);
|
||||
extern void debug_log(long);
|
||||
|
||||
void send_procfs_answer(struct ikc_scd_packet *packet, int err)
|
||||
{
|
||||
struct ikc_scd_packet pckt;
|
||||
struct ihk_ikc_channel_desc *resp_channel = cpu_local_var(ikc2linux);
|
||||
|
||||
pckt.msg = SCD_MSG_PROCFS_ANSWER;
|
||||
pckt.ref = packet->ref;
|
||||
pckt.arg = packet->arg;
|
||||
pckt.err = err;
|
||||
pckt.reply = packet->reply;
|
||||
pckt.pid = packet->pid;
|
||||
syscall_channel_send(resp_channel, &pckt);
|
||||
}
|
||||
|
||||
static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
||||
void *__packet, void *ihk_os)
|
||||
{
|
||||
@ -745,13 +759,7 @@ out_remote_pf:
|
||||
|
||||
case SCD_MSG_PROCFS_REQUEST:
|
||||
case SCD_MSG_PROCFS_RELEASE:
|
||||
pckt.msg = SCD_MSG_PROCFS_ANSWER;
|
||||
pckt.ref = packet->ref;
|
||||
pckt.arg = packet->arg;
|
||||
pckt.err = process_procfs_request(packet);
|
||||
pckt.reply = packet->reply;
|
||||
pckt.pid = packet->pid;
|
||||
syscall_channel_send(resp_channel, &pckt);
|
||||
process_procfs_request(packet);
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
|
||||
@ -412,6 +412,7 @@ struct procfs_file {
|
||||
};
|
||||
|
||||
int process_procfs_request(struct ikc_scd_packet *rpacket);
|
||||
void send_procfs_answer(struct ikc_scd_packet *packet, int err);
|
||||
|
||||
#define RUSAGE_SELF 0
|
||||
#define RUSAGE_CHILDREN -1
|
||||
|
||||
@ -38,6 +38,7 @@
|
||||
extern int snprintf(char *buf, size_t size, const char *fmt, ...);
|
||||
extern int sscanf(const char * buf, const char * fmt, ...);
|
||||
extern int scnprintf(char * buf, size_t size, const char *fmt, ...);
|
||||
static int do_procfs_backlog(void *arg);
|
||||
|
||||
struct mckernel_procfs_buffer {
|
||||
unsigned long next_pa;
|
||||
@ -148,12 +149,28 @@ procfs_delete_thread(struct thread *thread)
|
||||
procfs_thread_ctl(thread, SCD_MSG_PROCFS_TID_DELETE);
|
||||
}
|
||||
|
||||
static int procfs_backlog(struct process_vm *vm, struct ikc_scd_packet *rpacket)
|
||||
{
|
||||
void *arg;
|
||||
int err;
|
||||
|
||||
if (!(arg = kmalloc(sizeof(struct ikc_scd_packet), IHK_MC_AP_NOWAIT))) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(arg, rpacket, sizeof(struct ikc_scd_packet));
|
||||
if ((err = add_backlog(do_procfs_backlog, arg))) {
|
||||
kfree(arg);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief The callback function for mckernel procfs files.
|
||||
*
|
||||
* \param rarg returned argument
|
||||
*/
|
||||
int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||
{
|
||||
unsigned long rarg = rpacket->arg;
|
||||
unsigned long parg, pbuf;
|
||||
@ -419,7 +436,17 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
if (strcmp(p, "maps") == 0) {
|
||||
struct vm_range *range;
|
||||
|
||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
||||
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||
if (!result) {
|
||||
if ((err = procfs_backlog(vm, rpacket))) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
range = lookup_process_memory_range(vm, 0, -1);
|
||||
while (range) {
|
||||
@ -455,7 +482,8 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
|
||||
if (ans < 0 || ans > count ||
|
||||
buf_add(&buf_top, &buf_cur, buf, ans) < 0) {
|
||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||
ihk_mc_spinlock_unlock_noirq(
|
||||
&vm->memory_range_lock);
|
||||
goto err;
|
||||
}
|
||||
range = next_process_memory_range(vm, range);
|
||||
@ -484,7 +512,17 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
start = (offset / sizeof(uint64_t)) << PAGE_SHIFT;
|
||||
end = start + ((count / sizeof(uint64_t)) << PAGE_SHIFT);
|
||||
|
||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
||||
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||
if (!result) {
|
||||
if ((err = procfs_backlog(vm, rpacket))) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (start < end) {
|
||||
*_buf = ihk_mc_pt_virt_to_pagemap(proc->vm->address_space->page_table, start);
|
||||
@ -526,14 +564,24 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ihk_mc_spinlock_lock_noirq(&proc->vm->memory_range_lock);
|
||||
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||
if (!result) {
|
||||
if ((err = procfs_backlog(vm, rpacket))) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*result = -EAGAIN;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
range = lookup_process_memory_range(vm, 0, -1);
|
||||
while (range) {
|
||||
if(range->flag & VR_LOCKED)
|
||||
lockedsize += range->end - range->start;
|
||||
range = next_process_memory_range(vm, range);
|
||||
}
|
||||
ihk_mc_spinlock_unlock_noirq(&proc->vm->memory_range_lock);
|
||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||
|
||||
cpu_bitmask = &bitmasks[bitmasks_offset];
|
||||
bitmasks_offset += bitmap_scnprintf(cpu_bitmask,
|
||||
@ -786,6 +834,9 @@ end:
|
||||
if (r->pbuf == PA_NULL && buf_top)
|
||||
r->pbuf = virt_to_phys(buf_top);
|
||||
err:
|
||||
send_procfs_answer(rpacket, err);
|
||||
|
||||
out:
|
||||
if (vbuf) {
|
||||
ihk_mc_unmap_virtual(vbuf, npages);
|
||||
ihk_mc_unmap_memory(NULL, pbuf, r->count);
|
||||
@ -807,3 +858,20 @@ err:
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||
{
|
||||
return _process_procfs_request(rpacket, NULL);
|
||||
}
|
||||
|
||||
static int do_procfs_backlog(void *arg)
|
||||
{
|
||||
struct ikc_scd_packet *rpacket = arg;
|
||||
int result = 0;
|
||||
|
||||
_process_procfs_request(rpacket, &result);
|
||||
if (!result) {
|
||||
kfree(arg);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
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()
|
||||
- {
|
||||
25
test/issues/452/C452.sh
Normal file
25
test/issues/452/C452.sh
Normal file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
USELTP=1
|
||||
USEOSTEST=0
|
||||
|
||||
. ../../common.sh
|
||||
|
||||
################################################################################
|
||||
$MCEXEC ./C452T01
|
||||
|
||||
for i in mmap01:02 mmap02:03 mmap03:04 mmap04:05 mmap12:06 brk01:07 fork01:08 \
|
||||
fork02:09 fork03:10 mremap04:11 mremap05:12 munmap01:13 shmat01:14 \
|
||||
shmdt01:15 mlock01:16 mlock04:17 execve01:18 exit01:19 exit02:20 \
|
||||
exit_group01:21 mprotect02:22 mprotect03:23 msync01:24 msync02:25 \
|
||||
munlock01:26 remap_file_pages01:27 remap_file_pages01:28; do
|
||||
tp=`echo $i|sed 's/:.*//'`
|
||||
id=`echo $i|sed 's/.*://'`
|
||||
sudo PATH=$PATH:$LTPBIN $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
|
||||
ok=`grep TPASS $tp.txt | wc -l`
|
||||
ng=`grep TFAIL $tp.txt | wc -l`
|
||||
if [ $ng = 0 ]; then
|
||||
echo "*** C452T$id: $tp PASS ($ok)"
|
||||
else
|
||||
echo "*** C452T$id: $tp FAIL (ok=$ok ng=%ng)"
|
||||
fi
|
||||
done
|
||||
40
test/issues/452/C452T01.c
Normal file
40
test/issues/452/C452T01.c
Normal file
@ -0,0 +1,40 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
pid_t pid;
|
||||
int st;
|
||||
|
||||
fprintf(stderr, "*** C452T01 test start\n");
|
||||
fflush(stderr);
|
||||
pid = fork();
|
||||
if (pid == 0) {
|
||||
char file[32];
|
||||
|
||||
sleep(1);
|
||||
sprintf(file, "/proc/%d/maps", getppid());
|
||||
execlp("cat", "cat", file, NULL);
|
||||
exit(1);
|
||||
}
|
||||
fflush(stdout);
|
||||
if (syscall(740, 1) == -1) {
|
||||
fprintf(stderr, "*** C452T01 FAIL no patched kernel\n");
|
||||
exit(1);
|
||||
}
|
||||
mmap(NULL, 4096, PROT_READ|PROT_WRITE,
|
||||
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
||||
syscall(740, 0);
|
||||
while (waitpid(pid, &st, 0) == -1 && errno == EINTR)
|
||||
;
|
||||
fprintf(stderr, "*** C452T01 PASS\n");
|
||||
exit(0);
|
||||
}
|
||||
@ -1,8 +1,11 @@
|
||||
Script started on Thu 26 Sep 2019 10:31:51 AM JST
|
||||
Script started on 2019-11-15 06:32:44+00:00
|
||||
bash-4.4$ uname -m
|
||||
aarch64
|
||||
bash-4.4$ make test
|
||||
gcc -g -Wall -o C452T01 C452T01.c
|
||||
sh ./C452.sh
|
||||
mcstop+release.sh ... done
|
||||
mcreboot.sh -c 1-6,29-34 -m 50G@0,50G@1 -r 1-6:0+29-34:28 -O ... done
|
||||
mcreboot.sh -c 2-7,10-15 -m 2G@0 ... done
|
||||
*** C452T01 test start
|
||||
000000400000-000000410000 r-xs 0 0:0 0
|
||||
000000410000-000000420000 r--s 0 0:0 0
|
||||
@ -13,10 +16,10 @@ mcreboot.sh -c 1-6,29-34 -m 50G@0,50G@1 -r 1-6:0+29-34:28 -O ... done
|
||||
0ffffffe0000-100000000000 rw-p 0 0:0 0
|
||||
100000000000-100000010000 r--s 0 0:0 0 [vsyscall]
|
||||
100000010000-100000020000 r-xs 0 0:0 0 [vdso]
|
||||
100000040000-1000001b0000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
1000001b0000-1000001c0000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
1000001c0000-1000001d0000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
1000001d0000-1000001e0000 rw-p 0 0:0 0
|
||||
100000030000-100000190000 r-xp 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||
100000190000-1000001a0000 r--p 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||
1000001a0000-1000001b0000 rw-p 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||
1000001b0000-1000001c0000 rw-p 0 0:0 0
|
||||
3fffff800000-400000000000 rw-p 0 0:0 0 [stack]
|
||||
*** C452T01 PASS
|
||||
mmap01 1 TPASS : Functionality of mmap() successful
|
||||
@ -27,33 +30,19 @@ mmap03 1 TPASS : mmap() functionality is correct
|
||||
*** C452T04: mmap03 PASS (1)
|
||||
mmap04 1 TPASS : Functionality of mmap() successful
|
||||
*** C452T05: mmap04 PASS (1)
|
||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
||||
mmap12.c:103: INFO: All pages are present
|
||||
mmap12.c:127: PASS: File mapped properly
|
||||
|
||||
Summary:
|
||||
passed 1
|
||||
failed 0
|
||||
skipped 0
|
||||
warnings 0
|
||||
*** C452T06: mmap12 PASS (0)
|
||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
||||
brk01.c:67: PASS: brk() works fine
|
||||
|
||||
Summary:
|
||||
passed 1
|
||||
failed 0
|
||||
skipped 0
|
||||
warnings 0
|
||||
*** C452T07: brk01 PASS (0)
|
||||
fork01 1 TPASS : fork() returned 9892
|
||||
fork01 2 TPASS : child pid and fork() return agree: 9892
|
||||
mmap12 1 TPASS : Functionality of mmap() successful
|
||||
*** C452T06: mmap12 PASS (1)
|
||||
brk01 1 TPASS : brk(543512330) returned 0, new size verified by sbrk
|
||||
*** C452T07: brk01 PASS (1)
|
||||
fork01 1 TPASS : fork() returned 4922
|
||||
fork01 2 TPASS : child pid and fork() return agree: 4922
|
||||
*** C452T08: fork01 PASS (2)
|
||||
fork02 0 TINFO : Inside parent
|
||||
fork02 0 TINFO : Inside child
|
||||
fork02 0 TINFO : exit status of wait 0
|
||||
fork02 1 TPASS : test 1 PASSED
|
||||
*** C452T09: fork02 PASS (1)
|
||||
fork03 0 TINFO : process id in parent of child from fork : 9979
|
||||
fork03 0 TINFO : process id in parent of child from fork : 5008
|
||||
fork03 1 TPASS : test 1 PASSED
|
||||
*** C452T10: fork03 PASS (1)
|
||||
mremap04 1 TPASS : mremap() failed, 'MREMAP_MAYMOVE flag unset', errno 12
|
||||
@ -68,18 +57,11 @@ mremap05 7 TPASS : mremap #2 value OK
|
||||
*** C452T12: mremap05 PASS (7)
|
||||
munmap01 1 TPASS : Functionality of munmap() successful
|
||||
*** C452T13: munmap01 PASS (1)
|
||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
||||
shmat01.c:147: PASS: shmat() succeeded to attach NULL address
|
||||
shmat01.c:147: PASS: shmat() succeeded to attach aligned address
|
||||
shmat01.c:147: PASS: shmat() succeeded to attach unaligned address with SHM_RND
|
||||
shmat01.c:147: PASS: shmat() succeeded to attach aligned address with SHM_READONLY, and got SIGSEGV on write
|
||||
|
||||
Summary:
|
||||
passed 4
|
||||
failed 0
|
||||
skipped 0
|
||||
warnings 0
|
||||
*** C452T14: shmat01 PASS (0)
|
||||
shmat01 1 TPASS : conditions and functionality are correct
|
||||
shmat01 2 TPASS : conditions and functionality are correct
|
||||
shmat01 3 TPASS : conditions and functionality are correct
|
||||
shmat01 4 TPASS : conditions and functionality are correct
|
||||
*** C452T14: shmat01 PASS (4)
|
||||
shmdt01 1 TPASS : shared memory detached correctly
|
||||
*** C452T15: shmdt01 PASS (1)
|
||||
mlock01 1 TPASS : mlock passed
|
||||
@ -87,29 +69,16 @@ mlock01 2 TPASS : mlock passed
|
||||
mlock01 3 TPASS : mlock passed
|
||||
mlock01 4 TPASS : mlock passed
|
||||
*** C452T16: mlock01 PASS (4)
|
||||
mlock04 0 TINFO : locked 40960 bytes from 0x1000001d0000
|
||||
mlock04 0 TINFO : locked 40960 bytes from 0x1000001b0000
|
||||
mlock04 1 TPASS : test succeeded.
|
||||
*** C452T17: mlock04 PASS (1)
|
||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
||||
execve01_child.c:46: PASS: execve01_child executed
|
||||
|
||||
Summary:
|
||||
passed 1
|
||||
failed 0
|
||||
skipped 0
|
||||
warnings 0
|
||||
*** C452T18: execve01 PASS (0)
|
||||
execl01_child 1 TPASS : execve01_child executed
|
||||
execve01 0 TINFO : Child process returned TPASS
|
||||
*** C452T18: execve01 PASS (2)
|
||||
exit01 1 TPASS : exit() test PASSED
|
||||
*** C452T19: exit01 PASS (1)
|
||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
||||
exit02.c:59: PASS: File written by child read back correctly
|
||||
|
||||
Summary:
|
||||
passed 1
|
||||
failed 0
|
||||
skipped 0
|
||||
warnings 0
|
||||
*** C452T20: exit02 PASS (0)
|
||||
exit02 1 TPASS : exit() test PASSED
|
||||
*** C452T20: exit02 PASS (1)
|
||||
exit_group01 1 TPASS : exit_group() succeeded
|
||||
*** C452T21: exit_group01 PASS (1)
|
||||
mprotect02 1 TPASS : got SIGSEGV as expected
|
||||
@ -133,5 +102,7 @@ remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||
*** C452T28: remap_file_pages01 PASS (2)
|
||||
bash-4.4$ exit
|
||||
exit
|
||||
|
||||
Script done on Thu 26 Sep 2019 10:32:32 AM JST
|
||||
Script done on 2019-11-15 06:33:24+00:00
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
Script started on Wed Jul 3 13:39:36 2019
|
||||
Script started on Fri Nov 15 15:35:46 2019
|
||||
bash-4.2$ uname -m
|
||||
x86_64
|
||||
bash-4.2$ make test
|
||||
gcc -g -Wall -o C452T01 C452T01.c
|
||||
sh ./C452.sh
|
||||
mcstop+release.sh ... done
|
||||
mcreboot.sh -c 1-7,17-23,9-15,25-31 -m 10G@0,10G@1 ... done
|
||||
mcreboot.sh -c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24 ... done
|
||||
*** C452T01 test start
|
||||
000000400000-000000401000 r-xs 0 0:0 0
|
||||
000000600000-000000601000 r--s 0 0:0 0
|
||||
@ -10,17 +13,17 @@ mcreboot.sh -c 1-7,17-23,9-15,25-31 -m 10G@0,10G@1 ... done
|
||||
155555600000-155555622000 r-xs 0 0:0 0
|
||||
155555821000-155555822000 r--s 0 0:0 0
|
||||
155555822000-155555824000 rw-s 0 0:0 0
|
||||
2aaaaa9f8000-2aaaaaa00000 rw-p 0 0:0 0
|
||||
2aaaaa9fc000-2aaaaaa00000 rw-p 0 0:0 0
|
||||
2aaaaaa00000-2aaaaaa02000 r-xs 0 0:0 0 [vdso]
|
||||
2aaaaaa02000-2aaaaaa03000 rw-p 0 0:0 0
|
||||
2aaaaaa1a000-2aaaaaa1b000 rw-p 0 0:0 0
|
||||
2aaaaaa1b000-2aaaaabde000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaabde000-2aaaaaddd000 ---p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaaddd000-2aaaaade1000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaade1000-2aaaaade3000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaade3000-2aaaaade8000 rw-p 0 0:0 0
|
||||
2aaaaade8000-2aaaaadea000 rw-p 0 0:0 0
|
||||
2aaaaadea000-2aaaaadeb000 rw-p 0 0:0 0
|
||||
2aaaaaa1b000-2aaaaaa1c000 rw-p 0 0:0 0
|
||||
2aaaaaa1c000-2aaaaabdf000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaabdf000-2aaaaadde000 ---p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaadde000-2aaaaade2000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaade2000-2aaaaade4000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||
2aaaaade4000-2aaaaade9000 rw-p 0 0:0 0
|
||||
2aaaaade9000-2aaaaadeb000 rw-p 0 0:0 0
|
||||
2aaaaadeb000-2aaaaadec000 rw-p 0 0:0 0
|
||||
547fff800000-548000000000 rw-p 0 0:0 0 [stack]
|
||||
*** C452T01 PASS
|
||||
mmap01 1 TPASS : Functionality of mmap() successful
|
||||
@ -35,18 +38,75 @@ mmap12 1 TPASS : Functionality of mmap() successful
|
||||
*** C452T06: mmap12 PASS (1)
|
||||
brk01 1 TPASS : brk(8626060) returned 0, new size verified by sbrk
|
||||
*** C452T07: brk01 PASS (1)
|
||||
fork01 1 TPASS : fork() returned 19074
|
||||
fork01 2 TPASS : child pid and fork() return agree: 19074
|
||||
fork01 1 TPASS : fork() returned 25081
|
||||
fork01 2 TPASS : child pid and fork() return agree: 25081
|
||||
*** C452T08: fork01 PASS (2)
|
||||
fork02 0 TINFO : Inside parent
|
||||
fork02 0 TINFO : Inside child
|
||||
fork02 0 TINFO : exit status of wait 0
|
||||
fork02 1 TPASS : test 1 PASSED
|
||||
*** C452T09: fork02 PASS (1)
|
||||
fork03 0 TINFO : process id in parent of child from fork : 19223
|
||||
fork03 0 TINFO : process id in parent of child from fork : 25231
|
||||
fork03 1 TPASS : test 1 PASSED
|
||||
*** C452T10: fork03 PASS (1)
|
||||
mremap04 1 TPASS : mremap() failed, 'MREMAP_MAYMOVE flag unset', errno 12
|
||||
*** C452T11: mremap04 PASS (1)
|
||||
mremap05 1 TPASS : MREMAP_FIXED requires MREMAP_MAYMOVE
|
||||
mremap05 2 TPASS : new_addr has to be page aligned
|
||||
mremap05 3 TPASS : old/new area must not overlap
|
||||
mremap05 4 TPASS : mremap #1
|
||||
mremap05 5 TPASS : mremap #1 value OK
|
||||
mremap05 6 TPASS : mremap #2
|
||||
mremap05 7 TPASS : mremap #2 value OK
|
||||
*** C452T12: mremap05 PASS (7)
|
||||
munmap01 1 TPASS : Functionality of munmap() successful
|
||||
*** C452T13: munmap01 PASS (1)
|
||||
shmat01 1 TPASS : conditions and functionality are correct
|
||||
shmat01 2 TPASS : conditions and functionality are correct
|
||||
shmat01 3 TPASS : conditions and functionality are correct
|
||||
shmat01 4 TPASS : conditions and functionality are correct
|
||||
*** C452T14: shmat01 PASS (4)
|
||||
shmdt01 1 TPASS : shared memory detached correctly
|
||||
*** C452T15: shmdt01 PASS (1)
|
||||
mlock01 1 TPASS : mlock passed
|
||||
mlock01 2 TPASS : mlock passed
|
||||
mlock01 3 TPASS : mlock passed
|
||||
mlock01 4 TPASS : mlock passed
|
||||
*** C452T16: mlock01 PASS (4)
|
||||
mlock04 0 TINFO : locked 40960 bytes from 0x2aaaaadeb000
|
||||
mlock04 1 TPASS : test succeeded.
|
||||
*** C452T17: mlock04 PASS (1)
|
||||
execl01_child 1 TPASS : execve01_child executed
|
||||
execve01 0 TINFO : Child process returned TPASS
|
||||
*** C452T18: execve01 PASS (2)
|
||||
exit01 1 TPASS : exit() test PASSED
|
||||
*** C452T19: exit01 PASS (1)
|
||||
exit02 1 TPASS : exit() test PASSED
|
||||
*** C452T20: exit02 PASS (1)
|
||||
exit_group01 1 TPASS : exit_group() succeeded
|
||||
*** C452T21: exit_group01 PASS (1)
|
||||
mprotect02 1 TPASS : got SIGSEGV as expected
|
||||
mprotect02 2 TPASS : didn't get SIGSEGV
|
||||
*** C452T22: mprotect02 PASS (2)
|
||||
mprotect03 0 TINFO : received signal: SIGSEGV
|
||||
mprotect03 1 TPASS : SIGSEGV generated as expected
|
||||
*** C452T23: mprotect03 PASS (1)
|
||||
msync01 1 TPASS : Functionality of msync() successful
|
||||
*** C452T24: msync01 PASS (1)
|
||||
msync02 1 TPASS : Functionality of msync successful
|
||||
*** C452T25: msync02 PASS (1)
|
||||
munlock01 1 TPASS : test 0 passed length = 1
|
||||
munlock01 2 TPASS : test 1 passed length = 1024
|
||||
munlock01 3 TPASS : test 2 passed length = 1048576
|
||||
munlock01 4 TPASS : test 3 passed length = 10485760
|
||||
*** C452T26: munlock01 PASS (4)
|
||||
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||
*** C452T27: remap_file_pages01 PASS (2)
|
||||
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||
*** C452T28: remap_file_pages01 PASS (2)
|
||||
bash-4.2$ exit
|
||||
exit
|
||||
|
||||
Script done on Wed Jul 3 13:39:53 2019
|
||||
Script done on Fri Nov 15 15:36:14 2019
|
||||
|
||||
13
test/issues/452/Makefile
Normal file
13
test/issues/452/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
CC = gcc
|
||||
TARGET = C452T01
|
||||
|
||||
all:: $(TARGET)
|
||||
|
||||
C452T01: C452T01.c
|
||||
$(CC) -g -Wall -o $@ $^
|
||||
|
||||
test:: all
|
||||
sh ./C452.sh
|
||||
|
||||
clean::
|
||||
rm -f $(TARGET) *.o
|
||||
54
test/issues/452/README
Normal file
54
test/issues/452/README
Normal file
@ -0,0 +1,54 @@
|
||||
【Issue#452 動作確認】
|
||||
□ テスト内容
|
||||
1. Issue 指摘事項の再現確認
|
||||
以下のパッチ (C452.patch) を McKernel に適用し、意図的に memory_range_lock の
|
||||
競合を起こすことでテストを容易にする。
|
||||
- mmap処理のmemory_range_lock取得中にsleep可能とする
|
||||
- mmap処理のmemory_range_lock取得中にsleepするかどうかを制御する
|
||||
システムコールを追加する
|
||||
このパッチ適用カーネルを使ってテストする。
|
||||
|
||||
C452T01 memory_range_lock 取得中に /proc/*/maps を参照し、PASS すること
|
||||
|
||||
2. LTP を用いて既存処理に影響しないことを確認
|
||||
メモリ関連処理を変更したため、関連するシステムコールのテストを選定した。
|
||||
C452T02 mmap01: mmap の基本機能の確認
|
||||
C452T03 mmap02: mmap の基本機能の確認
|
||||
C452T04 mmap03: mmap の基本機能の確認
|
||||
C452T05 mmap04: mmap の基本機能の確認
|
||||
C452T06 mmap12: mmap の基本機能の確認
|
||||
C452T07 brk01: brk の基本機能の確認
|
||||
C452T08 fork01: fork の基本機能の確認 (fork時メモリがコピーされる)
|
||||
C452T09 fork02: fork の基本機能の確認
|
||||
C452T10 fork03: fork の基本機能の確認
|
||||
C452T11 mremap04: mremap の基本機能の確認
|
||||
C452T12 mremap05: mremap の基本機能の確認
|
||||
C452T13 munmap01: munmap の基本機能の確認
|
||||
C452T14 shmat01: shmat の基本機能の確認
|
||||
C452T15 shmdt01: shmdt の基本機能の確認
|
||||
C452T16 mlock01: mlock の基本機能の確認
|
||||
C452T17 mlock04: mlock の基本機能の確認
|
||||
C452T18 execve01: execve の基本機能の確認 (exec時、メモリ解放がある)
|
||||
C452T19 exit01: exit の基本機能の確認 (exit時、メモリ解放がある)
|
||||
C452T20 exit02: exit の基本機能の確認 (exit時、メモリ解放がある)
|
||||
C452T21 exit_group01: exit_group の基本機能の確認 (exit時、メモリ解放がある)
|
||||
C452T22 mprotect02: mprotect の基本機能の確認
|
||||
C452T23 mprotect03: mprotect の基本機能の確認
|
||||
C452T24 msync01: msync の基本機能の確認
|
||||
C452T25 msync02: msync の基本機能の確認
|
||||
C452T26 munlock01: munlock の基本機能の確認
|
||||
C452T27 remap_file_pages01: remap_file_pages の基本機能の確認
|
||||
C452T28 remap_file_pages02: remap_file_pages の基本機能の確認
|
||||
|
||||
□ 実行手順
|
||||
$ make test
|
||||
|
||||
McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を
|
||||
参照する。.mck_test_config は、McKernel をビルドした際に生成される
|
||||
mck_test_config.sample ファイルを $HOME にコピーし、適宜編集すること。
|
||||
|
||||
尚、テスト実行には C452.patch を適用した McKernel を使用すること。
|
||||
|
||||
□ 実行結果
|
||||
C452_x86_64.txt(x86_64実行結果)、C452_arm64.txt(arm64実行結果)参照。
|
||||
全ての項目が PASS していることを確認。
|
||||
Reference in New Issue
Block a user