procfs: if memory_range_lock fails, process later

Change-Id: I3c5f24548455a63d8d5a4482f5081347f631885a
Refs: #452
This commit is contained in:
Tomoki Shirasawa
2019-11-15 15:52:01 +09:00
committed by Masamichi Takagi
parent 37605740a4
commit ed21b6849d
10 changed files with 561 additions and 102 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;
}

219
test/issues/452/C452.patch Normal file
View 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
View 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
View 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);
}

View File

@ -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

View File

@ -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
View 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
View 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 していることを確認。