migrate: Don't migrate on in-kernel interrupt
Change-Id: I9c07e0d633687ce232ec3cd0c80439ca2e856293 Refs: #1555
This commit is contained in:
committed by
Masamichi Takagi
parent
583319125a
commit
93dafc5f79
@ -344,10 +344,13 @@ void handle_interrupt_gicv3(struct pt_regs *regs)
|
|||||||
|
|
||||||
//irqflags = ihk_mc_spinlock_lock(&v->runq_lock);
|
//irqflags = ihk_mc_spinlock_lock(&v->runq_lock);
|
||||||
/* For migration by IPI or by timesharing */
|
/* For migration by IPI or by timesharing */
|
||||||
if (v->flags &
|
if (v->flags & CPU_FLAG_NEED_RESCHED) {
|
||||||
(CPU_FLAG_NEED_MIGRATE | CPU_FLAG_NEED_RESCHED)) {
|
if (v->flags & CPU_FLAG_NEED_MIGRATE && !from_user) {
|
||||||
v->flags &= ~CPU_FLAG_NEED_RESCHED;
|
// Don't migrate on K2K schedule
|
||||||
do_check = 1;
|
} else {
|
||||||
|
v->flags &= ~CPU_FLAG_NEED_RESCHED;
|
||||||
|
do_check = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//ihk_mc_spinlock_unlock(&v->runq_lock, irqflags);
|
//ihk_mc_spinlock_unlock(&v->runq_lock, irqflags);
|
||||||
|
|
||||||
|
|||||||
@ -932,11 +932,12 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
|
|||||||
{
|
{
|
||||||
struct ihk_mc_interrupt_handler *h;
|
struct ihk_mc_interrupt_handler *h;
|
||||||
struct cpu_local_var *v = get_this_cpu_local_var();
|
struct cpu_local_var *v = get_this_cpu_local_var();
|
||||||
|
int from_user = interrupt_from_user(regs);
|
||||||
|
|
||||||
lapic_ack();
|
lapic_ack();
|
||||||
++v->in_interrupt;
|
++v->in_interrupt;
|
||||||
|
|
||||||
set_cputime(interrupt_from_user(regs) ?
|
set_cputime(from_user ?
|
||||||
CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN);
|
CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN);
|
||||||
|
|
||||||
dkprintf("CPU[%d] got interrupt, vector: %d, RIP: 0x%lX\n",
|
dkprintf("CPU[%d] got interrupt, vector: %d, RIP: 0x%lX\n",
|
||||||
@ -1054,15 +1055,18 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
interrupt_exit(regs);
|
interrupt_exit(regs);
|
||||||
set_cputime(interrupt_from_user(regs) ?
|
set_cputime(from_user ?
|
||||||
CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT);
|
CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT);
|
||||||
|
|
||||||
--v->in_interrupt;
|
--v->in_interrupt;
|
||||||
|
|
||||||
/* for migration by IPI */
|
/* for migration by IPI */
|
||||||
if (v->flags & CPU_FLAG_NEED_MIGRATE) {
|
if (v->flags & CPU_FLAG_NEED_MIGRATE) {
|
||||||
schedule();
|
// Don't migrate on K2K schedule
|
||||||
check_signal(0, regs, 0);
|
if (from_user) {
|
||||||
|
schedule();
|
||||||
|
check_signal(0, regs, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
271
test/issues/1555/C1555.c
Normal file
271
test/issues/1555/C1555.c
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
/* 1400_arm64.c COPYRIGHT FUJITSU LIMITED 2020 */
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
|
#define POINT_ORDER_NUM 2
|
||||||
|
#define SLEEP_SEC 2
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
#define PAUSE_INST "pause"
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
#define PAUSE_INST "yield"
|
||||||
|
#else
|
||||||
|
#error "unexpected archtecture."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define cpu_pause() \
|
||||||
|
({ \
|
||||||
|
__asm__ __volatile__(PAUSE_INST ::: "memory"); \
|
||||||
|
})
|
||||||
|
|
||||||
|
static int *sync1 = MAP_FAILED;
|
||||||
|
static int *parent_core = MAP_FAILED;
|
||||||
|
static int *point_order = MAP_FAILED;
|
||||||
|
static int *od = MAP_FAILED;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pid_t pid = -1;
|
||||||
|
pid_t ret_pid = -1;
|
||||||
|
int status = 0;
|
||||||
|
int i = 0, rc;
|
||||||
|
int *resp;
|
||||||
|
int result = -1;
|
||||||
|
int ret = -1;
|
||||||
|
int failed = 0;
|
||||||
|
|
||||||
|
/* get shared memory */
|
||||||
|
sync1 = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
parent_core = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
point_order = (int *)mmap(NULL, sizeof(int) * POINT_ORDER_NUM,
|
||||||
|
PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
od = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
|
||||||
|
/* mmap check */
|
||||||
|
if (sync1 == MAP_FAILED ||
|
||||||
|
parent_core == MAP_FAILED ||
|
||||||
|
point_order == MAP_FAILED ||
|
||||||
|
od == MAP_FAILED) {
|
||||||
|
printf("mmap() Failed.\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < POINT_ORDER_NUM; i++) {
|
||||||
|
point_order[i] = 0;
|
||||||
|
}
|
||||||
|
*od = 0;
|
||||||
|
*sync1 = 0;
|
||||||
|
|
||||||
|
/* create child process */
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
switch (pid) {
|
||||||
|
case -1:
|
||||||
|
/* error */
|
||||||
|
printf("fork() Failed.\n");
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
case 0: {
|
||||||
|
/* child */
|
||||||
|
/* before migrate, get cpunum */
|
||||||
|
int old_mycore = sched_getcpu();
|
||||||
|
|
||||||
|
printf("[child:%d] running core %d\n", getpid(), old_mycore);
|
||||||
|
|
||||||
|
/* sync parent */
|
||||||
|
*sync1 = 1;
|
||||||
|
|
||||||
|
#ifdef MIGRATE_ON_OFFLOAD
|
||||||
|
int sec = SLEEP_SEC;
|
||||||
|
resp = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
|
||||||
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
|
/* debug syscall */
|
||||||
|
rc = syscall(888, sec, resp, 0, 0, 0, 0);
|
||||||
|
if (rc != sec || *resp != sec) {
|
||||||
|
printf("[child:%d] debug_syscall failed\n", getpid());
|
||||||
|
_exit(-1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* wait until migrated */
|
||||||
|
while (sched_getcpu() == old_mycore) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
point_order[0] = ++(*od);
|
||||||
|
|
||||||
|
_exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
/* parent */
|
||||||
|
cpu_set_t cpuset;
|
||||||
|
|
||||||
|
/* sync child */
|
||||||
|
while (*sync1 != 1) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parent corenum get */
|
||||||
|
*parent_core = sched_getcpu();
|
||||||
|
|
||||||
|
/* child process to migrate parent core */
|
||||||
|
printf("[parent:%d] running core %d\n", getpid(), *parent_core);
|
||||||
|
printf("[parent] child process(pid=%d) "
|
||||||
|
"migrate/bind to core %d\n",
|
||||||
|
pid, *parent_core);
|
||||||
|
|
||||||
|
CPU_ZERO(&cpuset);
|
||||||
|
CPU_SET(*parent_core, &cpuset);
|
||||||
|
|
||||||
|
/* sched_setaffinity interval */
|
||||||
|
usleep(10000);
|
||||||
|
|
||||||
|
result = sched_setaffinity(pid, sizeof(cpuset), &cpuset);
|
||||||
|
if (result == -1) {
|
||||||
|
printf("errno = %d\n", errno);
|
||||||
|
printf("child migrate/bind "
|
||||||
|
"sched_setaffinity failed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parent core bind */
|
||||||
|
printf("[parent] parent process bind to core %d\n",
|
||||||
|
*parent_core);
|
||||||
|
result = sched_setaffinity(0, sizeof(cpuset), &cpuset);
|
||||||
|
if (result == -1) {
|
||||||
|
printf("errno = %d\n", errno);
|
||||||
|
printf("parent bind sched_setaffinity failed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MIGRATE_ON_OFFLOAD
|
||||||
|
/* wait for child woken up */
|
||||||
|
usleep(SLEEP_SEC * 1000000 + 1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* sync child, switch to child process */
|
||||||
|
printf("[parent] send sched_yield.\n");
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
result = sched_yield();
|
||||||
|
|
||||||
|
point_order[1] = ++(*od);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == -1) {
|
||||||
|
printf("sched_yield failed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* child process status check. */
|
||||||
|
ret_pid = wait(&status);
|
||||||
|
if (ret_pid == pid) {
|
||||||
|
if (WIFEXITED(status)) {
|
||||||
|
if (WEXITSTATUS(status)) {
|
||||||
|
printf("TP failed, child migrate fail.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto wait_ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, child is not exited.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status)) {
|
||||||
|
printf("TP failed, child signaled by %d.\n",
|
||||||
|
WTERMSIG(status));
|
||||||
|
|
||||||
|
if (WCOREDUMP(status)) {
|
||||||
|
printf("coredumped.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, child is not signaled.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (WIFSTOPPED(status)) {
|
||||||
|
printf("TP failed, child is stopped by signal %d.\n",
|
||||||
|
WSTOPSIG(status));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, child is not stopped.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WIFCONTINUED(status)) {
|
||||||
|
printf("TP failed, child is continued.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, child is not continued.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < POINT_ORDER_NUM; i++) {
|
||||||
|
printf("point_order[%d] = %d\n", i, point_order[i]);
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, child process wait() fail.\n");
|
||||||
|
|
||||||
|
for (i = 0; i < POINT_ORDER_NUM; i++) {
|
||||||
|
printf("point_order[%d] = %d\n", i, point_order[i]);
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_ok:
|
||||||
|
for (i = 0; i < POINT_ORDER_NUM; i++) {
|
||||||
|
printf("point_order[%d] = %d\n", i, point_order[i]);
|
||||||
|
|
||||||
|
if (point_order[i] == 0) {
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed != 0) {
|
||||||
|
printf("TP failed, parent or child process is not running.\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != -1) {
|
||||||
|
if (point_order[0] < point_order[1]) {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("TP failed, out of order.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
/* unmap semaphore memory */
|
||||||
|
if (od != MAP_FAILED) {
|
||||||
|
munmap(od, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (point_order != MAP_FAILED) {
|
||||||
|
munmap(point_order, sizeof(int) * POINT_ORDER_NUM);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parent_core != MAP_FAILED) {
|
||||||
|
munmap(parent_core, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sync1 != MAP_FAILED) {
|
||||||
|
munmap(sync1, sizeof(int));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
103
test/issues/1555/C1555.sh
Normal file
103
test/issues/1555/C1555.sh
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#/bin/sh
|
||||||
|
|
||||||
|
USELTP=1
|
||||||
|
USEOSTEST=0
|
||||||
|
|
||||||
|
MCREBOOT=0
|
||||||
|
. ../../common.sh
|
||||||
|
BOOTPARAM="${BOOTPARAM} -e anon_on_demand"
|
||||||
|
mcreboot
|
||||||
|
|
||||||
|
PWD=`pwd`
|
||||||
|
STOPFILE="./1555_stop"
|
||||||
|
LOGFILE="${PWD}/1555_log"
|
||||||
|
LTPLIST="${PWD}/ltp_list"
|
||||||
|
TESTTIME=43200 # 6 hours
|
||||||
|
|
||||||
|
issue="1555"
|
||||||
|
echo "start-time: `date`"
|
||||||
|
stime=`date "+%s"`
|
||||||
|
failed=0
|
||||||
|
loops=0
|
||||||
|
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
sudo ${MCEXEC} ./C1555T01 > ${LOGFILE} 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "C1555T01 failed."
|
||||||
|
failed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
${IHKOSCTL} 0 clear_kmsg
|
||||||
|
sudo ${MCEXEC} ./C1555T02 > ${LOGFILE} 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "C1555T02 failed."
|
||||||
|
failed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
dbg_cnt=`${IHKOSCTL} 0 kmsg | grep "ISSUE_1555" | wc -l`
|
||||||
|
if [ ${dbg_cnt} -eq 0 ]; then
|
||||||
|
echo "C1555T02 failed. Did not migrate in offload."
|
||||||
|
failed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
pushd ${LTPBIN} > /dev/null
|
||||||
|
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
${MCEXEC} ./${line} > ${LOGFILE} 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "${line} failed."
|
||||||
|
failed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
ng=`grep FAIL ${LOGFILE} | wc -l`
|
||||||
|
if [ $ng -ne 0 ]; then
|
||||||
|
echo "${line} failed."
|
||||||
|
cat ${LOGFILE}
|
||||||
|
failed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done < ${LTPLIST}
|
||||||
|
popd > /dev/null
|
||||||
|
|
||||||
|
let loops++
|
||||||
|
|
||||||
|
if [ -e ${STOPFILE} ]; then
|
||||||
|
rm -f ${STOPFILE}
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
etime=`date "+%s"`
|
||||||
|
run_time=$((${etime} - ${stime}))
|
||||||
|
if [ ${TESTTIME} -le ${run_time} ]; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${failed} -eq 1 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "end-time: `date`"
|
||||||
|
etime=`date "+%s"`
|
||||||
|
run_time=$((${etime} - ${stime}))
|
||||||
|
|
||||||
|
if [ ${TESTTIME} -le ${run_time} ]; then
|
||||||
|
if [ ${failed} -eq 0 ]; then
|
||||||
|
echo "Issue#${issue} test OK."
|
||||||
|
echo "Test cases run ${loops} times."
|
||||||
|
rm -f ${LOGFILE}
|
||||||
|
else
|
||||||
|
echo "Issue#${issue} test NG."
|
||||||
|
echo "Test cases run ${loops} times."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Issue#${issue} test NG."
|
||||||
|
echo "Test cases run ${loops} times."
|
||||||
|
fi
|
||||||
|
|
||||||
18
test/issues/1555/Makefile
Normal file
18
test/issues/1555/Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CC=gcc
|
||||||
|
CFLAGS=-g
|
||||||
|
LDFLAGS=
|
||||||
|
|
||||||
|
TARGET=C1555T01 C1555T02
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
C1555T01: C1555.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
C1555T02: C1555.c
|
||||||
|
$(CC) -DMIGRATE_ON_OFFLOAD -o $@ $^
|
||||||
|
|
||||||
|
test: all
|
||||||
|
sh ./C1555.sh
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET) *.o *.txt
|
||||||
38
test/issues/1555/README
Normal file
38
test/issues/1555/README
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
【Issue#1555 動作確認】
|
||||||
|
□ テスト内容
|
||||||
|
Issueにて報告された症状はmigrate指示のタイミングによって発生の有無が
|
||||||
|
変化するため、下記のテストを6時間連続実行して、症状が発生しないことを確認する。
|
||||||
|
|
||||||
|
1. 下記のテストプログラムを実行し、症状が発生しないことを確認する
|
||||||
|
C1555T01: (Issue#1400 のテストプログラム 1400_arm64.c を流用)
|
||||||
|
親プロセスが子プロセスと自身を同一CPUにバインドしてsched_yield()した場合、
|
||||||
|
子プロセス、親プロセスの順序で実行されることを確認する。
|
||||||
|
|
||||||
|
C1555T02:
|
||||||
|
C1555T01 のテストケースにおいて、子プロセスがmigrate指示を受ける際に
|
||||||
|
システムコールのオフロードの中であり、その最中にRemote page faultが発生した場合にも
|
||||||
|
子プロセス、親プロセスの順序で実行されることを確認する。
|
||||||
|
|
||||||
|
2. 以下のLTPを用いて既存機能に影響が無いことを確認
|
||||||
|
- sched_yield01
|
||||||
|
- signal01,02,03,04,05
|
||||||
|
- rt_sigaction01,02,03
|
||||||
|
- rt_sigprocmask01,02
|
||||||
|
- rt_sigsuspend01
|
||||||
|
- rt_tgsigqueueinfo01
|
||||||
|
- futex_wait01,02,03,04
|
||||||
|
- futex_wake01
|
||||||
|
- futex_wait_bitset01
|
||||||
|
- execveat02
|
||||||
|
|
||||||
|
□ 実行手順
|
||||||
|
$ make test
|
||||||
|
|
||||||
|
McKernelのインストール先や、OSTEST, LTPの配置場所は、
|
||||||
|
$HOME/.mck_test_config を参照している
|
||||||
|
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
|
||||||
|
$HOMEにコピーし、適宜編集する
|
||||||
|
|
||||||
|
□ 実行結果
|
||||||
|
x86_64_result.log aarch64_result.log 参照。
|
||||||
|
すべての項目をPASSしていることを確認。
|
||||||
7
test/issues/1555/aarch64_result.log
Normal file
7
test/issues/1555/aarch64_result.log
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
sh ./C1555.sh
|
||||||
|
mcstop+release.sh ... done
|
||||||
|
mcreboot.sh -c 37-43,49-55 -m 2G@2,2G@3 -r 37-43:36+49-55:48 -O -e anon_on_demand ... done
|
||||||
|
start-time: 2021年 1月 27日 水曜日 14:41:56 JST
|
||||||
|
end-time: 2021年 1月 28日 木曜日 02:42:01 JST
|
||||||
|
Issue#1555 test OK.
|
||||||
|
Test cases run 4426 times.
|
||||||
21
test/issues/1555/ltp_list
Normal file
21
test/issues/1555/ltp_list
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
sched_yield01
|
||||||
|
signal01
|
||||||
|
signal02
|
||||||
|
signal03
|
||||||
|
signal04
|
||||||
|
signal05
|
||||||
|
rt_sigaction01
|
||||||
|
rt_sigaction02
|
||||||
|
rt_sigaction03
|
||||||
|
rt_sigprocmask01
|
||||||
|
rt_sigprocmask02
|
||||||
|
rt_sigsuspend01
|
||||||
|
rt_tgsigqueueinfo01
|
||||||
|
futex_wait01
|
||||||
|
futex_wait02
|
||||||
|
futex_wait03
|
||||||
|
futex_wait04
|
||||||
|
futex_wake01
|
||||||
|
futex_wait_bitset01
|
||||||
|
execveat02
|
||||||
|
sigsuspend01
|
||||||
74
test/issues/1555/test_1555.patch
Normal file
74
test/issues/1555/test_1555.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
index 28e99eb..1d9f052 100644
|
||||||
|
--- a/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
@@ -137,6 +137,7 @@ SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
SYSCALL_HANDLED(803, suspend_threads)
|
||||||
|
SYSCALL_HANDLED(804, resume_threads)
|
||||||
|
SYSCALL_HANDLED(811, linux_spawn)
|
||||||
|
+SYSCALL_DELEGATED(888, dbg_sleep)
|
||||||
|
|
||||||
|
SYSCALL_DELEGATED(1024, open)
|
||||||
|
SYSCALL_DELEGATED(1035, readlink)
|
||||||
|
diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
index 17a1d65..8010d3e 100644
|
||||||
|
--- a/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
@@ -181,6 +181,7 @@ SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
SYSCALL_HANDLED(803, suspend_threads)
|
||||||
|
SYSCALL_HANDLED(804, resume_threads)
|
||||||
|
SYSCALL_HANDLED(811, linux_spawn)
|
||||||
|
+SYSCALL_DELEGATED(888, dbg_sleep)
|
||||||
|
|
||||||
|
/* Do not edit the lines including this comment and
|
||||||
|
* EOF just after it because those are used as a
|
||||||
|
diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c
|
||||||
|
index c48e245..118de75 100644
|
||||||
|
--- a/executer/user/mcexec.c
|
||||||
|
+++ b/executer/user/mcexec.c
|
||||||
|
@@ -5039,6 +5039,15 @@ return_linux_spawn:
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ case 888: { // dbg_sleep
|
||||||
|
+ int sec = (int)w.sr.args[0];
|
||||||
|
+ int *resp = (int *)w.sr.args[1];
|
||||||
|
+ sleep(sec);
|
||||||
|
+ *resp = sec;
|
||||||
|
+ do_syscall_return(fd, cpu, sec, 0, 0, 0, 0);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
ret = do_generic_syscall(&w);
|
||||||
|
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
|
||||||
|
diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||||
|
index 8a919e1..0b0fbc3 100644
|
||||||
|
--- a/kernel/syscall.c
|
||||||
|
+++ b/kernel/syscall.c
|
||||||
|
@@ -181,6 +181,7 @@ long do_syscall(struct syscall_request *req, int cpu)
|
||||||
|
struct thread *thread = cpu_local_var(current);
|
||||||
|
struct ihk_os_cpu_monitor *monitor = cpu_local_var(monitor);
|
||||||
|
int mstatus = 0;
|
||||||
|
+ int orig_cpu;
|
||||||
|
|
||||||
|
#ifdef PROFILE_ENABLE
|
||||||
|
/* We cannot use thread->profile_start_ts here because the
|
||||||
|
@@ -231,6 +232,7 @@ long do_syscall(struct syscall_request *req, int cpu)
|
||||||
|
#ifdef ENABLE_TOFU
|
||||||
|
res.pde_data = NULL;
|
||||||
|
#endif
|
||||||
|
+ orig_cpu = ihk_mc_get_processor_id();
|
||||||
|
send_syscall(req, cpu, &res);
|
||||||
|
|
||||||
|
if (req->rtid == -1) {
|
||||||
|
@@ -386,6 +388,9 @@ long do_syscall(struct syscall_request *req, int cpu)
|
||||||
|
preempt_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (orig_cpu != ihk_mc_get_processor_id()) {
|
||||||
|
+ kprintf("ISSUE_1555 migrated during syscall_offload\n");
|
||||||
|
+ }
|
||||||
|
dkprintf("%s: syscall num: %d got host reply: %d \n",
|
||||||
|
__FUNCTION__, req->number, res.ret);
|
||||||
|
|
||||||
8
test/issues/1555/x86_64_result.log
Normal file
8
test/issues/1555/x86_64_result.log
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
sh ./C1555.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 -O -e anon_on_demand ... done
|
||||||
|
start-time: Wed Jan 27 14:48:14 JST 2021
|
||||||
|
execveat02 failed.
|
||||||
|
end-time: Thu Jan 28 02:48:18 JST 2021
|
||||||
|
Issue#1555 test NG.
|
||||||
|
Test cases run 4855 times.
|
||||||
Reference in New Issue
Block a user