diff --git a/kernel/host.c b/kernel/host.c index 6c3adf1a..9cdbf961 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -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; diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index b54e5f06..f3aeb53c 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -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 diff --git a/kernel/procfs.c b/kernel/procfs.c index 57917a4c..277dbfe0 100644 --- a/kernel/procfs.c +++ b/kernel/procfs.c @@ -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,14 +482,15 @@ 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); } - + ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock); - + ans = 0; goto end; } @@ -483,8 +511,18 @@ 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); @@ -495,7 +533,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket) } ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock); - + dprintf("/proc/pagemap: 0x%lx - 0x%lx, count: %d\n", start, end, count); @@ -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; +} diff --git a/test/issues/452/C452.patch b/test/issues/452/C452.patch new file mode 100644 index 00000000..61acab59 --- /dev/null +++ b/test/issues/452/C452.patch @@ -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() +- { diff --git a/test/issues/452/C452.sh b/test/issues/452/C452.sh new file mode 100644 index 00000000..79740270 --- /dev/null +++ b/test/issues/452/C452.sh @@ -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 diff --git a/test/issues/452/C452T01.c b/test/issues/452/C452T01.c new file mode 100644 index 00000000..49e15d95 --- /dev/null +++ b/test/issues/452/C452T01.c @@ -0,0 +1,40 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +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); +} diff --git a/test/issues/452/C452_arm64.txt b/test/issues/452/C452_arm64.txt index bc234e43..458be374 100644 --- a/test/issues/452/C452_arm64.txt +++ b/test/issues/452/C452_arm64.txt @@ -1,23 +1,26 @@ -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 -000000420000-000000430000 rw-s 0 0:0 0 -080000000000-080000020000 r-xs 0 0:0 0 -080000020000-080000030000 r--s 0 0:0 0 -080000030000-080000040000 rw-s 0 0:0 0 -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 -3fffff800000-400000000000 rw-p 0 0:0 0 [stack] +000000400000-000000410000 r-xs 0 0:0 0 +000000410000-000000420000 r--s 0 0:0 0 +000000420000-000000430000 rw-s 0 0:0 0 +080000000000-080000020000 r-xs 0 0:0 0 +080000020000-080000030000 r--s 0 0:0 0 +080000030000-080000040000 rw-s 0 0:0 0 +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] +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 *** C452T02: mmap01 PASS (1) @@ -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 diff --git a/test/issues/452/C452_x86_64.txt b/test/issues/452/C452_x86_64.txt index 5125111e..97d70a64 100644 --- a/test/issues/452/C452_x86_64.txt +++ b/test/issues/452/C452_x86_64.txt @@ -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 diff --git a/test/issues/452/Makefile b/test/issues/452/Makefile new file mode 100644 index 00000000..db3d5308 --- /dev/null +++ b/test/issues/452/Makefile @@ -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 diff --git a/test/issues/452/README b/test/issues/452/README new file mode 100644 index 00000000..b35b1c9f --- /dev/null +++ b/test/issues/452/README @@ -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 していることを確認。