mmap: Check if size exceeds available memory when MAP_HUGETLB
If size exceeds, mmap fails and set -ENOMEM Change-Id: I4f0d6e18ee3a7c8e32e251b7ed07ee9f76305603 Refs: #1183
This commit is contained in:
committed by
Masamichi Takagi
parent
2dd8687974
commit
8efced7bf7
@ -15,6 +15,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <uio.h>
|
#include <uio.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <rusage_private.h>
|
||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
|
|
||||||
void terminate_mcexec(int, int);
|
void terminate_mcexec(int, int);
|
||||||
@ -1958,6 +1959,12 @@ SYSCALL_DECLARE(mmap)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F);
|
pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F);
|
||||||
|
|
||||||
|
if (rusage_check_overmap(len0,
|
||||||
|
(flags >> MAP_HUGE_SHIFT) & 0x3F)) {
|
||||||
|
error = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VALID_DUMMY_ADDR ((region->user_start + PTL3_SIZE - 1) & ~(PTL3_SIZE - 1))
|
#define VALID_DUMMY_ADDR ((region->user_start + PTL3_SIZE - 1) & ~(PTL3_SIZE - 1))
|
||||||
|
|||||||
@ -31,6 +31,7 @@
|
|||||||
#include <page.h>
|
#include <page.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <rusage_private.h>
|
||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
|
|
||||||
void terminate_mcexec(int, int);
|
void terminate_mcexec(int, int);
|
||||||
@ -1701,6 +1702,12 @@ SYSCALL_DECLARE(mmap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F);
|
pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F);
|
||||||
|
|
||||||
|
if (rusage_check_overmap(len0,
|
||||||
|
(flags >> MAP_HUGE_SHIFT) & 0x3F)) {
|
||||||
|
error = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VALID_DUMMY_ADDR ((region->user_start + PTL3_SIZE - 1) & ~(PTL3_SIZE - 1))
|
#define VALID_DUMMY_ADDR ((region->user_start + PTL3_SIZE - 1) & ~(PTL3_SIZE - 1))
|
||||||
|
|||||||
@ -301,6 +301,23 @@ rusage_check_oom(int numa_id, unsigned long pages, int is_user)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
rusage_check_overmap(size_t len, int pgshift)
|
||||||
|
{
|
||||||
|
int npages = 0, remain_pages = 0;
|
||||||
|
|
||||||
|
npages = (len + (1UL << pgshift) - 1) >> pgshift;
|
||||||
|
remain_pages = (rusage.total_memory - rusage.total_memory_usage)
|
||||||
|
>> pgshift;
|
||||||
|
|
||||||
|
if (npages > remain_pages) {
|
||||||
|
/* overmap */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rusage_page_add(int numa_id, unsigned long pages, int is_user)
|
rusage_page_add(int numa_id, unsigned long pages, int is_user)
|
||||||
{
|
{
|
||||||
|
|||||||
142
test/issues/1183/C1183.sh
Executable file
142
test/issues/1183/C1183.sh
Executable file
@ -0,0 +1,142 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
USELTP=1
|
||||||
|
USEOSTEST=0
|
||||||
|
|
||||||
|
arch=`uname -p`
|
||||||
|
if [ -f "./${arch}_config" ]; then
|
||||||
|
. ./${arch}_config
|
||||||
|
else
|
||||||
|
echo "$1 is unexpected arch"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
. ../../common.sh
|
||||||
|
|
||||||
|
issue=1183
|
||||||
|
tid=01
|
||||||
|
ng=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** over-mapping with MAP_HUGETLB (expect mmap FAIL)"
|
||||||
|
for pgshift in ${PGSHIFT_LIST[@]}
|
||||||
|
do
|
||||||
|
echo pageshift: ${pgshift}
|
||||||
|
${MCEXEC} ./hugemap ${OVERSIZE} ${OVERSIZE} ${pgshift}
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
tid=02
|
||||||
|
ng=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** within-mapping with MAP_HUGETLB (expect mmap SUCCESS)"
|
||||||
|
for pgshift in ${PGSHIFT_LIST[@]}
|
||||||
|
do
|
||||||
|
echo pageshift: ${pgshift}
|
||||||
|
${MCEXEC} ./hugemap ${INSIZE} ${INSIZE} ${pgshift}
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
tid=03
|
||||||
|
ng=0
|
||||||
|
idx=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** multi within-mapping with MAP_HUGETLB"
|
||||||
|
for pgshift in ${PGSHIFT_LIST[@]}
|
||||||
|
do
|
||||||
|
echo pageshift: ${pgshift}
|
||||||
|
${MCEXEC} ./hugemap `expr ${MEMALL} \* 4` ${INSIZE} ${pgshift}
|
||||||
|
|
||||||
|
if [ $? -eq ${MULTI_MAP_RESULT[${idx}]} ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
let idx++
|
||||||
|
done
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
tid=04
|
||||||
|
ng=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** over-mapping without MAP_HUGETLB (expect mmap SUCCESS)"
|
||||||
|
${MCEXEC} ./hugemap ${OVERSIZE} ${OVERSIZE} -1
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
tid=05
|
||||||
|
ng=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** within-mapping without MAP_HUGETLB (expect mmap SUCCESS)"
|
||||||
|
${MCEXEC} ./hugemap ${INSIZE} ${INSIZE} -1
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
tid=06
|
||||||
|
ng=0
|
||||||
|
echo "*** C${issue}T${tid} start *******************************"
|
||||||
|
echo "** multi within-mapping with MAP_HUGETLB (expect mmap SUCCESS)"
|
||||||
|
${MCEXEC} ./hugemap `expr ${MEMALL} \* 4` ${INSIZE} -1
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "** [OK]"
|
||||||
|
else
|
||||||
|
echo "** [NG]"
|
||||||
|
ng=1
|
||||||
|
fi
|
||||||
|
if [ ${ng} -eq 0 ]; then
|
||||||
|
echo "*** C${issue}T${tid}: PASSED"
|
||||||
|
else
|
||||||
|
echo "*** C${issue}T${tid}: FAILED"
|
||||||
|
fi
|
||||||
17
test/issues/1183/Makefile
Normal file
17
test/issues/1183/Makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CC = gcc
|
||||||
|
TARGET=hugemap
|
||||||
|
|
||||||
|
CPPFLAGS =
|
||||||
|
LDFLAGS =
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
hugemap: hugemap.c
|
||||||
|
$(CC) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
test: all
|
||||||
|
@sh ./C1183.sh
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET) *.o
|
||||||
|
|
||||||
49
test/issues/1183/README
Normal file
49
test/issues/1183/README
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
【Issue#1183 動作確認】
|
||||||
|
□ テスト内容
|
||||||
|
テストで扱うメモリサイズについて、以下のように定義する
|
||||||
|
メモリ総容量:McKernelに割り当てられたメモリ量。本テストでは10GB とする
|
||||||
|
利用可能サイズ:メモリ総容量から、マップ済ページの合計サイズを引いたもの
|
||||||
|
利用可能サイズを超えるサイズ:本テストではメモリ総容量 + 1GB とする
|
||||||
|
利用可能サイズを超えないサイズ: 本テストではメモリ総容量 / 2 とする
|
||||||
|
|
||||||
|
1. MAP_HUGETLB指定時のmmapの動作確認
|
||||||
|
C1183T01:
|
||||||
|
一回のmmapでの要求サイズが、利用可能サイズを超える場合、
|
||||||
|
利用可能なそれぞれのHugePageSizeでmmapが失敗することを確認する
|
||||||
|
|
||||||
|
C1183T02:
|
||||||
|
一回のmmapでの要求サイズが、利用可能サイズを超えない場合、
|
||||||
|
利用可能なそれぞれのHugePageSize でmmapが成功することを確認する
|
||||||
|
|
||||||
|
C1183T03:
|
||||||
|
複数回のmmapにおいて、各回のmmapでの要求サイズが利用可能サイズを超えない場合に成功し、
|
||||||
|
超えた場合に失敗することを確認する
|
||||||
|
なお、anonymous mmapは連続した物理メモリが確保出来た場合はプリマップをするため、
|
||||||
|
アーキテクチャごとに下記のような動作となる
|
||||||
|
- x86_64 : 2MBページ要求時は利用可能サイズが減少していくが、1GBページ要求時は減少しない
|
||||||
|
- aarch64 : 64KB, 2MBページ要求時は利用可能サイズが減少していくが、32MB, 1GBページ要求時は減少しない
|
||||||
|
|
||||||
|
1. MAP_HUGETLB未指定時のmmapの動作確認
|
||||||
|
C1183T04:
|
||||||
|
一回のmmapでの要求サイズが、利用可能サイズを超える場合、mmapが成功することを確認する
|
||||||
|
|
||||||
|
C1183T05
|
||||||
|
一回のmmapでの要求サイズが、利用可能サイズを超えない場合、mmapが成功することを確認する
|
||||||
|
|
||||||
|
C1183T06:
|
||||||
|
複数回のmmapにおいて、各回のmmapでの要求サイズが利用可能サイズを超えない場合に成功し、
|
||||||
|
超えた場合に失敗することを確認する
|
||||||
|
なお、MAP_HUGETLB未指定時にはプリマップは行われないため、複数回のmmapによっても
|
||||||
|
利用可能サイズは減少せず、累積のmmap要求サイズがメモリ総容量を超過してもmmapは成功する
|
||||||
|
|
||||||
|
□ 実行手順
|
||||||
|
$ 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していることを確認。
|
||||||
6
test/issues/1183/aarch64_config
Normal file
6
test/issues/1183/aarch64_config
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
MEMALL=10
|
||||||
|
BOOTPARAM="-c 1-7,9-15 -m ${MEMALL}G@0 -r 1-7:0+9-15:8 -O"
|
||||||
|
OVERSIZE=`expr ${MEMALL} + 1`
|
||||||
|
INSIZE=`expr ${MEMALL} / 2`
|
||||||
|
PGSHIFT_LIST=(0 16 21 25 30)
|
||||||
|
MULTI_MAP_RESULT=(1 1 1 0 0)
|
||||||
126
test/issues/1183/aarch64_result.log
Normal file
126
test/issues/1183/aarch64_result.log
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
*** C1183T01 start *******************************
|
||||||
|
** over-mapping with MAP_HUGETLB (expect mmap FAIL)
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 0
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 16
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 16
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 21
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 25
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 25
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 30
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
*** C1183T01: PASSED
|
||||||
|
|
||||||
|
*** C1183T02 start *******************************
|
||||||
|
** within-mapping with MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 0
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 16
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 16
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 21
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 25
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 25
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 30
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T02: PASSED
|
||||||
|
|
||||||
|
*** C1183T03 start *******************************
|
||||||
|
** multi within-mapping with MAP_HUGETLB
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 0
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 16
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 16
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 21
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 25
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 25
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 30
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T03: PASSED
|
||||||
|
|
||||||
|
*** C1183T04 start *******************************
|
||||||
|
** over-mapping without MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: -1
|
||||||
|
** mmap 11 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T04: PASSED
|
||||||
|
|
||||||
|
*** C1183T05 start *******************************
|
||||||
|
** within-mapping without MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: -1
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T05: PASSED
|
||||||
|
|
||||||
|
*** C1183T06 start *******************************
|
||||||
|
** multi within-mapping with MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: -1
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T06: PASSED
|
||||||
73
test/issues/1183/hugemap.c
Normal file
73
test/issues/1183/hugemap.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#define MAP_HUGE_SHIFT 26
|
||||||
|
|
||||||
|
void print_usage(void)
|
||||||
|
{
|
||||||
|
printf("usage: hugemap <total_mapsize(GB)> <mapsize(GB)> <pgshift>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int mmap_flag(size_t mapsize, int page_shift)
|
||||||
|
{
|
||||||
|
char *addr_mmap;
|
||||||
|
int flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||||
|
|
||||||
|
if (page_shift >= 0) {
|
||||||
|
/* mean use MAP_HUGETLB */
|
||||||
|
flags |= MAP_HUGETLB | (page_shift << MAP_HUGE_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
addr_mmap = mmap(0, mapsize,
|
||||||
|
PROT_READ | PROT_WRITE,
|
||||||
|
flags, -1, 0);
|
||||||
|
|
||||||
|
if (addr_mmap == MAP_FAILED) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
unsigned long maptotal;
|
||||||
|
size_t mapsize;
|
||||||
|
int pgshift;
|
||||||
|
|
||||||
|
void *addr = NULL;
|
||||||
|
|
||||||
|
if (argc < 4) {
|
||||||
|
print_usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
maptotal = atol(argv[1]) << 30;
|
||||||
|
mapsize = atol(argv[2]) << 30;
|
||||||
|
pgshift = atoi(argv[3]);
|
||||||
|
|
||||||
|
printf("*** total_mapsize: %ld GB, mapsize: %ld pgshift: %d\n",
|
||||||
|
maptotal >> 30, mapsize >> 30, pgshift);
|
||||||
|
|
||||||
|
for (i = 0; i < maptotal / mapsize; i++) {
|
||||||
|
printf("** mmap %ld GB: ", mapsize >> 30);
|
||||||
|
|
||||||
|
ret = mmap_flag(mapsize, pgshift);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
printf("failed\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("succeed\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("** all mmaps succeeded\n");
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
7
test/issues/1183/x86_64_config
Normal file
7
test/issues/1183/x86_64_config
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
MEMALL=10
|
||||||
|
BOOTPARAM="-c 1-7,9-15,17-23,25-31 -m ${MEMALL}G@0 -r 1-7:0+9-15:8+17-23:16+25-31:24 -O"
|
||||||
|
OVERSIZE=`expr ${MEMALL} + 1`
|
||||||
|
INSIZE=`expr ${MEMALL} / 2`
|
||||||
|
PGSHIFT_LIST=(0 21 30)
|
||||||
|
MULTI_MAP_RESULT=(1 1 0)
|
||||||
|
|
||||||
91
test/issues/1183/x86_64_result.log
Normal file
91
test/issues/1183/x86_64_result.log
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
*** C1183T01 start *******************************
|
||||||
|
** over-mapping with MAP_HUGETLB (expect mmap FAIL)
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 0
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 21
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: 30
|
||||||
|
** mmap 11 GB: failed
|
||||||
|
** [OK]
|
||||||
|
*** C1183T01: PASSED
|
||||||
|
|
||||||
|
*** C1183T02 start *******************************
|
||||||
|
** within-mapping with MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 0
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 21
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: 30
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T02: PASSED
|
||||||
|
|
||||||
|
*** C1183T03 start *******************************
|
||||||
|
** multi within-mapping with MAP_HUGETLB
|
||||||
|
pageshift: 0
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 0
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 21
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 21
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: failed
|
||||||
|
** [OK]
|
||||||
|
pageshift: 30
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: 30
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T03: PASSED
|
||||||
|
|
||||||
|
*** C1183T04 start *******************************
|
||||||
|
** over-mapping without MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 11 GB, mapsize: 11 pgshift: -1
|
||||||
|
** mmap 11 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T04: PASSED
|
||||||
|
|
||||||
|
*** C1183T05 start *******************************
|
||||||
|
** within-mapping without MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 5 GB, mapsize: 5 pgshift: -1
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T05: PASSED
|
||||||
|
|
||||||
|
*** C1183T06 start *******************************
|
||||||
|
** multi within-mapping with MAP_HUGETLB (expect mmap SUCCESS)
|
||||||
|
*** total_mapsize: 40 GB, mapsize: 5 pgshift: -1
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** mmap 5 GB: succeed
|
||||||
|
** all mmaps succeeded
|
||||||
|
** [OK]
|
||||||
|
*** C1183T06: PASSED
|
||||||
Reference in New Issue
Block a user