schedule: Don't reschedule immediately when wake up on migrate

Refs: #1027
Change-Id: Ibe563c45c42611170273f1e437566c20fbef68d3
This commit is contained in:
Ken Sato
2018-07-10 10:27:09 +09:00
committed by Masamichi Takagi
parent d4fa953975
commit a7c9988aeb
5 changed files with 251 additions and 5 deletions

View File

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

136
test/issues/1027/C1027.sh Normal file
View File

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

10
test/issues/1027/Makefile Normal file
View File

@ -0,0 +1,10 @@
CC = gcc
all: $(TARGET)
test: all
@sh ./C1027.sh
clean:
rm -f $(TARGET) *.o

45
test/issues/1027/README Normal file
View File

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

View File

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