diff --git a/test/issues/840/C840.sh b/test/issues/840/C840.sh index 39b174cc..ed6b6fa2 100644 --- a/test/issues/840/C840.sh +++ b/test/issues/840/C840.sh @@ -1,152 +1,234 @@ #!/bin/sh +BIN= +SBIN= +BOOTPARAM="-c 1-7 -m 4G@0" + if ! sudo ls /sys/kernel/debug | grep kmemleak > /dev/null 2>&1; then echo kmemleak: not found >&2 exit 1 fi -echo 'C840T01... ' -ng=0 +if [ -f ../../../config.h ]; then + str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'` + eval $str +fi + +if [ -f ../../../Makefile ]; then + str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'` + eval $str +fi + +if [ "x$BINDIR" = x ];then + BINDIR="$BIN" +fi + +if [ "x$SBINDIR" = x ];then + SBINDIR="$SBIN" +fi + +if lsmod | grep mcctrl > /dev/null 2>&1; then + sudo $SBINDIR/mcstop+release.sh +fi + +dd if=/dev/zero of=rpf.data bs=1M count=1024 sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -./mcexec ./C840T01 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T01: NG (kmemleak)' - ng=1 -fi -if ! dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T01: WARN (remote_page_fault)' - ng=1 -fi -if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T01: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T01: OK -fi + +echo 'C840T01... ' +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + $BINDIR/mcexec ./C840T01 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" = x ]; then + echo '*** C840T01: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" = x ]; then + echo '*** C840T01: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T01.kmemleak | grep 'mcctrl'; then + echo '*** C840T01: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T01: OK' + b=1 + fi +done echo 'C840T02... ' -ng=0 -sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -./mcexec ./C840T02 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T02: NG (kmemleak)' - ng=1 -fi -if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T02: WARN (remote_page_fault)' - ng=1 -fi -if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T02: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T02: OK -fi +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + $BINDIR/mcexec ./C840T02 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" != x ]; then + echo '*** C840T02: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" = x ]; then + echo '*** C840T02: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T02.kmemleak | grep 'mcctrl'; then + echo '*** C840T02: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T02: OK' + b=1 + fi +done echo 'C840T03... ' -ng=0 -sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -./mcexec ./C840T03 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T03: NG (kmemleak)' - ng=1 -fi -if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T03: WARN (remote_page_fault)' - ng=1 -fi -if ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T03: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T03: OK -fi +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + $BINDIR/mcexec ./C840T03 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" != x ]; then + echo '*** C840T03: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" != x ]; then + echo '*** C840T03: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T03.kmemleak | grep 'mcctrl'; then + echo '*** C840T03: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T03: OK' + b=1 + fi +done echo 'C840T04... ' -ng=0 -sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -timeout -s 9 2 ./mcexec ./C840T04 -sleep 2 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T04: NG (kmemleak)' - ng=1 -fi -if ! dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T04: WARN (remote_page_fault)' - ng=1 -fi -if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T04: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T04: OK -fi +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + timeout -s 9 2 $BINDIR/mcexec ./C840T04 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" = x ]; then + echo '*** C840T04: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" = x ]; then + echo '*** C840T04: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T04.kmemleak | grep 'mcctrl'; then + echo '*** C840T04: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T04: OK' + b=1 + fi +done echo 'C840T05... ' -ng=0 -sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -timeout -s 9 2 ./mcexec ./C840T05 -sleep 2 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T05: NG (kmemleak)' - ng=1 -fi -if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T05: WARN (remote_page_fault)' - ng=1 -fi -if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T05: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T05: OK -fi +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + timeout -s 9 2 $BINDIR/mcexec ./C840T05 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" != x ]; then + echo '*** C840T05: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" = x ]; then + echo '*** C840T05: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T05.kmemleak | grep 'mcctrl'; then + echo '*** C840T05: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T05: OK' + b=1 + fi +done echo 'C840T06... ' -ng=0 -sync -sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 -./ihkosctl 0 clear_kmsg -sudo dmesg -c > /dev/null -sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' -timeout -s 9 2 ./mcexec ./C840T06 -sleep 2 -if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then - echo 'C840T06: NG (kmemleak)' - ng=1 -fi -if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then - echo 'C840T06: WARN (remote_page_fault)' - ng=1 -fi -if ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then - echo 'C840T06: WARN (syscall offloading)' - ng=1 -fi -if [ $ng = 0 ]; then - echo C840T06: OK -fi +b= +while [ x$b = x ]; do + ng=0 + sync + sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 + sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' + sudo $SBINDIR/mcreboot.sh $BOOTPARAM + $SBINDIR/ihkosctl 0 clear_kmsg + sudo dmesg -c > /dev/null + timeout -s 9 2 $BINDIR/mcexec ./C840T06 + sleep 3 + rpf=`dmesg | grep 'remote_page_fault:interrupted. -512'` + offload=` $SBINDIR/ihkosctl 0 kmsg | grep 'is dead, terminate()'` + sudo $SBINDIR/mcstop+release.sh + sudo sh -c 'echo scan > /sys/kernel/debug/kmemleak' + if [ x"$rpf" != x ]; then + echo '*** C840T06: WARN (remote_page_fault)' + ng=1 + elif [ x"$offload" != x ]; then + echo '*** C840T06: WARN (syscall offloading)' + ng=1 + elif sudo cat /sys/kernel/debug/kmemleak | tee C840T06.kmemleak | grep 'mcctrl'; then + echo '*** C840T06: NG (kmemleak)' + ng=1 + b=1 + fi + if [ $ng = 0 ]; then + echo '*** C840T06: OK' + b=1 + fi +done + +rm -f rpf.data rpf.out diff --git a/test/issues/840/C840.txt b/test/issues/840/C840.txt index 7795e8f6..4f8ddc72 100644 --- a/test/issues/840/C840.txt +++ b/test/issues/840/C840.txt @@ -1,28 +1,40 @@ -スクリプトは Wed Jun 6 14:38:21 2018 - に開始しました[?1034hbash-4.2$ sh C840.sh +Script started on Thu Jul 5 15:32:52 2018 +[?1034hbash-4.2$ make test +gcc -o C840T01 C840T01.c -Wall -g +gcc -o C840T02 C840T02.c -Wall -g +gcc -o C840T03 C840T03.c -Wall -g +gcc -o C840T04 C840T04.c -Wall -g +gcc -o C840T05 C840T05.c -Wall -g +gcc -o C840T06 C840T06.c -Wall -g +sh ./C840.sh +1024+0 records in +1024+0 records out +1073741824 bytes (1.1 GB) copied, 23.8845 s, 45.0 MB/s C840T01... Terminate by signal 9 -C840.sh: 14 行: 22464 強制終了 ./mcexec ./C840T01 -C840T01: OK +./C840.sh: line 67: 8889 Killed $BINDIR/mcexec ./C840T01 +*** C840T01: WARN (remote_page_fault) +Terminate by signal 9 +./C840.sh: line 67: 9231 Killed $BINDIR/mcexec ./C840T01 +*** C840T01: OK C840T02... Terminate by signal 9 -C840.sh: 38 行: 22500 強制終了 ./mcexec ./C840T02 -C840T02: OK +./C840.sh: line 100: 9580 Killed $BINDIR/mcexec ./C840T02 +*** C840T02: OK C840T03... Terminate by signal 9 -C840.sh: 62 行: 22535 強制終了 ./mcexec ./C840T03 -C840T03: OK +./C840.sh: line 133: 9949 Killed $BINDIR/mcexec ./C840T03 +*** C840T03: OK C840T04... -C840.sh: 86 行: 22570 強制終了 timeout -s 9 2 ./mcexec ./C840T04 -C840T04: OK +./C840.sh: line 166: 10301 Killed timeout -s 9 2 $BINDIR/mcexec ./C840T04 +*** C840T04: OK C840T05... -C840.sh: 111 行: 22598 強制終了 timeout -s 9 2 ./mcexec ./C840T05 -C840T05: OK +./C840.sh: line 199: 10644 Killed timeout -s 9 2 $BINDIR/mcexec ./C840T05 +*** C840T05: OK C840T06... -C840.sh: 136 行: 22626 強制終了 timeout -s 9 2 ./mcexec ./C840T06 -C840T06: OK +./C840.sh: line 232: 10975 Killed timeout -s 9 2 $BINDIR/mcexec ./C840T06 +*** C840T06: OK bash-4.2$ exit exit -スクリプトは Wed Jun 6 14:38:51 2018 - に終了しました \ No newline at end of file +Script done on Thu Jul 5 15:46:17 2018 diff --git a/test/issues/840/Makefile b/test/issues/840/Makefile new file mode 100644 index 00000000..7d3f0f1a --- /dev/null +++ b/test/issues/840/Makefile @@ -0,0 +1,33 @@ +CC=gcc +TARGET= C840T01 \ + C840T02 \ + C840T03 \ + C840T04 \ + C840T05 \ + C840T06 + +all:: $(TARGET) + +C840T01: C840T01.c + $(CC) -o C840T01 C840T01.c -Wall -g + +C840T02: C840T02.c + $(CC) -o C840T02 C840T02.c -Wall -g + +C840T03: C840T03.c + $(CC) -o C840T03 C840T03.c -Wall -g + +C840T04: C840T04.c + $(CC) -o C840T04 C840T04.c -Wall -g + +C840T05: C840T05.c + $(CC) -o C840T05 C840T05.c -Wall -g + +C840T06: C840T06.c + $(CC) -o C840T06 C840T06.c -Wall -g + +test:: $(TARGET) + sh ./C840.sh + +clean:: + rm -f *.o $(TARGET) *.kmemleak rpf.data rpf.out diff --git a/test/issues/840/README b/test/issues/840/README new file mode 100644 index 00000000..6c874602 --- /dev/null +++ b/test/issues/840/README @@ -0,0 +1,28 @@ +【Issue#840 動作確認】 +□ テスト内容 +以下の条件のとき、mcctrlのシステムコール処理でメモリリークしないことを確認。 +C840T01 オフロード中のシステムコールでRPF処理中にMcKプロセスがSIGKILLを受ける +C840T02 オフロード中のシステムコールでRPF処理外にMcKプロセスがSIGKILLを受ける +C840T03 システムコールオフロードしていないときにMcKプロセスがSIGKILLを受ける +C840T04 オフロード中のシステムコールでRPF処理中にmcexecがSIGKILLを受ける +C840T05 オフロード中のシステムコールでRPF処理外にmcexecがSIGKILLを受ける +C840T06 システムコールオフロードしていないときにmcexecがSIGKILLを受ける + +□ 実行手順 +$ make test + +実行できない場合は、C840.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス + +※注意 +・メモリリークのテストのため、kmemleakが使用可能なLinuxカーネルを用いること。 + kmemleakが使用不可の場合、make testは実行できない。 +・シグナルを受けるタイミングによっては、テスト条件を満たさないことがある + (WARNINGを表示)。 + WARNINGの場合、make testはテスト条件を満たすまで当該テストを繰り返す。 + +□ 実行結果 +C840.txt 参照。 +全ての項目が OK となっていることを確認。 +