From 9b3450ee7eff1fe40f2c57df54e8f41d53f7b018 Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Thu, 25 Jul 2019 13:52:23 +0900 Subject: [PATCH] syscall offload regardless of mcexec life and death Change-Id: I7db089993d3ee5ae6032f5085db2b67cef99fdfb Refs: #1321 --- kernel/syscall.c | 4 ---- test/issues/1321/C1321.sh | 29 +++++++++++++++++++++++ test/issues/1321/C1321.txt | 48 ++++++++++++++++++++++++++++++++++++++ test/issues/1321/Makefile | 14 +++++++++++ test/issues/1321/README | 37 +++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 test/issues/1321/C1321.sh create mode 100644 test/issues/1321/C1321.txt create mode 100644 test/issues/1321/Makefile create mode 100644 test/issues/1321/README diff --git a/kernel/syscall.c b/kernel/syscall.c index c613e439..222468fd 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -181,7 +181,6 @@ long do_syscall(struct syscall_request *req, int cpu) struct syscall_response res; long rc; struct thread *thread = cpu_local_var(current); - struct process *proc = thread->proc; struct ihk_os_cpu_monitor *monitor = cpu_local_var(monitor); int mstatus = 0; @@ -204,9 +203,6 @@ long do_syscall(struct syscall_request *req, int cpu) barrier(); if(req->number != __NR_exit_group){ - if (proc->nohost) {// host is down - return -EPIPE; - } ++thread->in_syscall_offload; } diff --git a/test/issues/1321/C1321.sh b/test/issues/1321/C1321.sh new file mode 100644 index 00000000..9a4bb5da --- /dev/null +++ b/test/issues/1321/C1321.sh @@ -0,0 +1,29 @@ +#!/bin/sh +USELTP=1 +USEOSTEST=0 + +. ../../common.sh + +################################################################################ +for i in fork01:01 fork02:02 fork03:03 exit01:04 exit02:05 exit_group01:06 \ + wait401:07 waitpid01:08 waitpid02:09 waitpid03:10; do + tp=`echo $i|sed 's/:.*//'` + id=`echo $i|sed 's/.*://'` + $IHKOSCTL 0 clear_kmsg + $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt + ok=`grep TPASS $tp.txt | wc -l` + ng=`grep TFAIL $tp.txt | wc -l` + err=`$IHKOSCTL 0 kmsg | grep fileobj_free | wc -l` + if [ $err != 0 ]; then + echo "--- C1321T$id: error" + $IHKOSCTL 0 kmsg | grep fileobj_free + ng=$((ng + 1)) + else + echo "--- C1321T$id: no error" + fi + if [ $ng = 0 ]; then + echo "*** C1321T$id: $tp PASS ($ok)" + else + echo "*** C1321T$id: $tp FAIL (ok=$ok ng=%ng)" + fi +done diff --git a/test/issues/1321/C1321.txt b/test/issues/1321/C1321.txt new file mode 100644 index 00000000..326f0904 --- /dev/null +++ b/test/issues/1321/C1321.txt @@ -0,0 +1,48 @@ +Script started on Tue Aug 6 16:36:14 2019 +bash-4.2$ make test +mcstop+release.sh ... 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 +fork01 1 TPASS : fork() returned 21466 +fork01 2 TPASS : child pid and fork() return agree: 21466 +--- C1321T01: no error +*** C1321T01: 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 +--- C1321T02: no error +*** C1321T02: fork02 PASS (1) +fork03 0 TINFO : process id in parent of child from fork : 21624 +fork03 1 TPASS : test 1 PASSED +--- C1321T03: no error +*** C1321T03: fork03 PASS (1) +exit01 1 TPASS : exit() test PASSED +--- C1321T04: no error +*** C1321T04: exit01 PASS (1) +exit02 1 TPASS : exit() test PASSED +--- C1321T05: no error +*** C1321T05: exit02 PASS (1) +exit_group01 1 TPASS : exit_group() succeeded +--- C1321T06: no error +*** C1321T06: exit_group01 PASS (1) +wait401 1 TPASS : Received child pid as expected. +wait401 2 TPASS : wait401 call succeeded +--- C1321T07: no error +*** C1321T07: wait401 PASS (2) +waitpid01 1 TPASS : recieved expected pid +waitpid01 2 TPASS : recieved expected signal +--- C1321T08: no error +*** C1321T08: waitpid01 PASS (2) +waitpid02 1 TPASS : recieved expected pid +waitpid02 2 TPASS : recieved expected signal +waitpid02 3 TPASS : recieved expected exit value +--- C1321T09: no error +*** C1321T09: waitpid02 PASS (3) +waitpid03 1 TPASS : Got correct child PID +waitpid03 2 TPASS : Condition 2 test passed +--- C1321T10: no error +*** C1321T10: waitpid03 PASS (2) +bash-4.2$ exit +exit + +Script done on Tue Aug 6 16:36:45 2019 diff --git a/test/issues/1321/Makefile b/test/issues/1321/Makefile new file mode 100644 index 00000000..b6cf13e9 --- /dev/null +++ b/test/issues/1321/Makefile @@ -0,0 +1,14 @@ +CC = gcc +TARGET= + +CPPFLAGS = +LDFLAGS = + +all: + +test: all + @sh ./C1321.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/issues/1321/README b/test/issues/1321/README new file mode 100644 index 00000000..aaa09fc8 --- /dev/null +++ b/test/issues/1321/README @@ -0,0 +1,37 @@ +【Issue#1321 動作確認】 +□ テスト内容 +プロセス終了時に先に終了しているmcexecに対してシステムコールオフロードの発行を +抑止していたため、以下のメッセージがkmsgに出力されていた。 +fileobj_free(xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx): free failed. -32 + +しかし、システムコールオフロードはmcctrlが処理するものも存在するため、単純に +抑止することはできない。上記メッセージはmcctrlが処理しないため出力されていた。 +Issue#1321 の対策では既にmcexecが終了していた場合でもシステムコールオフロードを +発行するようにした。尚、mcexecが処理すべきシステムコールオフロードはmcctrlに +よってエラーリターンするため、抑止しなくて問題無い。 + +このため、動作確認としてプロセス関連のLTPを使用して、プロセス終了が正常に行わ +れることと、file_objfreeのメッセージがkmsgに出力されないことを確認する。 + +C1321T01 fork01がPASSし、fileobj_freeのログが出力されないこと。 +C1321T02 fork02がPASSし、fileobj_freeのログが出力されないこと。 +C1321T03 fork03がPASSし、fileobj_freeのログが出力されないこと。 +C1321T04 exit01がPASSし、fileobj_freeのログが出力されないこと。 +C1321T05 exit02がPASSし、fileobj_freeのログが出力されないこと。 +C1321T06 exit_group01がPASSし、fileobj_freeのログが出力されないこと。 +C1321T07 wait401がPASSし、fileobj_freeのログが出力されないこと。 +C1321T08 waitpid01がPASSし、fileobj_freeのログが出力されないこと。 +C1321T09 waitpid02がPASSし、fileobj_freeのログが出力されないこと。 +C1321T10 waitpid03がPASSし、fileobj_freeのログが出力されないこと。 + +□ 実行手順 +$ make test + +McKernelのインストール先やLTPの配置場所は、$HOME/.mck_test_config を +参照している。 +.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample +ファイルを $HOME にコピーし、適宜編集する + +□ 実行結果 +C1321.txt 参照。 +すべての項目をPASSしていることを確認。