Send a signal to mcexec after switching to that process.
Change-Id: Ia882ef5027931009ee65febd0cbe22022a755c4a Refs: #1505
This commit is contained in:
committed by
Masamichi Takagi
parent
b0bd1feefb
commit
afea6af667
@ -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]
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
25
test/issues/1505/C1505.sh
Normal 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
|
||||
55
test/issues/1505/C1505_arm64.txt
Normal file
55
test/issues/1505/C1505_arm64.txt
Normal 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
|
||||
55
test/issues/1505/C1505_x86_64.txt
Normal file
55
test/issues/1505/C1505_x86_64.txt
Normal 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
|
||||
5
test/issues/1505/Makefile
Normal file
5
test/issues/1505/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
test::
|
||||
sh ./C1505.sh
|
||||
|
||||
clean::
|
||||
rm -f $(TARGET) *.o
|
||||
28
test/issues/1505/README
Normal file
28
test/issues/1505/README
Normal 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 していることを確認。
|
||||
Reference in New Issue
Block a user