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:
committed by
Masamichi Takagi
parent
93dafc5f79
commit
6dce9a2bf9
@ -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()
|
||||
|
||||
@ -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
60
test/issues/1512/C1512.sh
Executable 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
11
test/issues/1512/Makefile
Normal 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
21
test/issues/1512/README
Normal 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していることを確認。
|
||||
50
test/issues/1512/aarch64_result.log
Normal file
50
test/issues/1512/aarch64_result.log
Normal 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)
|
||||
5
test/issues/1512/ltp_list
Normal file
5
test/issues/1512/ltp_list
Normal file
@ -0,0 +1,5 @@
|
||||
sbrk01
|
||||
sbrk02
|
||||
mmapstress02
|
||||
mmapstress05
|
||||
mmapstress06
|
||||
50
test/issues/1512/x86_64_result.log
Normal file
50
test/issues/1512/x86_64_result.log
Normal 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)
|
||||
Reference in New Issue
Block a user