From c862b29d654ed126869f200fe9c3fae6b7948f74 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Tue, 11 Sep 2018 11:13:09 +0900 Subject: [PATCH] sched_setaffinity: Check migration after decrementing in_interrupt refs: #1180 Change-Id: I2b3fb03066812ecc802406297084977e757092fe --- arch/x86_64/kernel/cpu.c | 6 ++++ test/issues/1180/C1180.sh | 56 +++++++++++++++++++++++++++++++++++++ test/issues/1180/Makefile | 14 ++++++++++ test/issues/1180/README | 29 +++++++++++++++++++ test/issues/1180/result.log | 40 ++++++++++++++++++++++++++ 5 files changed, 145 insertions(+) create mode 100644 test/issues/1180/C1180.sh create mode 100644 test/issues/1180/Makefile create mode 100644 test/issues/1180/README create mode 100644 test/issues/1180/result.log diff --git a/arch/x86_64/kernel/cpu.c b/arch/x86_64/kernel/cpu.c index 172bdf2c..3467f58c 100644 --- a/arch/x86_64/kernel/cpu.c +++ b/arch/x86_64/kernel/cpu.c @@ -1007,6 +1007,12 @@ void handle_interrupt(int vector, struct x86_user_context *regs) set_cputime(interrupt_from_user(regs)? 0: 1); --v->in_interrupt; + + /* for migration by IPI */ + if (v->flags & CPU_FLAG_NEED_MIGRATE) { + schedule(); + check_signal(0, regs, 0); + } } void gpe_handler(struct x86_user_context *regs) diff --git a/test/issues/1180/C1180.sh b/test/issues/1180/C1180.sh new file mode 100644 index 00000000..f1ee1eed --- /dev/null +++ b/test/issues/1180/C1180.sh @@ -0,0 +1,56 @@ +#!/bin/sh + +USELTP=0 +USEOSTEST=1 + +. ../../common.sh + +tid=001 +echo "*** RT_$tid start *******************************" +sudo ${MCEXEC} ${TESTMCK} -s sched_setaffinity -n 8 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep -v "RESULT: TP failed" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=002 +echo "*** RT_$tid start *******************************" +sudo ${MCEXEC} ${TESTMCK} -s sched_setaffinity -n 1 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep -v "RESULT: TP failed" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=003 +echo "*** RT_$tid start *******************************" +sudo ${MCEXEC} ${TESTMCK} -s sched_setaffinity -n 2 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep -v "RESULT: TP failed" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=004 +echo "*** RT_$tid start *******************************" +sudo ${MCEXEC} ${TESTMCK} -s sched_setaffinity -n 9 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep -v "RESULT: TP failed" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=005 +echo "*** RT_$tid start *******************************" +sudo ${MCEXEC} ${TESTMCK} -s sched_setaffinity -n 10 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep -v "RESULT: TP failed" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" diff --git a/test/issues/1180/Makefile b/test/issues/1180/Makefile new file mode 100644 index 00000000..94c38325 --- /dev/null +++ b/test/issues/1180/Makefile @@ -0,0 +1,14 @@ +CC = gcc +TARGET= + +CPPFLAGS = +LDFLAGS = + +all: $(TARGET) + +test: all + @sh ./C1180.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/issues/1180/README b/test/issues/1180/README new file mode 100644 index 00000000..9571fa39 --- /dev/null +++ b/test/issues/1180/README @@ -0,0 +1,29 @@ +【Issue#1180 動作確認】 +□ テスト内容 +1. Issueで報告された再現プログラムでの確認 +RT_001: ostest_sched_setaffinity.008 + 親プロセスが子プロセスに対して、子プロセスが実行中のCPUを除いたcpusetを + 指定したsched_setaffinity()を実行し、即座にマイグレートすることを確認 + +2. 既存のマイグレーション機能に影響がないことをOSTESTを用いて確認 +RT_002: ostest_sched_setaffinity.001 + 自プロセスをマイグレートできることを確認 +RT_003: ostest_sched_setaffinity.002 + マイグレートした自プロセスのレジスタの値が保持されていることを確認 +RT_004: ostest_sched_setaffinity.009 + マイグレートした子プロセスのレジスタの値が保持されていることを確認 +RT_005: ostest_sched_setaffinity.010 + 複数の子プロセスを同一のCPU上にマイグレートしても、 + それぞれのレジスタの値が保持されていることを確認 + +□ 実行手順 +$ make test + +McKernelのインストール先や、OSTEST, LTPの配置場所は、 +$HOME/.mck_test_config を参照している +.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを +$HOMEにコピーし、適宜編集する + +□ 実行結果 +result.log 参照 +すべての項目をPASSしていることを確認 diff --git a/test/issues/1180/result.log b/test/issues/1180/result.log new file mode 100644 index 00000000..d990c005 --- /dev/null +++ b/test/issues/1180/result.log @@ -0,0 +1,40 @@ +*** RT_001 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 8 +ARGS: -p 20 +RESULT: ok +*** RT_001: PASSED + +*** RT_002 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 1 +ARGS: -p 20 +RESULT: ok +*** RT_002: PASSED + +*** RT_003 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 2 +ARGS: -p 20 +==before migrate process== +f0 = 3.140000, f1 = 42.195000, f2 = 53.849998, f3 = 909.908997 +==after migrate process== +f0 = 3.140000, f1 = 42.195000, f2 = 53.849998, f3 = 909.908997 +RESULT: ok +*** RT_003: PASSED + +*** RT_004 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 9 +ARGS: -p 20 +==Please check migrated child process keep datas== +RESULT: ok +*** RT_004: PASSED + +*** RT_005 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 10 +ARGS: -p 20 +==Please check migrated child process keep datas== +RESULT: ok +*** RT_005: PASSED