Register PPD and release_handler at the same time.
Fix that process will remain even if signal is received between PPD registration and release_handler registration. Refs: #1201 Fujitsu: POSTK_DEBUG_TEMP_FIX_64 Change-Id: I571781963578df8cedb327f19298f595cfb137a3
This commit is contained in:
@ -38,7 +38,6 @@
|
||||
#define MCEXEC_UP_SEND_SIGNAL 0x30a02906
|
||||
#define MCEXEC_UP_GET_CPU 0x30a02907
|
||||
#define MCEXEC_UP_STRNCPY_FROM_USER 0x30a02908
|
||||
#define MCEXEC_UP_NEW_PROCESS 0x30a02909
|
||||
#define MCEXEC_UP_GET_CRED 0x30a0290a
|
||||
#define MCEXEC_UP_GET_CREDV 0x30a0290b
|
||||
#define MCEXEC_UP_GET_NODES 0x30a0290c
|
||||
@ -230,10 +229,6 @@ struct signal_desc {
|
||||
char info[128];
|
||||
};
|
||||
|
||||
struct newprocess_desc {
|
||||
int pid;
|
||||
};
|
||||
|
||||
struct sys_mount_desc {
|
||||
char *dev_name;
|
||||
char *dir_name;
|
||||
|
||||
@ -389,21 +389,15 @@ static void release_handler(ihk_os_t os, void *param)
|
||||
__FUNCTION__, info);
|
||||
}
|
||||
|
||||
static long mcexec_newprocess(ihk_os_t os,
|
||||
struct newprocess_desc *__user udesc,
|
||||
struct file *file)
|
||||
static long mcexec_newprocess(ihk_os_t os, struct file *file)
|
||||
{
|
||||
struct newprocess_desc desc;
|
||||
struct mcos_handler_info *info;
|
||||
|
||||
if (copy_from_user(&desc, udesc, sizeof(struct newprocess_desc))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
info = new_mcos_handler_info(os, file);
|
||||
if (info == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
info->pid = desc.pid;
|
||||
info->pid = task_tgid_vnr(current);
|
||||
ihk_os_register_release_handler(file, release_handler, info);
|
||||
ihk_os_set_mcos_private_data(file, info);
|
||||
return 0;
|
||||
@ -1720,12 +1714,14 @@ mcexec_getcredv(int __user *virt)
|
||||
}
|
||||
|
||||
int mcexec_create_per_process_data(ihk_os_t os,
|
||||
struct rpgtable_desc * __user rpt)
|
||||
struct rpgtable_desc * __user rpt,
|
||||
struct file *file)
|
||||
{
|
||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||
struct mcctrl_per_proc_data *ppd = NULL;
|
||||
int i;
|
||||
struct rpgtable_desc krpt;
|
||||
long ret;
|
||||
|
||||
if (rpt &&
|
||||
copy_from_user(&krpt, rpt, sizeof(krpt))) {
|
||||
@ -1745,6 +1741,10 @@ int mcexec_create_per_process_data(ihk_os_t os,
|
||||
printk("%s: ERROR: allocating per-process data\n", __FUNCTION__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if ((ret = mcexec_newprocess(os, file))) {
|
||||
kfree(ppd);
|
||||
return ret;
|
||||
}
|
||||
memset(ppd, 0, sizeof(struct mcctrl_per_proc_data)); /* debug */
|
||||
|
||||
ppd->ud = usrdata;
|
||||
@ -3159,7 +3159,7 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
|
||||
case MCEXEC_UP_CREATE_PPD:
|
||||
return mcexec_create_per_process_data(os,
|
||||
(struct rpgtable_desc * __user)arg);
|
||||
(struct rpgtable_desc * __user)arg, file);
|
||||
|
||||
case MCEXEC_UP_GET_NODES:
|
||||
return mcexec_get_nodes(os);
|
||||
@ -3171,10 +3171,6 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
return mcexec_strncpy_from_user(os,
|
||||
(struct strncpy_from_user_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_NEW_PROCESS:
|
||||
return mcexec_newprocess(os, (struct newprocess_desc *)arg,
|
||||
file);
|
||||
|
||||
case MCEXEC_UP_OPEN_EXEC:
|
||||
return mcexec_open_exec(os, (char *)arg);
|
||||
|
||||
|
||||
@ -74,7 +74,6 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = MCEXEC_UP_GET_CPUSET, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_CREATE_PPD, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_STRNCPY_FROM_USER, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_NEW_PROCESS, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_PREPARE_DMA, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_OPEN_EXEC, .func = mcctrl_ioctl },
|
||||
|
||||
@ -3807,7 +3807,6 @@ gettid_out:
|
||||
/* Child process */
|
||||
case 0: {
|
||||
int ret = 1;
|
||||
struct newprocess_desc npdesc;
|
||||
struct rpgtable_desc rpt;
|
||||
|
||||
ischild = 1;
|
||||
@ -3879,9 +3878,6 @@ fork_child_sync_pipe:
|
||||
fork_sync_top = NULL;
|
||||
pthread_mutex_init(&fork_sync_mutex, NULL);
|
||||
|
||||
npdesc.pid = getpid();
|
||||
ioctl(fd, MCEXEC_UP_NEW_PROCESS, &npdesc);
|
||||
|
||||
/* TODO: does the forked thread run in a pthread context? */
|
||||
while (getppid() != 1 &&
|
||||
fs->success == 0) {
|
||||
|
||||
@ -75,6 +75,20 @@ if ((USEOSTEST)); then
|
||||
TESTMCK="$OSTEST/bin/test_mck"
|
||||
fi
|
||||
|
||||
if ((USESTRESSTEST)); then
|
||||
if [[ -z "$STRESS_TEST" ]]; then
|
||||
if [[ -f "$HOME/stress_test/bin/signalonfork" ]]; then
|
||||
STRESS_TEST="$HOME/stress_test"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -x "$STRESS_TEST/bin/signalonfork" ]]; then
|
||||
echo no STRESS_TEST found $STRESS_TEST >&2
|
||||
exit 1
|
||||
fi
|
||||
STRESSTESTBIN="$STRESS_TEST/bin"
|
||||
fi
|
||||
|
||||
# compat variables
|
||||
BINDIR="$BIN"
|
||||
SBINDIR="$SBIN"
|
||||
|
||||
61
test/issues/1201/C1201.sh
Normal file
61
test/issues/1201/C1201.sh
Normal file
@ -0,0 +1,61 @@
|
||||
#!/bin/sh
|
||||
USELTP=1
|
||||
USEOSTEST=0
|
||||
USESTRESSTEST=1
|
||||
MCREBOOT=0
|
||||
MCSTOP=0
|
||||
|
||||
. ../../common.sh
|
||||
|
||||
################################################################################
|
||||
ng=0
|
||||
org="`pwd`"
|
||||
(
|
||||
cd "$STRESSTESTBIN"
|
||||
rm -f config.sh.bak
|
||||
if [ -f config.sh ]; then
|
||||
mv config.sh config.sh.bak
|
||||
sed -e '/^MCKDIR=/d' config.sh.bak > config.sh
|
||||
fi
|
||||
echo "MCKDIR=\"$MCK_DIR\"" >> config.sh
|
||||
if ! grep ^MCREBOOTOPTION= config.sh > /dev/null 2>&1; then
|
||||
echo "MCREBOOTOPTION=\"$BOOTPARAM\"" >> config.sh
|
||||
fi
|
||||
rm -f "$org/C1201T01.log"
|
||||
echo C1201T01 START
|
||||
for i in {1..100}; do
|
||||
sudo ./mck-stop.sh >> "$org/C1201T01.log" 2>&1
|
||||
sudo ./mck-boot.sh >> "$org/C1201T01.log" 2>&1
|
||||
./mck-mcexec.sh ./killit -np 8 -t 2000 - ./signalonfork \
|
||||
-nosignal >> "$org/C1201T01.log" 2>&1
|
||||
if [ "X$?" = X0 ]; then
|
||||
echo -n .
|
||||
else
|
||||
echo
|
||||
echo C1201T01: NG see C1201T01.log
|
||||
ng=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ $ng = 0 ]; then
|
||||
echo
|
||||
echo C1201T01: OK
|
||||
fi
|
||||
if [ -f config.sh.bak ]; then
|
||||
mv config.sh.bak config.sh
|
||||
fi
|
||||
)
|
||||
|
||||
for i in fork01:02 fork02:03 fork03:04 fork04:05 fork07:06 fork08:07 fork09:08 \
|
||||
fork10:09 fork11:10; do
|
||||
tp=`echo $i|sed 's/:.*//'`
|
||||
id=`echo $i|sed 's/.*://'`
|
||||
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
|
||||
ok=`grep TPASS $tp.txt | wc -l`
|
||||
ng=`grep TFAIL $tp.txt | wc -l`
|
||||
if [ $ng = 0 ]; then
|
||||
echo "*** C1201T$id: $tp OK ($ok)"
|
||||
else
|
||||
echo "*** C1201T$id: $tp NG (ok=$ok ng=%ng)"
|
||||
fi
|
||||
done
|
||||
53
test/issues/1201/C1201.txt
Normal file
53
test/issues/1201/C1201.txt
Normal file
@ -0,0 +1,53 @@
|
||||
Script started on Tue Jan 22 12:16:17 2019
|
||||
bash-4.2$ make test
|
||||
sh ./C1201.sh
|
||||
C1201T01 START
|
||||
....................................................................................................
|
||||
C1201T01: OK
|
||||
fork01 1 TPASS : fork() returned 22030
|
||||
fork01 2 TPASS : child pid and fork() return agree: 22030
|
||||
*** C1201T02: fork01 OK (2)
|
||||
fork02 0 TINFO : Inside parent
|
||||
fork02 0 TINFO : Inside child
|
||||
fork02 0 TINFO : exit status of wait 0
|
||||
fork02 1 TPASS : test 1 PASSED
|
||||
*** C1201T03: fork02 OK (1)
|
||||
fork03 0 TINFO : process id in parent of child from fork : 22181
|
||||
fork03 1 TPASS : test 1 PASSED
|
||||
*** C1201T04: fork03 OK (1)
|
||||
fork04 1 TPASS : Env var TERM unchanged after fork(): xterm
|
||||
fork04 2 TPASS : Env var NoTSetzWq unchanged after fork(): getenv() does not find variable set
|
||||
fork04 3 TPASS : Env var TESTPROG unchanged after fork(): FRKTCS04
|
||||
*** C1201T05: fork04 OK (3)
|
||||
fork07 0 TINFO : Forking 100 children
|
||||
fork07 0 TINFO : Forked all 100 children, now collecting
|
||||
fork07 0 TINFO : Collected all 100 children
|
||||
fork07 1 TPASS : 100/100 children read correctly from an inheritted fd
|
||||
*** C1201T06: fork07 OK (1)
|
||||
fork08 0 TINFO : parent forksval: 1
|
||||
fork08 0 TINFO : parent forksval: 2
|
||||
fork08 0 TINFO : exit status of wait expected 0 got 0
|
||||
fork08 1 TPASS : parent test PASSED
|
||||
fork08 0 TINFO : second child got char: b
|
||||
fork08 1 TPASS : Test passed in childnumber 2
|
||||
fork08 0 TINFO : exit status of wait expected 0 got 0
|
||||
fork08 2 TPASS : parent test PASSED
|
||||
fork08 0 TINFO : exit status of wait expected 0 got 0
|
||||
fork08 3 TPASS : parent test PASSED
|
||||
fork08 0 TINFO : Number of processes forked is 2
|
||||
*** C1201T07: fork08 OK (4)
|
||||
fork09 0 TINFO : OPEN_MAX is 1024
|
||||
fork09 0 TINFO : first file descriptor is 12
|
||||
fork09 0 TINFO : Parent reporting 1023 files open
|
||||
fork09 0 TINFO : Child opened new file #1023
|
||||
fork09 1 TPASS : test 1 PASSED
|
||||
*** C1201T08: fork09 OK (1)
|
||||
fork10 0 TINFO : fork child A
|
||||
fork10 1 TPASS : test 1 PASSED
|
||||
*** C1201T09: fork10 OK (1)
|
||||
fork11 1 TPASS : fork test passed, 100 processes
|
||||
*** C1201T10: fork11 OK (1)
|
||||
bash-4.2$ exit
|
||||
exit
|
||||
|
||||
Script done on Tue Jan 22 12:52:39 2019
|
||||
9
test/issues/1201/Makefile
Normal file
9
test/issues/1201/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
TARGET=
|
||||
|
||||
all:: $(TARGET)
|
||||
|
||||
test:: $(TARGET)
|
||||
sh ./C1201.sh
|
||||
|
||||
clean::
|
||||
rm -f *.o $(TARGET)
|
||||
34
test/issues/1201/README
Normal file
34
test/issues/1201/README
Normal file
@ -0,0 +1,34 @@
|
||||
【Issue#1201 動作確認】
|
||||
□ テスト内容
|
||||
テスト内容は以下の通りである。
|
||||
1. Issue 指摘事項の再現確認
|
||||
C1201T01 stress-6-1-signalonfork-001 を 100 回連続で正常終了することを確認。
|
||||
対策前は 20 回程度の連続実行で確実に再現するため、100 回の連続実行
|
||||
で発生しなければ対策されたと判断する。
|
||||
|
||||
2. LTP を用いて既存処理に影響しないことを確認
|
||||
プロセス生成処理関連を変更したため、fork のテストを選定した。
|
||||
C1201T02 fork01 が PASS すること
|
||||
C1201T03 fork02 が PASS すること
|
||||
C1201T04 fork03 が PASS すること
|
||||
C1201T05 fork04 が PASS すること
|
||||
C1201T06 fork07 が PASS すること
|
||||
C1201T07 fork08 が PASS すること
|
||||
C1201T08 fork09 が PASS すること
|
||||
C1201T09 fork10 が PASS すること
|
||||
C1201T10 fork11 が PASS すること
|
||||
|
||||
□ 実行手順
|
||||
$ make test
|
||||
|
||||
McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を
|
||||
参照する。.mck_test_config は、McKernel を ビルドした際に生成される
|
||||
mck_test_config.sample ファイルを $HOME に コピーし、適宜編集すること。
|
||||
|
||||
また、C1201.sh の以下の指定を適宜変更すること。
|
||||
STRESSTESTDIR= ストレステストが存在するパス。
|
||||
($HOME/stress_test の場合は変更不要)
|
||||
|
||||
□ 実行結果
|
||||
C1201.txt 参照。
|
||||
すべての項目をPASSしていることを確認。
|
||||
@ -4,5 +4,6 @@
|
||||
: ${SBIN:=@prefix@/sbin}
|
||||
: ${OSTEST:=}
|
||||
: ${LTP:=}
|
||||
: ${STRESS_TEST:=}
|
||||
: ${BOOTPARAM:=-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}
|
||||
: ${MCKERNEL_VERSION:=@MCKERNEL_VERSION@}
|
||||
|
||||
Reference in New Issue
Block a user