diff --git a/kernel/process.c b/kernel/process.c index c130c55e..2ef74a0d 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1498,6 +1498,14 @@ int add_process_memory_range(struct process_vm *vm, INIT_LIST_HEAD(&range->tofu_stag_list); #endif + rc = vm_range_insert(vm, range); + if (rc) { + kprintf("%s: ERROR: could not insert range: %d\n", + __func__, rc); + kfree(range); + return rc; + } + rc = 0; if (phys == NOPHYS) { /* Nothing to map */ @@ -1523,17 +1531,12 @@ int add_process_memory_range(struct process_vm *vm, if (rc != 0) { kprintf("%s: ERROR: preparing page tables\n", __FUNCTION__); + remove_process_memory_range(vm, + range->start, range->end, NULL); kfree(range); return rc; } - rc = vm_range_insert(vm, range); - if (rc) { - kprintf("%s: ERROR: could not insert range: %d\n", - __FUNCTION__, rc); - return rc; - } - /* Clear content! */ if (phys != NOPHYS && !(flag & (VR_REMOTE | VR_DEMAND_PAGING)) && ((flag & VR_PROT_MASK) != VR_PROT_NONE)) { @@ -2739,6 +2742,7 @@ unsigned long extend_process_region(struct process_vm *vm, int rc; size_t len; int npages; + struct vm_range *range; size_t align_size = vm->proc->heap_extension > PAGE_SIZE ? LARGE_PAGE_SIZE : PAGE_SIZE; @@ -2755,6 +2759,15 @@ unsigned long extend_process_region(struct process_vm *vm, (align_size - 1)) & align_mask; } + /* Check if the range to be extended already exists */ + range = lookup_process_memory_range(vm, + end_allocated, new_end_allocated); + if (range) { + dkprintf("%s: warning: vm_range for extension already exists\n", + __func__); + return end_allocated; + } + len = new_end_allocated - end_allocated; npages = len >> PAGE_SHIFT; @@ -2782,7 +2795,7 @@ unsigned long extend_process_region(struct process_vm *vm, if ((rc = add_process_memory_range(vm, end_allocated, new_end_allocated, (p == 0 ? 0 : virt_to_phys(p)), flag, NULL, 0, align_shift, NULL)) != 0) { - ihk_mc_free_pages_user(p, (new_end_allocated - end_allocated) >> PAGE_SHIFT); + ihk_mc_free_pages_user(p, npages); return end_allocated; } // memory_stat_rss_add() is called in add_process_memory_range() diff --git a/kernel/syscall.c b/kernel/syscall.c index 4831478c..6e72960e 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -2735,7 +2735,7 @@ SYSCALL_DECLARE(brk) } /* If already allocated, just expand and return */ - if (address < region->brk_end_allocated) { + if (address <= region->brk_end_allocated) { region->brk_end = address; r = region->brk_end; goto out; diff --git a/test/issues/1512/C1512.sh b/test/issues/1512/C1512.sh new file mode 100755 index 00000000..f31db9ed --- /dev/null +++ b/test/issues/1512/C1512.sh @@ -0,0 +1,60 @@ +#/bin/sh + +USELTP=1 +USEOSTEST=0 + +. ../../common.sh + +issue="1512" +tid=01 +arch=`uname -p` + +tname=`printf "C${issue}T%02d" ${tid}` +echo "*** ${tname} start *******************************" +tp="shmt09" +fail_flag=0 +for rep in `seq 1 10` +do + sudo $MCEXEC $LTPBIN/$tp 2>&1 > $tp.txt + ok=`grep PASS $tp.txt | wc -l` + ng=`grep FAIL $tp.txt | wc -l` + echo "shmt09 rep $rep done. (ok=$ok ng=$ng)" + if [ $ng -ne 0 ]; then + if [ "${arch}" == "x86_64" ]; then + echo "OK: Expected fail on ${arch}" + else + echo "NG: Unexpected fail on ${arch}" + fail_flag=1 + fi + else + echo "OK: shmt09 PASS" + fi +done +if [ ${fail_flag} -eq 0 ]; then + echo "*** ${tname} PASSED" +else + echo "*** ${tname} FAILED" +fi +echo "" +let tid++ + +while read tp +do + tname=`printf "C${issue}T%02d" ${tid}` + echo "*** ${tname} start *******************************" + args="" + if [ "$tp" == "mmapstress06" ]; then + args="1" + fi + sudo $MCEXEC $LTPBIN/$tp $args 2>&1 | tee $tp.txt + ok=`grep PASS $tp.txt | wc -l` + ng=`grep FAIL $tp.txt | wc -l` + if [ $ng = 0 ]; then + echo "*** ${tname} PASSED ($ok)" + else + echo "*** ${tname} FAILED (ok=$ok ng=$ng)" + fi + let tid++ + echo "" +done < ./ltp_list + diff --git a/test/issues/1512/Makefile b/test/issues/1512/Makefile new file mode 100644 index 00000000..c5d80af8 --- /dev/null +++ b/test/issues/1512/Makefile @@ -0,0 +1,11 @@ +CFLAGS=-g +LDFLAGS= + +TARGET= + +all: $(TARGET) + +test: all + ./C1512.sh +clean: + rm -f $(TARGET) *.o *.txt diff --git a/test/issues/1512/README b/test/issues/1512/README new file mode 100644 index 00000000..32b433f9 --- /dev/null +++ b/test/issues/1512/README @@ -0,0 +1,21 @@ +【Issue#1512 動作確認】 +□ テスト内容 +1. shmt09 を10回連続で実行し、それぞれのプログラムが終了することを確認する + なお、x86_64 アーキテクチャではMcKernelのbrk位置をshrinkさせない仕様により、 + テスト動作が変わり、shmt09はFAILとなる + +2. sbrk()を利用する以下のLTPを用いて既存のbrk機能に影響が無いことを確認 + - sbrk01,02 + - mmapstress02,05,06 + +□ 実行手順 +$ 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していることを確認。 diff --git a/test/issues/1512/aarch64_result.log b/test/issues/1512/aarch64_result.log new file mode 100644 index 00000000..a0e5b28f --- /dev/null +++ b/test/issues/1512/aarch64_result.log @@ -0,0 +1,50 @@ +./C1512.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 ... done +*** C1512T01 start ******************************* +shmt09 rep 1 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 2 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 3 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 4 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 5 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 6 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 7 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 8 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 9 done. (ok=4 ng=0) +OK: shmt09 PASS +shmt09 rep 10 done. (ok=4 ng=0) +OK: shmt09 PASS +*** C1512T01 PASSED + +*** C1512T02 start ******************************* +sbrk01 1 TPASS : sbrk - Increase by 8192 bytes returned 0x20030000 +sbrk01 2 TPASS : sbrk - Increase by -8192 bytes returned 0x20032000 +*** C1512T02 PASSED (2) + +*** C1512T03 start ******************************* +sbrk02 0 TINFO : setup() bailing inc: 17196646400, ret: 0xffffffffffffffff, sbrk: 0x7fe20030000: errno=ENOMEM(12): Cannot allocate memory +sbrk02 1 TPASS : sbrk(17196646400) failed as expected: TEST_ERRNO=ENOMEM(12): Cannot allocate memory +*** C1512T03 PASSED (1) + +*** C1512T04 start ******************************* +mmapstress02 1 TPASS : Test passed + +*** C1512T04 PASSED (1) + +*** C1512T05 start ******************************* +mmapstress05 1 TPASS : Test passed + +*** C1512T05 PASSED (1) + +*** C1512T06 start ******************************* +mmapstress06 1 TPASS : Test passed + +*** C1512T06 PASSED (1) diff --git a/test/issues/1512/ltp_list b/test/issues/1512/ltp_list new file mode 100644 index 00000000..c678c88e --- /dev/null +++ b/test/issues/1512/ltp_list @@ -0,0 +1,5 @@ +sbrk01 +sbrk02 +mmapstress02 +mmapstress05 +mmapstress06 diff --git a/test/issues/1512/x86_64_result.log b/test/issues/1512/x86_64_result.log new file mode 100644 index 00000000..c2e31887 --- /dev/null +++ b/test/issues/1512/x86_64_result.log @@ -0,0 +1,50 @@ +./C1512.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 ... done +*** C1512T01 start ******************************* +shmt09 rep 1 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 2 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 3 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 4 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 5 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 6 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 7 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 8 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 9 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +shmt09 rep 10 done. (ok=3 ng=1) +OK: Expected fail on x86_64 +*** C1512T01 PASSED + +*** C1512T02 start ******************************* +sbrk01 1 TPASS : sbrk - Increase by 8192 bytes returned 0x821000 +sbrk01 2 TPASS : sbrk - Increase by -8192 bytes returned 0x823000 +*** C1512T02 PASSED (2) + +*** C1512T03 start ******************************* +sbrk02 0 TINFO : setup() bailing inc: 28068282368, ret: 0xffffffffffffffff, sbrk: 0x1550dc821000: errno=ENOMEM(12): Cannot allocate memory +sbrk02 1 TPASS : sbrk(28068282368) failed as expected: TEST_ERRNO=ENOMEM(12): Cannot allocate memory +*** C1512T03 PASSED (1) + +*** C1512T04 start ******************************* +mmapstress02 1 TPASS : Test passed + +*** C1512T04 PASSED (1) + +*** C1512T05 start ******************************* +mmapstress05 1 TPASS : Test passed + +*** C1512T05 PASSED (1) + +*** C1512T06 start ******************************* +mmapstress06 1 TPASS : Test passed + +*** C1512T06 PASSED (1)