From 5d6715078f1a500b71a9232fd203db386a3f7a15 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Fri, 23 Aug 2019 15:35:31 +0900 Subject: [PATCH] fix: madvise changes only the first one of vm_ranges Change-Id: I83248c1162e28c3c24ca5f6b0933e1a8ca434d6b Fujitsu: POSTK_DEBUG_TEMP_FIX_37 Refs: #1351 --- kernel/syscall.c | 10 +--- test/issues/1351/C1351.c | 74 +++++++++++++++++++++++++++++ test/issues/1351/C1351.sh | 44 +++++++++++++++++ test/issues/1351/Makefile | 11 +++++ test/issues/1351/README | 34 +++++++++++++ test/issues/1351/aarch64_result.log | 39 +++++++++++++++ test/issues/1351/show_attr.patch | 54 +++++++++++++++++++++ test/issues/1351/x86_64_result.log | 39 +++++++++++++++ 8 files changed, 296 insertions(+), 9 deletions(-) create mode 100644 test/issues/1351/C1351.c create mode 100755 test/issues/1351/C1351.sh create mode 100644 test/issues/1351/Makefile create mode 100644 test/issues/1351/README create mode 100644 test/issues/1351/aarch64_result.log create mode 100644 test/issues/1351/show_attr.patch create mode 100644 test/issues/1351/x86_64_result.log diff --git a/kernel/syscall.c b/kernel/syscall.c index 6517f84a..564c103c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -4674,7 +4674,7 @@ change_attr_process_memory_range(struct process_vm *vm, prev = previous_process_memory_range(vm, range); if(!prev) prev = range; - for (addr = start; addr < end; addr = range->end) { + for (addr = start; addr < end; addr = range->start) { if (range->start < addr) { if((error = split_process_memory_range(vm, range, addr, &range))) { break; @@ -4686,21 +4686,13 @@ change_attr_process_memory_range(struct process_vm *vm, } } -#ifdef POSTK_DEBUG_TEMP_FIX_37 if((error = change_proc(range, arg)) != 0){ -#else - if(!(error = change_proc(range, arg))){ -#endif /*POSTK_DEBUG_TEMP_FIX_37*/ break; } range = next_process_memory_range(vm, range); } -#ifdef POSTK_DEBUG_TEMP_FIX_37 if(error == 0){ -#else - if(error){ -#endif /*POSTK_DEBUG_TEMP_FIX_37*/ next = next_process_memory_range(vm, range); if(!next) next = range; diff --git a/test/issues/1351/C1351.c b/test/issues/1351/C1351.c new file mode 100644 index 00000000..021cbcdd --- /dev/null +++ b/test/issues/1351/C1351.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAP_HUGE_SHIFT 26 +#define MADV_SHOW_ATTR 201 /* for TEST */ +#define RANGE_NUM 3 +#define PAGE_NUM 2 + +int main(int argc, char **argv) +{ + void *mems[RANGE_NUM]; + int ret = 0; + int i, rc, fd; + int fds[RANGE_NUM]; + int pgnum; + size_t pgsize, map_size, def_pgsize = getpagesize(); + + if ((fd = open("TestFile", O_RDWR | O_CREAT, 0666)) == -1) { + perror("open"); + return -1; + } + + pgsize = getpagesize(); + map_size = pgsize * PAGE_NUM; + + for (i = 0; i < RANGE_NUM; i++) { + mems[i] = mmap(0, map_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + } + for (i = 0; i < RANGE_NUM; i++) { + if (i > 0) { + if (mems[i] != mems[i - 1] + map_size) { + printf("maps is not continuous\n"); + ret = -1; + goto out; + } + } + } + printf("** mmap continuous areas: Done\n"); + + rc = madvise(mems[0], map_size * RANGE_NUM, MADV_DONTDUMP); + if (rc != 0) { + perror("madvise MADV_DONTDUMP"); + ret = -1; + goto out; + } + printf("** madvise MADV_DONTDUMP: Done\n"); + + rc = madvise(mems[0], map_size * RANGE_NUM, MADV_SHOW_ATTR); + if (rc != 0) { + perror("madvise MAD_SHOW_ATTR"); + ret = -1; + goto out; + } + printf("** madvise MADV_SHOW_ATTR: Done\n"); + + munmap(mems[0], map_size * RANGE_NUM); + +out: + close(fd); + + return ret; +} diff --git a/test/issues/1351/C1351.sh b/test/issues/1351/C1351.sh new file mode 100755 index 00000000..dcf667f8 --- /dev/null +++ b/test/issues/1351/C1351.sh @@ -0,0 +1,44 @@ +#/bin/sh + +USELTP=1 +USEOSTEST=0 + +. ../../common.sh + +issue=1351 +tid=01 + +tname=`printf "C${issue}T%02d" ${tid}` +echo "*** ${tname} start *******************************" +ng=0 +${IHKOSCTL} 0 clear_kmsg +${MCEXEC} ./C1351 + +${IHKOSCTL} 0 kmsg | tee ./${tname}.txt + +line=`grep -e "attr: 0x20731000" ./${tname}.txt | wc -l` + +if [ ${line} -eq 3 ]; then + echo "*** ${tname} PASSED ******************************" +else + echo "*** ${tname} FAILED ******************************" +fi +let tid++ +echo "" + +for tp in madvise01 madvise02 madvise03 madvise04 +do + tname=`printf "C${issue}T%02d" ${tid}` + echo "*** ${tname} start *******************************" + $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 "*** ${tname} PASSED ($ok)" + else + echo "*** ${tname} FAILED (ok=$ok ng=%ng)" + fi + let tid++ + echo "" +done + diff --git a/test/issues/1351/Makefile b/test/issues/1351/Makefile new file mode 100644 index 00000000..be71e90c --- /dev/null +++ b/test/issues/1351/Makefile @@ -0,0 +1,11 @@ +CFLAGS=-g +LDFLAGS= + +TARGET=C1351 + +all: $(TARGET) + +test: all + ./C1351.sh +clean: + rm -f $(TARGET) *.o TestFile* *.txt diff --git a/test/issues/1351/README b/test/issues/1351/README new file mode 100644 index 00000000..5f0d7c23 --- /dev/null +++ b/test/issues/1351/README @@ -0,0 +1,34 @@ +【Issue#1351 動作確認】 +□ テスト内容 +1. 複数のvm_rangeから構成されるメモリ領域に対するmadviseの動作を確認 +C1351T01: + 以下の流れでmadviseの設定が複数のvm_rangeに適用されたことを確認 + 1. 複数回のmmapで連続したメモリ領域を確保する + 2. 1.で確保したメモリ領域にMADV_DODUMPを設定する (初期化) + 3. 1.で確保したメモリ領域にMADV_DONTDUMPを設定する + 4. テスト用のmadvise(MADV_SHOW_ATTR) を実行し、 + すべてのvm_rangeにMADV_DONTDUMPが設定されていることを確認する + +2. LTP を用いてmadviseの既存処理に影響しないことを確認 + 以下のLTPがPASSすることを確認 + - madvise01 + - madvise02 + - madvise03 + - madvise04 + +□ 実行手順 +1. 下記の手順でテストを実行する +$ cd +$ patch -p0 < test/issues/1351/show_attr.patch +(build mckernel) +$ cd test/issues/1351 +$ 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/1351/aarch64_result.log b/test/issues/1351/aarch64_result.log new file mode 100644 index 00000000..bd5f8d3a --- /dev/null +++ b/test/issues/1351/aarch64_result.log @@ -0,0 +1,39 @@ +*** C1351T01 start ******************************* +** mmap continuous areas: Done +** madvise MADV_DONTDUMP: Done +** madvise MADV_SHOW_ATTR: Done +[ 0]: range 0x10000017a000 - 0x10000017c000 attr: 0x20731000 +[ 0]: range 0x10000017c000 - 0x10000017e000 attr: 0x20731000 +[ 0]: range 0x10000017e000 - 0x100000180000 attr: 0x20731000 + +*** C1351T01 PASSED ****************************** + +*** C1351T02 start ******************************* +madvise01 1 TPASS : madvise test for MADV_NORMAL PASSED +madvise01 2 TPASS : madvise test for MADV_RANDOM PASSED +madvise01 3 TPASS : madvise test for MADV_SEQUENTIAL PASSED +madvise01 4 TPASS : madvise test for MADV_WILLNEED PASSED +madvise01 5 TPASS : madvise test for MADV_DONTNEED PASSED +*** C1351T02 PASSED (5) + +*** C1351T03 start ******************************* +madvise02 1 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 2 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 3 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 4 TCONF : madvise02.c:216: kernel configured with CONFIG_KSM, skip EINVAL test for MADV_MERGEABLE. +madvise02 5 TCONF : madvise02.c:237: kernel configured with CONFIG_KSM, skip EINVAL test for MADV_UNMERGEABLE. +madvise02 6 TPASS : failed as expected: TEST_ERRNO=ENOMEM(12): Cannot allocate memory +madvise02 7 TPASS : madvise succeeded as expected, see kernel commit 1998cc0 for details. +*** C1351T03 PASSED (5) + +*** C1351T04 start ******************************* +madvise03 1 TPASS : madvise test for MADV_REMOVE PASSED +madvise03 2 TPASS : madvise test for MADV_DONTFORK PASSED +madvise03 3 TPASS : madvise test for MADV_DOFORK PASSED +*** C1351T04 PASSED (3) + +*** C1351T05 start ******************************* +madvise04 1 TPASS : madvise test for MADV_DONTDUMP PASSED +madvise04 2 TPASS : madvise test for MADV_DODUMP PASSED +*** C1351T05 PASSED (2) + diff --git a/test/issues/1351/show_attr.patch b/test/issues/1351/show_attr.patch new file mode 100644 index 00000000..52da4235 --- /dev/null +++ b/test/issues/1351/show_attr.patch @@ -0,0 +1,54 @@ +diff --git kernel/include/mman.h kernel/include/mman.h +index e7d3526..3b8b0f3 100644 +--- kernel/include/mman.h ++++ kernel/include/mman.h +@@ -56,6 +56,7 @@ + #define MADV_DODUMP 17 + #define MADV_HWPOISON 100 + #define MADV_SOFT_OFFLINE 101 ++#define MADV_SHOW_ATTR 201 /* for TEST */ + + /* + * for mremap() +diff --git kernel/syscall.c kernel/syscall.c +index 564c103..9e2c56f 100644 +--- kernel/syscall.c ++++ kernel/syscall.c +@@ -4651,6 +4651,14 @@ clear_memory_range_flag(struct vm_range *range, unsigned long arg) + } + + static int ++show_memory_range_flag(struct vm_range *range, unsigned long arg) ++{ ++ kprintf("range 0x%lx - 0x%lx attr: 0x%lx\n", ++ range->start, range->end, range->flag); ++ return 0; ++} ++ ++static int + change_attr_process_memory_range(struct process_vm *vm, + uintptr_t start, uintptr_t end, + int (*change_proc)(struct vm_range *, +@@ -4779,6 +4787,7 @@ SYSCALL_DECLARE(madvise) + case MADV_REMOVE: + case MADV_DONTDUMP: + case MADV_DODUMP: ++ case MADV_SHOW_ATTR: + break; + + case MADV_HWPOISON: +@@ -4919,6 +4928,14 @@ SYSCALL_DECLARE(madvise) + error = syscall_generic_forwarding(__NR_madvise, ctx); + } + ++ if (advice == MADV_SHOW_ATTR) { ++ error = change_attr_process_memory_range(thread->vm, ++ start, end, show_memory_range_flag, 0); ++ if (error) { ++ goto out; ++ } ++ } ++ + error = 0; + out: + memory_range_write_unlock(thread->vm, &irqflags); diff --git a/test/issues/1351/x86_64_result.log b/test/issues/1351/x86_64_result.log new file mode 100644 index 00000000..d2f95768 --- /dev/null +++ b/test/issues/1351/x86_64_result.log @@ -0,0 +1,39 @@ +*** C1351T01 start ******************************* +** mmap continuous areas: Done +** madvise MADV_DONTDUMP: Done +** madvise MADV_SHOW_ATTR: Done +[ 0]: range 0x2aaaaade9000 - 0x2aaaaadeb000 attr: 0x20731000 +[ 0]: range 0x2aaaaadeb000 - 0x2aaaaaded000 attr: 0x20731000 +[ 0]: range 0x2aaaaaded000 - 0x2aaaaadef000 attr: 0x20731000 + +*** C1351T01 PASSED ****************************** + +*** C1351T02 start ******************************* +madvise01 1 TPASS : madvise test for MADV_NORMAL PASSED +madvise01 2 TPASS : madvise test for MADV_RANDOM PASSED +madvise01 3 TPASS : madvise test for MADV_SEQUENTIAL PASSED +madvise01 4 TPASS : madvise test for MADV_WILLNEED PASSED +madvise01 5 TPASS : madvise test for MADV_DONTNEED PASSED +*** C1351T02 PASSED (5) + +*** C1351T03 start ******************************* +madvise02 1 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 2 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 3 TPASS : failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument +madvise02 4 TCONF : madvise02.c:216: kernel configured with CONFIG_KSM, skip EINVAL test for MADV_MERGEABLE. +madvise02 5 TCONF : madvise02.c:237: kernel configured with CONFIG_KSM, skip EINVAL test for MADV_UNMERGEABLE. +madvise02 6 TPASS : failed as expected: TEST_ERRNO=ENOMEM(12): Cannot allocate memory +madvise02 7 TPASS : madvise succeeded as expected, see kernel commit 1998cc0 for details. +*** C1351T03 PASSED (5) + +*** C1351T04 start ******************************* +madvise03 1 TPASS : madvise test for MADV_REMOVE PASSED +madvise03 2 TPASS : madvise test for MADV_DONTFORK PASSED +madvise03 3 TPASS : madvise test for MADV_DOFORK PASSED +*** C1351T04 PASSED (3) + +*** C1351T05 start ******************************* +madvise04 1 TPASS : madvise test for MADV_DONTDUMP PASSED +madvise04 2 TPASS : madvise test for MADV_DODUMP PASSED +*** C1351T05 PASSED (2) +