add_process_memory_range: Change order of update page and insert range.

Unintended update page was occurred, when inserting range failed.

Change-Id: I3d117b8613c5fbb64463c759b5fcc81db22bd624
refs: #1512
This commit is contained in:
Ken Sato
2021-01-07 16:19:57 +09:00
committed by Masamichi Takagi
parent 93dafc5f79
commit 6dce9a2bf9
8 changed files with 219 additions and 9 deletions

View File

@ -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()

View File

@ -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;

60
test/issues/1512/C1512.sh Executable file
View File

@ -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

11
test/issues/1512/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=
all: $(TARGET)
test: all
./C1512.sh
clean:
rm -f $(TARGET) *.o *.txt

21
test/issues/1512/README Normal file
View File

@ -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していることを確認。

View File

@ -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)

View File

@ -0,0 +1,5 @@
sbrk01
sbrk02
mmapstress02
mmapstress05
mmapstress06

View File

@ -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)