diff --git a/kernel/process.c b/kernel/process.c index e7ac6d56..d447fe95 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -3159,10 +3159,6 @@ void schedule(void) return; } -redo: - /* Reset for redo */ - switch_ctx = 0; - cpu_local_var(runq_irqstate) = ihk_mc_spinlock_lock(&(get_this_cpu_local_var()->runq_lock)); v = get_this_cpu_local_var(); @@ -3307,7 +3303,8 @@ redo: /* Have we migrated to another core meanwhile? */ if (v != get_this_cpu_local_var()) { - goto redo; + v = get_this_cpu_local_var(); + v->flags &= ~CPU_FLAG_NEED_RESCHED; } } else { diff --git a/test/issues/1027/C1027.sh b/test/issues/1027/C1027.sh new file mode 100644 index 00000000..845f370f --- /dev/null +++ b/test/issues/1027/C1027.sh @@ -0,0 +1,136 @@ +#!/bin/sh +BIN= +SBIN= +OSTEST= +LTP= +BOOTPARAM="-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" + +if [ -f ../../../config.h ]; then + str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'` + eval $str +fi +if [ "x$BINDIR" = x ];then + BINDIR="$BIN" +fi + +if [ -f ../../../Makefile ]; then + str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'` + eval $str +fi +if [ "x$SBINDIR" = x ];then + SBINDIR="$SBIN" +fi + +if [ -f $HOME/ostest/bin/test_mck ]; then + OSTESTDIR=$HOME/ostest/ +fi +if [ "x$OSTESTDIR" = x ]; then + OSTESTDIR="$OSTEST" +fi + +if [ -f $HOME/ltp/testcases/bin/fork01 ]; then + LTPDIR=$HOME/ltp/testcases +fi +if [ "x$LTPDIR" = x ]; then + LTPDIR="$LTP/testcases" +fi + +if [ ! -x $SBINDIR/mcstop+release.sh ]; then + echo mcstop+release: not found >&2 + exit 1 +fi +echo -n "mcstop+release.sh ... " +sudo $SBINDIR/mcstop+release.sh +echo "done" + +if [ ! -x $SBINDIR/mcreboot.sh ]; then + echo mcreboot: not found >&2 + exit 1 +fi +echo -n "mcreboot.sh $BOOTPARAM ... " +sudo $SBINDIR/mcreboot.sh $BOOTPARAM +echo "done" + +if [ ! -x $BINDIR/mcexec ]; then + echo mcexec: not found >&2 + exit 1 +fi + +tid=001 +echo "*** RT_$tid start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s sched_yield -n 0 +echo "*** RT_$tid: PASSED" +echo "" + +tid=001 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork01 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + +tid=002 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork02 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + +tid=003 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork03 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + +tid=004 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork04 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + +tid=005 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork07 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + +tid=006 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/fork08 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi +echo "" + diff --git a/test/issues/1027/Makefile b/test/issues/1027/Makefile new file mode 100644 index 00000000..0a8e41d7 --- /dev/null +++ b/test/issues/1027/Makefile @@ -0,0 +1,10 @@ +CC = gcc + +all: $(TARGET) + +test: all + @sh ./C1027.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/issues/1027/README b/test/issues/1027/README new file mode 100644 index 00000000..861be7ba --- /dev/null +++ b/test/issues/1027/README @@ -0,0 +1,45 @@ +【Issue#1027 動作確認】 +□ テスト内容 +1. Issueで報告された再現プログラムでの確認 +RT_001: ostest-sched_yield.000 + sched_yield()によるスケジューリングが行われ、 + - [child] End process + - [parent] End process + の順に出力されることを確認 + +2. 既存のfork機能に影響がないことをLTPを用いて確認 +LT_001: ltp-fork01 + fork後に子プロセスのプロセスIDが正しいことを確認 (TPASS 2件) + +LT_002: ltp-fork02 + fork後にwaitを行い、waitが子プロセスのPIDを返却することを確認(TPASS 1件) + +LT_003: ltp-fork03 + 子プロセスがfork後に計算を行えること、また子プロセスでのfork返却値が0で + あることを確認 (TPASS 1件) + +LT_004: ltp-fork04 + forkで生成した子プロセスが環境変数を変更しても、親プロセス側の + 環境変数に変化が無いことを確認 (TPASS 3件) + +LT_005: ltp-fork07 + forkした子プロセスに、親プロセスからファイルディスクリプタを + 引き継いでいることを確認 (TPASS 1件) + +LT_006: ltp-fork08 + forkした複数の子プロセスが、それぞれ親プロセスから引き継いだファイル + ディスクリプタを別個に操作できることを確認 + (ある子プロセスがcloseしても別な子プロセスがI/O可能) (TPASS 4件) + +□ 実行手順 +$ make test + +実行できない場合は、C1027.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス +OSTEST= OSTESTが存在するパス +LTP= LTPが存在するパス + +□ 実行結果 +result.log 参照。 +すべての項目をPASSしていることを確認。 diff --git a/test/issues/1027/result.log b/test/issues/1027/result.log new file mode 100644 index 00000000..1c9fef94 --- /dev/null +++ b/test/issues/1027/result.log @@ -0,0 +1,58 @@ +*** RT_001 start ******************************* +TEST_SUITE: sched_yield +TEST_NUMBER: 0 +ARGS: +[child] running core 1 +[parent] running core 0 +[parent] child process migrate/bind to core 0 +[parent] parent process bind to core 0 +[parent] send sched_yield. +[child] before migrate prevcore 1, nowcore 0 +[child] End process. +[parent] End process. +RESULT: check end order, [end child] -> [end parent] +*** RT_001: PASSED + +*** LT_001 start ******************************* +fork01 1 TPASS : fork() returned 18705 +fork01 2 TPASS : child pid and fork() return agree: 18705 +*** LT_001: PASSED (ok:2) + +*** LT_002 start ******************************* +fork02 0 TINFO : Inside parent +fork02 0 TINFO : exit status of wait 0 +fork02 1 TPASS : test 1 PASSED +*** LT_002: PASSED (ok:1) + +*** LT_003 start ******************************* +fork03 0 TINFO : process id in parent of child from fork : 18843 +fork03 1 TPASS : test 1 PASSED +*** LT_003: PASSED (ok:1) + +*** LT_004 start ******************************* +fork04 1 TPASS : Env var TERM unchanged after fork(): xterm-256color +fork04 2 TPASS : Env var NoTSetzWq unchanged after fork(): getenv() does not find variable set +fork04 3 TPASS : Env var TESTPROG unchanged after fork(): FRKTCS04 +*** LT_004: PASSED (ok:3) + +*** LT_005 start ******************************* +fork07 0 TINFO : Forking 100 children +fork07 0 TINFO : Forked all 100 children, now collecting +fork07 0 TINFO : Collected all 100 children +fork07 1 TPASS : 100/100 children read correctly from an inheritted fd +*** LT_005: PASSED (ok:1) + +*** LT_006 start ******************************* +fork08 0 TINFO : parent forksval: 1 +fork08 0 TINFO : second child got char: b +fork08 1 TPASS : Test passed in childnumber 2 +fork08 0 TINFO : parent forksval: 1 +fork08 0 TINFO : parent forksval: 2 +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 1 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 2 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 3 TPASS : parent test PASSED +fork08 0 TINFO : Number of processes forked is 2 +*** LT_006: PASSED (ok:4)