From afea6af6678f41f45b2f98acb17d5601f72ff938 Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Mon, 8 Feb 2021 17:02:55 +0900 Subject: [PATCH] Send a signal to mcexec after switching to that process. Change-Id: Ia882ef5027931009ee65febd0cbe22022a755c4a Refs: #1505 --- arch/arm64/kernel/entry.S | 3 -- arch/x86_64/kernel/cpu.c | 3 -- kernel/syscall.c | 62 +++++++++++-------------------- test/issues/1505/C1505.sh | 25 +++++++++++++ test/issues/1505/C1505_arm64.txt | 55 +++++++++++++++++++++++++++ test/issues/1505/C1505_x86_64.txt | 55 +++++++++++++++++++++++++++ test/issues/1505/Makefile | 5 +++ test/issues/1505/README | 28 ++++++++++++++ 8 files changed, 189 insertions(+), 47 deletions(-) create mode 100644 test/issues/1505/C1505.sh create mode 100644 test/issues/1505/C1505_arm64.txt create mode 100644 test/issues/1505/C1505_x86_64.txt create mode 100644 test/issues/1505/Makefile create mode 100644 test/issues/1505/README diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 15df4586..fd1587b2 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -89,9 +89,6 @@ mov x2, #0 bl check_signal_irq_disabled // check whether the signal is delivered(for kernel_exit) .endif - .if \el == 1 - bl check_sig_pending - .endif disable_irq x1 // disable interrupts .if \need_enable_step == 1 ldr x1, [tsk, #TI_FLAGS] diff --git a/arch/x86_64/kernel/cpu.c b/arch/x86_64/kernel/cpu.c index 7bf6fbff..5565a324 100644 --- a/arch/x86_64/kernel/cpu.c +++ b/arch/x86_64/kernel/cpu.c @@ -923,9 +923,6 @@ void interrupt_exit(struct x86_user_context *regs) check_need_resched(); check_signal(0, regs, -1); } - else { - check_sig_pending(); - } } void handle_interrupt(int vector, struct x86_user_context *regs) diff --git a/kernel/syscall.c b/kernel/syscall.c index 120ee40b..5e60aa5c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -252,6 +252,7 @@ long do_syscall(struct syscall_request *req, int cpu) unsigned long flags; DECLARE_WAITQ_ENTRY(scd_wq_entry, cpu_local_var(current)); + check_sig_pending(); cpu_pause(); /* Spin if not preemptable */ @@ -11110,8 +11111,8 @@ long syscall(int num, ihk_mc_user_context_t *ctx) return l; } -static int -check_sig_pending_thread(struct thread *thread) +void +check_sig_pending() { int found = 0; struct list_head *head; @@ -11123,9 +11124,22 @@ check_sig_pending_thread(struct thread *thread) __sigset_t x; int sig = 0; struct k_sigaction *k; - struct cpu_local_var *v; + struct thread *thread; + + if (clv == NULL) + return; + + thread = cpu_local_var(current); + if (thread == NULL || thread == &cpu_local_var(idle)) { + return; + } + if (thread->in_syscall_offload == 0) { + return; + } + if (thread->proc->group_exit_status & 0x0000000100000000L) { + return; + } - v = get_this_cpu_local_var(); w = thread->sigmask.__val[0]; lock = &thread->sigcommon->lock; @@ -11174,16 +11188,14 @@ check_sig_pending_thread(struct thread *thread) } if (found == 2) { - ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate); terminate_mcexec(0, sig); - return 1; + return; } else if (found == 1) { - ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate); interrupt_syscall(thread, 0); - return 1; + return; } - return 0; + return; } struct sig_pending * @@ -11270,38 +11282,6 @@ hassigpending(struct thread *thread) return getsigpending(thread, 0); } -void -check_sig_pending(void) -{ - struct thread *thread; - struct cpu_local_var *v; - - if (clv == NULL) - return; - - v = get_this_cpu_local_var(); -repeat: - v->runq_irqstate = ihk_mc_spinlock_lock(&v->runq_lock); - list_for_each_entry(thread, &(v->runq), sched_list) { - - if (thread == NULL || thread == &cpu_local_var(idle)) { - continue; - } - - if (thread->in_syscall_offload == 0) { - continue; - } - - if (thread->proc->group_exit_status & 0x0000000100000000L) { - continue; - } - - if (check_sig_pending_thread(thread)) - goto repeat; - } - ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate); -} - static void __check_signal(unsigned long rc, void *regs0, int num, int irq_disabled) { diff --git a/test/issues/1505/C1505.sh b/test/issues/1505/C1505.sh new file mode 100644 index 00000000..0dcb9fb9 --- /dev/null +++ b/test/issues/1505/C1505.sh @@ -0,0 +1,25 @@ +#!/bin/sh +USELTP=1 +USEOSTEST=0 + +. ../../common.sh + +################################################################################ +uname -m +for i in msgrcv05:01 msgsnd05:02 semctl01:03 semop05:04 kill01:05 \ + kill02:06 kill06:07 kill07:08 kill08:09 kill09:10; do + tp=`echo $i|sed 's/:.*//'` + id=`echo $i|sed 's/.*://'` + sudo PATH=$PATH:$LTPBIN $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt + ok=`grep TPASS $tp.txt | wc -l` + ng=`grep TFAIL $tp.txt | wc -l` + if [ $ok = 0 -a $ng = 0 ]; then + ok=`awk '/^passed/{print $2}' $tp.txt` + ng=`awk '/^failed/{print $2}' $tp.txt` + fi + if [ $ng = 0 ]; then + echo "*** C1505T$id: $tp PASS ($ok)" + else + echo "*** C1505T$id: $tp FAIL (ok=$ok ng=%ng)" + fi +done diff --git a/test/issues/1505/C1505_arm64.txt b/test/issues/1505/C1505_arm64.txt new file mode 100644 index 00000000..265d4157 --- /dev/null +++ b/test/issues/1505/C1505_arm64.txt @@ -0,0 +1,55 @@ +Script started on Tue 22 Dec 2020 08:24:38 AM JST +[shirasawa@apollo16 1505]$ make test +sh ./C1505.sh +mcstop+release.sh ... done +mcreboot.sh -c 2-31 -m 2G@0,2G@1 -O ... done +aarch64 +msgrcv05 1 TPASS : got EINTR as expected +*** C1505T01: msgrcv05 PASS (1) +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +msgsnd05.c:63: PASS: msgsnd() failed as expected: EAGAIN +msgsnd05.c:63: PASS: msgsnd() failed as expected: EINTR + +Summary: +passed 2 +failed 0 +skipped 0 +warnings 0 +*** C1505T02: msgsnd05 PASS (2) +semctl01 1 TPASS : buf.sem_nsems and buf.sem_perm.mode are correct +semctl01 2 TPASS : buf.sem_perm.mode is correct +semctl01 3 TPASS : semaphores have expected values +semctl01 4 TPASS : number of sleeping processes is correct +semctl01 5 TPASS : last pid value is correct +semctl01 6 TPASS : semaphore value is correct +semctl01 7 TPASS : number of sleeping processes is correct +semctl01 8 TPASS : semaphore values are correct +semctl01 9 TPASS : semaphore value is correct +semctl01 10 TPASS : the highest index is correct +semctl01 11 TPASS : number of semaphore sets is correct +semctl01 12 TPASS : id of the semaphore set is correct +semctl01 13 TPASS : semaphore appears to be removed +*** C1505T03: semctl01 PASS (13) +semop05 1 TPASS : expected failure - errno = 43 : Identifier removed +semop05 1 TPASS : expected failure - errno = 43 : Identifier removed +semop05 1 TPASS : expected failure - errno = 4 : Interrupted system call +semop05 1 TPASS : expected failure - errno = 4 : Interrupted system call +*** C1505T04: semop05 PASS (4) +kill01 1 TPASS : received expected signal 9 +*** C1505T05: kill01 PASS (1) +kill02 1 TPASS : The signal was sent to all processes in the process group. +kill02 2 TPASS : The signal was not sent to selective processes that were not in the process group. +*** C1505T06: kill02 PASS (2) +kill06 1 TPASS : received expected signal 9 +*** C1505T07: kill06 PASS (1) +kill07 0 TINFO : received expected signal 9 +kill07 1 TPASS : Did not catch signal as expected +*** C1505T08: kill07 PASS (1) +kill08 1 TPASS : received expected signal 9 +*** C1505T09: kill08 PASS (1) +kill09 1 TPASS : kill(83510, SIGKILL) returned 0 +*** C1505T10: kill09 PASS (1) +]0;shirasawa@apollo16:~/issue1505/mckernel/test/issues/1505[shirasawa@apollo16 1505]$ exit +exit + +Script done on Tue 22 Dec 2020 08:25:23 AM JST diff --git a/test/issues/1505/C1505_x86_64.txt b/test/issues/1505/C1505_x86_64.txt new file mode 100644 index 00000000..1ccd5a52 --- /dev/null +++ b/test/issues/1505/C1505_x86_64.txt @@ -0,0 +1,55 @@ +Script started on Tue Dec 22 07:58:45 2020 +bash-4.2$ make test +sh ./C1505.sh +mcstop+release.sh ... done +mcreboot.sh -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 ... done +x86_64 +msgrcv05 1 TPASS : got EINTR as expected +*** C1505T01: msgrcv05 PASS (1) +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +msgsnd05.c:63: PASS: msgsnd() failed as expected: EAGAIN +msgsnd05.c:63: PASS: msgsnd() failed as expected: EINTR + +Summary: +passed 2 +failed 0 +skipped 0 +warnings 0 +*** C1505T02: msgsnd05 PASS (2) +semctl01 1 TPASS : buf.sem_nsems and buf.sem_perm.mode are correct +semctl01 2 TPASS : buf.sem_perm.mode is correct +semctl01 3 TPASS : semaphores have expected values +semctl01 4 TPASS : number of sleeping processes is correct +semctl01 5 TPASS : last pid value is correct +semctl01 6 TPASS : semaphore value is correct +semctl01 7 TPASS : number of sleeping processes is correct +semctl01 8 TPASS : semaphore values are correct +semctl01 9 TPASS : semaphore value is correct +semctl01 10 TPASS : the highest index is correct +semctl01 11 TPASS : number of semaphore sets is correct +semctl01 12 TPASS : id of the semaphore set is correct +semctl01 13 TPASS : semaphore appears to be removed +*** C1505T03: semctl01 PASS (13) +semop05 1 TPASS : expected failure - errno = 43 : Identifier removed +semop05 1 TPASS : expected failure - errno = 43 : Identifier removed +semop05 1 TPASS : expected failure - errno = 4 : Interrupted system call +semop05 1 TPASS : expected failure - errno = 4 : Interrupted system call +*** C1505T04: semop05 PASS (4) +kill01 1 TPASS : received expected signal 9 +*** C1505T05: kill01 PASS (1) +kill02 1 TPASS : The signal was sent to all processes in the process group. +kill02 2 TPASS : The signal was not sent to selective processes that were not in the process group. +*** C1505T06: kill02 PASS (2) +kill06 1 TPASS : received expected signal 9 +*** C1505T07: kill06 PASS (1) +kill07 0 TINFO : received expected signal 9 +kill07 1 TPASS : Did not catch signal as expected +*** C1505T08: kill07 PASS (1) +kill08 1 TPASS : received expected signal 9 +*** C1505T09: kill08 PASS (1) +kill09 1 TPASS : kill(19542, SIGKILL) returned 0 +*** C1505T10: kill09 PASS (1) +bash-4.2$ exit +exit + +Script done on Tue Dec 22 07:59:12 2020 diff --git a/test/issues/1505/Makefile b/test/issues/1505/Makefile new file mode 100644 index 00000000..d9438424 --- /dev/null +++ b/test/issues/1505/Makefile @@ -0,0 +1,5 @@ +test:: + sh ./C1505.sh + +clean:: + rm -f $(TARGET) *.o diff --git a/test/issues/1505/README b/test/issues/1505/README new file mode 100644 index 00000000..3e70cc97 --- /dev/null +++ b/test/issues/1505/README @@ -0,0 +1,28 @@ +【Issue#1505 動作確認】 +□ テスト内容 +1. Issue 指摘事項の再現確認 + 問題が発生していた以下のLTPが対策によってPASSすることを確認する。 +C1505T01 msgrcv05: msgrcv発行中にシグナルによりシステムコールを中断する +C1505T02 msgsnd05: msgsnd発行中にシグナルによりシステムコールを中断する +C1505T03 semctl01: semctl発行中にシグナルによりシステムコールを中断する +C1505T04 semop05: semop発行中にシグナルによりシステムコールを中断する + +2. LTP を用いて既存処理に影響しないことを確認 + シグナル関連のテストプログラムの動作に影響しないことを確認する +C1505T05 kill01: kill の基本機能の確認 +C1505T06 kill02: kill の基本機能の確認 +C1505T07 kill06: kill の基本機能の確認 +C1505T08 kill07: kill の基本機能の確認 +C1505T09 kill08: kill の基本機能の確認 +C1505T10 kill09: kill の基本機能の確認 + +□ 実行手順 +$ make test + +McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を +参照する。.mck_test_config は、McKernel をビルドした際に生成される +mck_test_config.sample ファイルを $HOME にコピーし、適宜編集すること。 + +□ 実行結果 +C1505_x86_64.txt(x86_64実行結果)、C1505_arm64.txt(arm64実行結果)参照。 +全ての項目が PASS していることを確認。