From eae5c40f60cd30163490c480f4d31a8e0ced9554 Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Mon, 18 Jun 2018 15:55:59 +0900 Subject: [PATCH] init_process_stack: Support "ulimit -s unlimited" Refs: #1109 Change-Id: I395f012fd747cb6a2f93be71e34c7f6f3666ed67 --- kernel/process.c | 18 +++++---- test/issues/1109/C1109.sh | 76 +++++++++++++++++++++++++++++++++++ test/issues/1109/C1109.txt | 49 ++++++++++++++++++++++ test/issues/1109/C1109T01.txt | 6 +++ test/issues/1109/C1109T02.txt | 6 +++ test/issues/1109/C1109T03.txt | 6 +++ test/issues/1109/C1109T04.txt | 6 +++ test/issues/1109/C1109T05.txt | 6 +++ test/issues/1109/C1109T06.txt | 6 +++ test/issues/1109/Makefile | 6 +++ test/issues/1109/README | 25 ++++++++++++ 11 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 test/issues/1109/C1109.sh create mode 100644 test/issues/1109/C1109.txt create mode 100644 test/issues/1109/C1109T01.txt create mode 100644 test/issues/1109/C1109T02.txt create mode 100644 test/issues/1109/C1109T03.txt create mode 100644 test/issues/1109/C1109T04.txt create mode 100644 test/issues/1109/C1109T05.txt create mode 100644 test/issues/1109/C1109T06.txt create mode 100644 test/issues/1109/Makefile create mode 100644 test/issues/1109/README diff --git a/kernel/process.c b/kernel/process.c index c193ed85..02356e2e 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -2138,6 +2138,7 @@ int init_process_stack(struct thread *thread, struct program_load_desc *pn, char *stack; int error; unsigned long *p; + unsigned long maxsz; unsigned long minsz; unsigned long at_rand; struct process *proc = thread->proc; @@ -2154,19 +2155,20 @@ int init_process_stack(struct thread *thread, struct program_load_desc *pn, minsz = (pn->stack_premap + LARGE_PAGE_SIZE - 1) & LARGE_PAGE_MASK; #endif /* POSTK_DEBUG_ARCH_DEP_80 */ - size = (proc->rlimit[MCK_RLIMIT_STACK].rlim_cur - + LARGE_PAGE_SIZE - 1) & LARGE_PAGE_MASK; + maxsz = (end - thread->vm->region.map_start) / 2; + size = proc->rlimit[MCK_RLIMIT_STACK].rlim_cur; + if (size > maxsz) { + size = maxsz; + } + else if (size < minsz) { + size = minsz; + } + size = (size + LARGE_PAGE_SIZE - 1) & LARGE_PAGE_MASK; dkprintf("%s: stack_premap: %lu, rlim_cur: %lu, minsz: %lu, size: %lu\n", __FUNCTION__, pn->stack_premap, proc->rlimit[MCK_RLIMIT_STACK].rlim_cur, minsz, size); - if (size > (USER_END / 2)) { - size = USER_END / 2; - } - else if (size < minsz) { - size = minsz; - } start = (end - size) & LARGE_PAGE_MASK; /* Apply user allocation policy to stacks */ diff --git a/test/issues/1109/C1109.sh b/test/issues/1109/C1109.sh new file mode 100644 index 00000000..3c47a46c --- /dev/null +++ b/test/issues/1109/C1109.sh @@ -0,0 +1,76 @@ +#!/bin/sh +BIN= +SBIN= +OSTEST= +BOOTPARAM="-c 1-7 -m 10G@0" + +if [ -f ../../../config.h ]; then + str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'` + eval $str +fi +if [ "x$BINDIR" = x ];then + BINDIR="$BIN" +fi + +if [ -f ../../../Makefile ]; then + str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'` + eval $str +fi +if [ "x$SBINDIR" = x ];then + SBINDIR="$SBIN" +fi + +if [ -f $HOME/ostest/bin/test_mck ]; then + OSTESTDIR="$HOME/ostest" +fi +if [ "x$OSTESTDIR" = x ]; then + OSTESTDIR="$OSTEST" +fi + +if ! lsmod | grep mcctrl > /dev/null 2>&1; then + if [ ! -x $SBINDIR/mcreboot.sh ]; then + echo no mcreboot found >&2 + exit 1 + fi + sudo $SBINDIR/mcreboot.sh $BOOTPARAM +fi + +if [ ! -x $SBINDIR/ihkosctl ]; then + echo no ihkosctl found >&2 + exit 1 +fi + +maxmem=`$SBINDIR/ihkosctl 0 query mem | cut -d '@' -f 1` +mem95p=`expr $maxmem \* 95 / 100` +mem110p=`expr $maxmem \* 110 / 100` + +if [ ! -x $BINDIR/mcexec ]; then + echo no mcexec found >&2 + exit 1 +fi + +for i in 10240:9961472:01 2097152:2040109466:02 unlimited:$mem95p:03; do + ul=`echo $i|sed 's/:.*//'` + st=`echo $i|sed -e 's/^[^:]*://' -e 's/:[^:]*$//'` + id=`echo $i|sed 's/.*://'` + + sudo sh -c "ulimit -s $ul; $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s mem_stack_limits -n 0 -- -s $st" 2>&1 | tee C1109T$id.txt + if grep "RESULT: ok" C1109T$id.txt > /dev/null 2>&1; then + echo "*** C1109T$id: OK" + else + echo "*** C1109T$id: NG" + fi +done + +for i in 10M:9961472:04 2G:2040109466:05 100000G:$mem95p:06; do + ul=`echo $i|sed 's/:.*//'` + st=`echo $i|sed -e 's/^[^:]*://' -e 's/:[^:]*$//'` + id=`echo $i|sed 's/.*://'` + + $BINDIR/mcexec -s 2M,$ul $OSTESTDIR/bin/test_mck -s mem_stack_limits -n 0 -- -s $st 2>&1 | tee C1109T$id.txt + if grep "RESULT: ok" C1109T$id.txt > /dev/null 2>&1; then + echo "*** C1109T$id: OK" + else + echo "*** C1109T$id: NG" + fi +done diff --git a/test/issues/1109/C1109.txt b/test/issues/1109/C1109.txt new file mode 100644 index 00000000..3e33fff3 --- /dev/null +++ b/test/issues/1109/C1109.txt @@ -0,0 +1,49 @@ +Script started on Thu Jun 28 09:14:18 2018 +bash-4.2$ make test +sh ./C1109.sh +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 9961472 +call: 0 GiB + 9 MiB + 512 KiB +used_stack size: 9986480 (0 GiB + 9 MiB + 536 KiB) +RESULT: ok +*** C1109T01: OK +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 2040109466 +call: 1 GiB + 921 MiB + 614 KiB +used_stack size: 2040182784 (1 GiB + 921 MiB + 686 KiB) +RESULT: ok +*** C1109T02: OK +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 10200547328 +call: 9 GiB + 512 MiB + 0 KiB +used_stack size: 10200572336 (9 GiB + 512 MiB + 24 KiB) +RESULT: ok +*** C1109T03: OK +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 9961472 +call: 0 GiB + 9 MiB + 512 KiB +used_stack size: 9986480 (0 GiB + 9 MiB + 536 KiB) +RESULT: ok +*** C1109T04: OK +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 2040109466 +call: 1 GiB + 921 MiB + 614 KiB +used_stack size: 2040182784 (1 GiB + 921 MiB + 686 KiB) +RESULT: ok +*** C1109T05: OK +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 10200547328 +call: 9 GiB + 512 MiB + 0 KiB +used_stack size: 10200572336 (9 GiB + 512 MiB + 24 KiB) +RESULT: ok +*** C1109T06: OK +bash-4.2$ exit +exit + +Script done on Thu Jun 28 09:14:32 2018 diff --git a/test/issues/1109/C1109T01.txt b/test/issues/1109/C1109T01.txt new file mode 100644 index 00000000..1cc5ac3a --- /dev/null +++ b/test/issues/1109/C1109T01.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 9961472 +call: 0 GiB + 9 MiB + 512 KiB +used_stack size: 9986480 (0 GiB + 9 MiB + 536 KiB) +RESULT: ok diff --git a/test/issues/1109/C1109T02.txt b/test/issues/1109/C1109T02.txt new file mode 100644 index 00000000..d98ed049 --- /dev/null +++ b/test/issues/1109/C1109T02.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 2040109466 +call: 1 GiB + 921 MiB + 614 KiB +used_stack size: 2040182784 (1 GiB + 921 MiB + 686 KiB) +RESULT: ok diff --git a/test/issues/1109/C1109T03.txt b/test/issues/1109/C1109T03.txt new file mode 100644 index 00000000..3875955c --- /dev/null +++ b/test/issues/1109/C1109T03.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 10200547328 +call: 9 GiB + 512 MiB + 0 KiB +used_stack size: 10200572336 (9 GiB + 512 MiB + 24 KiB) +RESULT: ok diff --git a/test/issues/1109/C1109T04.txt b/test/issues/1109/C1109T04.txt new file mode 100644 index 00000000..1cc5ac3a --- /dev/null +++ b/test/issues/1109/C1109T04.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 9961472 +call: 0 GiB + 9 MiB + 512 KiB +used_stack size: 9986480 (0 GiB + 9 MiB + 536 KiB) +RESULT: ok diff --git a/test/issues/1109/C1109T05.txt b/test/issues/1109/C1109T05.txt new file mode 100644 index 00000000..d98ed049 --- /dev/null +++ b/test/issues/1109/C1109T05.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 2040109466 +call: 1 GiB + 921 MiB + 614 KiB +used_stack size: 2040182784 (1 GiB + 921 MiB + 686 KiB) +RESULT: ok diff --git a/test/issues/1109/C1109T06.txt b/test/issues/1109/C1109T06.txt new file mode 100644 index 00000000..3875955c --- /dev/null +++ b/test/issues/1109/C1109T06.txt @@ -0,0 +1,6 @@ +TEST_SUITE: mem_stack_limits +TEST_NUMBER: 0 +ARGS: -s 10200547328 +call: 9 GiB + 512 MiB + 0 KiB +used_stack size: 10200572336 (9 GiB + 512 MiB + 24 KiB) +RESULT: ok diff --git a/test/issues/1109/Makefile b/test/issues/1109/Makefile new file mode 100644 index 00000000..a8b97fda --- /dev/null +++ b/test/issues/1109/Makefile @@ -0,0 +1,6 @@ +all:: + +test:: + sh ./C1109.sh + +clean:: diff --git a/test/issues/1109/README b/test/issues/1109/README new file mode 100644 index 00000000..78c364de --- /dev/null +++ b/test/issues/1109/README @@ -0,0 +1,25 @@ +【Issue#1109 動作確認】 +□ テスト内容 +1. スタックサイズ制限を ulimit -s によって指定した場合の実行確認 +C1109T01 ulimit -s 10MB 指定し、9.5MBスタックを使用できることを確認 +C1109T02 ulimit -s 2GB 指定し、1.9GBスタックを使用できることを確認 +C1109T03 ulimit -s unlimited 指定し、全メモリの95%をスタックで使用できる + ことを確認 + +2. スタックサイズをmcexec -s オプションで指定した場合の実行確認 +C1109T04 mcexec -s 2M,10M 指定し、9.5MBスタックを使用できることを確認 +C1109T05 mcexec -s 2M,2G 指定し、1.9GBスタックを使用できることを確認 +C1109T06 mcexec -s 2M,100000G 指定し、全メモリの95%をスタックで使用できる + ことを確認 + +□ 実行手順 +$ make test + +実行できない場合は、C1109.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス +OSTEST= OSTEST が存在するパス + +□ 実行結果 +C1109.txt 参照。 +全ての項目が OK となっていることを確認。