Send a signal to mcexec after switching to that process.

Change-Id: Ia882ef5027931009ee65febd0cbe22022a755c4a
Refs: #1505
This commit is contained in:
Tomoki Shirasawa
2021-02-08 17:02:55 +09:00
committed by Masamichi Takagi
parent b0bd1feefb
commit afea6af667
8 changed files with 189 additions and 47 deletions

View File

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

View File

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

View File

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

25
test/issues/1505/C1505.sh Normal file
View File

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

View File

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

View File

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

View File

@ -0,0 +1,5 @@
test::
sh ./C1505.sh
clean::
rm -f $(TARGET) *.o

28
test/issues/1505/README Normal file
View File

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