schedule: Don't reschedule immediately when wake up on migrate
Refs: #1027 Change-Id: Ibe563c45c42611170273f1e437566c20fbef68d3
This commit is contained in:
committed by
Masamichi Takagi
parent
d4fa953975
commit
a7c9988aeb
@ -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
136
test/issues/1027/C1027.sh
Normal 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
10
test/issues/1027/Makefile
Normal 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
45
test/issues/1027/README
Normal 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していることを確認。
|
||||
58
test/issues/1027/result.log
Normal file
58
test/issues/1027/result.log
Normal 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)
|
||||
Reference in New Issue
Block a user