diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h index bb3f6c00..902720e8 100644 --- a/arch/arm64/kernel/include/syscall_list.h +++ b/arch/arm64/kernel/include/syscall_list.h @@ -83,6 +83,7 @@ SYSCALL_HANDLED(175, geteuid) SYSCALL_HANDLED(176, getgid) SYSCALL_HANDLED(177, getegid) SYSCALL_HANDLED(178, gettid) +SYSCALL_HANDLED(179, sysinfo) SYSCALL_DELEGATED(188, msgrcv) SYSCALL_DELEGATED(189, msgsnd) SYSCALL_DELEGATED(192, semtimedop) diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h index 576ee0ae..270ab1ed 100644 --- a/arch/x86_64/kernel/include/syscall_list.h +++ b/arch/x86_64/kernel/include/syscall_list.h @@ -74,6 +74,7 @@ SYSCALL_DELEGATED(89, readlink) SYSCALL_HANDLED(96, gettimeofday) SYSCALL_HANDLED(97, getrlimit) SYSCALL_HANDLED(98, getrusage) +SYSCALL_HANDLED(99, sysinfo) SYSCALL_HANDLED(100, times) SYSCALL_HANDLED(101, ptrace) SYSCALL_HANDLED(102, getuid) diff --git a/kernel/include/rusage_private.h b/kernel/include/rusage_private.h index d5fc8aad..70235eda 100644 --- a/kernel/include/rusage_private.h +++ b/kernel/include/rusage_private.h @@ -56,6 +56,24 @@ rusage_total_memory_add(unsigned long size) #endif } +static inline unsigned long +rusage_get_total_memory() +{ + return rusage.total_memory; +} + +static inline unsigned long +rusage_get_free_memory() +{ + return rusage.total_memory - rusage.total_memory_usage; +} + +static inline unsigned long +rusage_get_usage_memory() +{ + return rusage.total_memory_usage; +} + static inline void rusage_rss_add(unsigned long size) { @@ -399,6 +417,24 @@ rusage_rss_add(unsigned long size) { } +static inline unsigned long +rusage_get_total_memory() +{ + return 0; +} + +static inline unsigned long +rusage_get_free_memory() +{ + return 0; +} + +static inline unsigned long +rusage_get_usage_memory() +{ + return 0; +} + static inline void rusage_rss_sub(unsigned long size) { diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index bbc02afd..156aa3b7 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -443,6 +443,22 @@ struct rusage { long ru_nivcsw; }; +struct sysinfo { + long uptime; /* Seconds since boot */ + unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ + unsigned long totalram; /* Total usable main memory size */ + unsigned long freeram; /* Available memory size */ + unsigned long sharedram; /* Amount of shared memory */ + unsigned long bufferram; /* Memory used by buffers */ + unsigned long totalswap; /* Total swap space size */ + unsigned long freeswap; /* swap space still available */ + unsigned short procs; /* Number of current processes */ + unsigned long totalhigh; /* Total high memory size */ + unsigned long freehigh; /* Available high memory size */ + unsigned int mem_unit; /* Memory unit size in bytes */ + char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ +}; + extern void terminate(int, int); struct tod_data_s { diff --git a/kernel/syscall.c b/kernel/syscall.c index 49456286..da3ecbcc 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -6708,6 +6708,27 @@ SYSCALL_DECLARE(getrusage) return 0; } +SYSCALL_DECLARE(sysinfo) +{ + struct sysinfo *sysinfo = (struct sysinfo *)ihk_mc_syscall_arg0(ctx); + struct sysinfo __sysinfo; + int ret = 0; + + memset(&__sysinfo, '\0', sizeof(struct sysinfo)); + + __sysinfo.totalram = rusage_get_total_memory(); + __sysinfo.freeram = rusage_get_free_memory(); + __sysinfo.mem_unit = 1; // always one unit for McKernel + + if (copy_to_user(sysinfo, &__sysinfo, sizeof(struct sysinfo))) { + ret = -EFAULT; + goto out; + } + +out: + return ret; +} + extern int ptrace_traceme(void); extern void set_single_step(struct thread *thread); diff --git a/test/issues/1389/C1389.sh b/test/issues/1389/C1389.sh new file mode 100755 index 00000000..695c8ec7 --- /dev/null +++ b/test/issues/1389/C1389.sh @@ -0,0 +1,43 @@ +#/bin/sh + +USELTP=1 +USEOSTEST=0 + +BOOTPARAM="-c 1-7 -m 10G@0,10G@1 -O" +. ../../common.sh + +issue="1389" +tid=01 + +for tsuf in "01" "02.sh" +do + tname=`printf "C${issue}T%02d" ${tid}` + echo "*** ${tname} start *******************************" + ${MCEXEC} ./C1389T${tsuf} + + if [ $? -eq 0 ]; then + echo "*** ${tname} PASSED ******************************" + else + echo "*** ${tname} FAILED ******************************" + fi + let tid++ + echo "" +done + +for tp in "mtest01 -p80" "mtest01 -p80 -w" "mem01" +do + tname=`printf "C${issue}T%02d" ${tid}` + echo "*** ${tname} start *******************************" +echo ${tp} + sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee ${tname}.txt + ok=`grep PASS ${tname}.txt | wc -l` + ng=`grep FAIL ${tname}.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/1389/C1389T01.c b/test/issues/1389/C1389T01.c new file mode 100644 index 00000000..2c67dfe3 --- /dev/null +++ b/test/issues/1389/C1389T01.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include + +int main(void) +{ + struct sysinfo *info; + int ret = 0, rc = 0; + unsigned long assigned_mem = (20UL << 30); + unsigned long _totalram, _freeram; + unsigned int _mem_unit; + + info = malloc(sizeof(struct sysinfo)); + rc = sysinfo(info); + if (rc) { + perror("sysinfo fail: "); + ret = -1; + goto out; + } + + _totalram = info->totalram; + _freeram = info->freeram; + _mem_unit = info->mem_unit; + + // Check totalram + if (0.95 * assigned_mem < _totalram && + _totalram < assigned_mem) { + printf("[OK] totalram: %ld\n", _totalram); + } + else { + printf("[NG] unexpected totalram: %ld\n", _totalram); + printf(" expected range: %ld - %ld\n", + (unsigned long)(0.95 * assigned_mem), + assigned_mem); + ret = -1; + goto out; + } + + // Check freeram + if (0.95 * _totalram < _freeram && + _freeram < _totalram) { + printf("[OK] freeram: %ld\n", _freeram); + } + else { + printf("[NG] unexpected freeram: %ld\n", _freeram); + ret = -1; + goto out; + } + + // Check mem_unit + if (_mem_unit == 1) { + printf("[OK] mem_unit: %ld\n", _mem_unit); + } + else { + printf("[NG] unexpected mem_unit: %ld\n", _mem_unit); + ret = -1; + goto out; + } + + free(info); +out: + return ret; +} diff --git a/test/issues/1389/C1389T02.sh b/test/issues/1389/C1389T02.sh new file mode 100755 index 00000000..48ce748c --- /dev/null +++ b/test/issues/1389/C1389T02.sh @@ -0,0 +1,88 @@ +#!/bin/sh + +ASSIGNED_MEM=`echo '1024 * 1024 * 1024 * 20' | bc` +cat /proc/meminfo > ./cur_meminfo.txt + +# Check MemTotal +MemTotalTxt=`cat ./cur_meminfo.txt | grep MemTotal | awk '{print $(NF-1)}'` +MemTotal=`echo "1024 * ${MemTotalTxt}" | bc` + +lower_limit=`echo "${ASSIGNED_MEM} * 0.95" | bc` +lower_limit=${lower_limit%.*} +upper_limit=${ASSIGNED_MEM} +tgt=${MemTotal} + +if [ ${tgt} -ge ${lower_limit} -a ${tgt} -lt ${upper_limit} ]; then + echo "[OK] MemTotal: ${tgt}" +else + echo "[NG] unexpected MemTotal: ${tgt}" + exit 1 +fi + +# Check MemFree +MemFreeTxt=`cat ./cur_meminfo.txt | grep MemFree | awk '{print $(NF-1)}'` +MemFree=`echo "1024 * ${MemFreeTxt}" | bc` + +lower_limit=`echo "${MemTotal} * 0.95" | bc` +lower_limit=${lower_limit%.*} +upper_limit=${MemTotal} +tgt=${MemFree} + +if [ ${tgt} -ge ${lower_limit} -a ${tgt} -lt ${upper_limit} ]; then + echo "[OK] MemFree: ${tgt}" +else + echo "[NG] unexpected MemFree: ${tgt}" + exit 1 +fi + +# Check SwapTotal +SwapTotalTxt=`cat ./cur_meminfo.txt | grep SwapTotal | awk '{print $(NF-1)}'` +SwapTotal=`echo "1024 * ${SwapTotalTxt}" | bc` + +tgt=${SwapTotal} + +if [ ${tgt} -eq 0 ]; then + echo "[OK] SwapTotal: ${tgt}" +else + echo "[NG] unexpected SwapTotal: ${tgt}" + exit 1 +fi + +# Check SwapFree +SwapFreeTxt=`cat ./cur_meminfo.txt | grep SwapFree | awk '{print $(NF-1)}'` +SwapFree=`echo "1024 * ${SwapFreeTxt}" | bc` + +tgt=${SwapFree} + +if [ ${tgt} -eq 0 ]; then + echo "[OK] SwapFree: ${tgt}" +else + echo "[NG] unexpected SwapFree: ${tgt}" + exit 1 +fi + +# Check CommitLimit +CommitLimitTxt=`cat ./cur_meminfo.txt | grep CommitLimit | awk '{print $(NF-1)}'` +CommitLimit=`echo "1024 * ${CommitLimitTxt}" | bc` + +tgt=${CommitLimit} + +if [ ${tgt} -eq ${MemFree} ]; then + echo "[OK] CommitLimit: ${tgt}" +else + echo "[NG] unexpected CommitLimit: ${tgt}" + exit 1 +fi + +# Check Committed_AS +Committed_ASTxt=`cat ./cur_meminfo.txt | grep Committed_AS | awk '{print $(NF-1)}'` +Committed_AS=`echo "1024 * ${Committed_ASTxt}" | bc` + +tgt=${Committed_AS} + +if [ ${tgt} -eq $((${MemTotal} - ${MemFree})) ]; then + echo "[OK] Committed_AS: ${tgt}" +else + echo "[NG] unexpected Committed_AS: ${tgt}" + exit 1 +fi diff --git a/test/issues/1389/Makefile b/test/issues/1389/Makefile new file mode 100644 index 00000000..e75ede36 --- /dev/null +++ b/test/issues/1389/Makefile @@ -0,0 +1,11 @@ +CFLAGS=-g +LDFLAGS= + +TARGET=C1389T01 + +all: $(TARGET) + +test: all + sh ./C1389.sh +clean: + rm -f $(TARGET) *.o *.txt diff --git a/test/issues/1389/README b/test/issues/1389/README new file mode 100644 index 00000000..9cca353e --- /dev/null +++ b/test/issues/1389/README @@ -0,0 +1,46 @@ +【Issue#1389 動作確認】 +□ テスト内容 +本Issueの対応で、sysinfo()と/proc/meminfo の下記項目においてMcKernelの情報を +返すようにした。 +[sysinfo] + totalram : rusage_global の total_memory + freeram : rusage_global の total_memory - usage_memory + mem_unit : 常に1 +[/proc/meminfo] + MemTotal : rusage_global の total_memory + MemFree : rusage_global の total_memory - usage_memory + SwapTotal : 常に0 + SwapFree : 常に0 + CommitLimit : rusage_global の total_memory - usage_memory + Committed_AS : rusage_global の usage_memory + +1. 本Issueで対応したsysinfo() と /proc/meminfo の値が想定どおりとなっていることを確認 +McKernelへのメモリ割り当てを 10G@0,10G@1 とした状態で下記プログラムを実行 +C1389T01: sysinfo() で取得される値が下記のとおりであることを確認 + totalram : 20GiB * 0.95 以上、20GiB 未満であること + freeram : totralram * 0.95 以上、totalram 未満であること + mem_unit : 1 であること +C1389T02: /proc/meminfo から取得される値が下記のとおりであることを確認 + MemTotal : 20GiB * 0.95 以上、20GiB 未満であること + MemFree : MemTotal * 0.95 以上、MemTotal 未満であること + SwapTotal : 0 であること + SwapFree : 0 であること + CommitLimit : MemFreeと同値であること + Committed_AS : MemTotal - MemFree と同値であること + +2. 本Issueで対応したsysinfo() の項目を利用する以下のLTPを実行し、PASSすることを確認 + - mtest01 -p80 + - mtest01 -p80 -w + - mem01 + +□ 実行手順 +$ 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/1389/aarch64_result.log b/test/issues/1389/aarch64_result.log new file mode 100644 index 00000000..dded9a0b --- /dev/null +++ b/test/issues/1389/aarch64_result.log @@ -0,0 +1,77 @@ +sh ./C1389.sh +mcstop+release.sh ... done +mcreboot.sh -c 1-7 -m 10G@0,10G@1 -O ... done +*** C1389T01 start ******************************* +[OK] totalram: 21472215040 +[OK] freeram: 21461794816 +[OK] mem_unit: 1 +*** C1389T01 PASSED ****************************** + +*** C1389T02 start ******************************* +[OK] MemTotal: 21472215040 +[OK] MemFree: 21452750848 +[OK] SwapTotal: 0 +[OK] SwapFree: 0 +[OK] CommitLimit: 21452750848 +[OK] Committed_AS: 19464192 +*** C1389T02 PASSED ****************************** + +*** C1389T03 start ******************************* +mtest01 -p80 +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +mtest01.c:134: INFO: Filling up 80% of free ram which is 16760729 kbytes +mtest01.c:149: INFO: ... child 50935 starting +mtest01.c:149: INFO: ... child 50944 starting +mtest01.c:149: INFO: ... child 50953 starting +mtest01.c:149: INFO: ... child 50962 starting +mtest01.c:149: INFO: ... child 50971 starting +mtest01.c:149: INFO: ... child 50980 starting +mtest01.c:169: INFO: ... [t=300] 1434451968 bytes allocated only in child 50980 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50935 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50944 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50953 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50962 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50971 +mtest01.c:221: PASS: 16760729 kbytes allocated + +Summary: +passed 1 +failed 0 +skipped 0 +warnings 0 +*** C1389T03 PASSED (1) + +*** C1389T04 start ******************************* +mtest01 -p80 -w +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +mtest01.c:134: INFO: Filling up 80% of free ram which is 16759654 kbytes +mtest01.c:149: INFO: ... child 51017 starting +mtest01.c:149: INFO: ... child 51026 starting +mtest01.c:149: INFO: ... child 51035 starting +mtest01.c:149: INFO: ... child 51044 starting +mtest01.c:149: INFO: ... child 51053 starting +mtest01.c:149: INFO: ... child 51062 starting +mtest01.c:166: INFO: ... [t=300] 1433403392 bytes allocated and used in child 51062 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51017 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51026 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51035 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51044 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51053 +mtest01.c:221: PASS: 16759654 kbytes allocated (and written to) + +Summary: +passed 1 +failed 0 +skipped 0 +warnings 0 +*** C1389T04 PASSED (1) + +*** C1389T05 start ******************************* +mem01 +mem01 0 TINFO : Free Mem: 20465 Mb +mem01 0 TINFO : Free Swap: 0 Mb +mem01 0 TINFO : Total Free: 20465 Mb +mem01 0 TINFO : Total Tested: 3056 Mb +mem01 0 TINFO : touching 3056MB of malloc'ed memory (linear) +mem01 1 TPASS : malloc - alloc of 3056MB succeeded +*** C1389T05 PASSED (1) diff --git a/test/issues/1389/x86_64_result.log b/test/issues/1389/x86_64_result.log new file mode 100644 index 00000000..62fd9c2d --- /dev/null +++ b/test/issues/1389/x86_64_result.log @@ -0,0 +1,77 @@ +sh ./C1389.sh +mcstop+release.sh ... done +mcreboot.sh -c 1-7 -m 10G@0,10G@1 -O ... done +*** C1389T01 start ******************************* +[OK] totalram: 21463240704 +[OK] freeram: 21459673088 +[OK] mem_unit: 1 +*** C1389T01 PASSED ****************************** + +*** C1389T02 start ******************************* +[OK] MemTotal: 21463240704 +[OK] MemFree: 21453983744 +[OK] SwapTotal: 0 +[OK] SwapFree: 0 +[OK] CommitLimit: 21453983744 +[OK] Committed_AS: 9256960 +*** C1389T02 PASSED ****************************** + +*** C1389T03 start ******************************* +mtest01 -p80 +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +mtest01.c:134: INFO: Filling up 80% of free ram which is 16762396 kbytes +mtest01.c:149: INFO: ... child 20718 starting +mtest01.c:149: INFO: ... child 20727 starting +mtest01.c:149: INFO: ... child 20736 starting +mtest01.c:149: INFO: ... child 20745 starting +mtest01.c:149: INFO: ... child 20754 starting +mtest01.c:149: INFO: ... child 20763 starting +mtest01.c:169: INFO: ... [t=300] 1436549120 bytes allocated only in child 20763 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20718 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20727 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20736 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20745 +mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20754 +mtest01.c:221: PASS: 16762396 kbytes allocated + +Summary: +passed 1 +failed 0 +skipped 0 +warnings 0 +*** C1389T03 PASSED (1) + +*** C1389T04 start ******************************* +mtest01 -p80 -w +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +mtest01.c:134: INFO: Filling up 80% of free ram which is 16761132 kbytes +mtest01.c:149: INFO: ... child 20802 starting +mtest01.c:149: INFO: ... child 20811 starting +mtest01.c:149: INFO: ... child 20820 starting +mtest01.c:149: INFO: ... child 20829 starting +mtest01.c:149: INFO: ... child 20838 starting +mtest01.c:149: INFO: ... child 20847 starting +mtest01.c:166: INFO: ... [t=300] 1435500544 bytes allocated and used in child 20847 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20802 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20811 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20820 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20829 +mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20838 +mtest01.c:221: PASS: 16761132 kbytes allocated (and written to) + +Summary: +passed 1 +failed 0 +skipped 0 +warnings 0 +*** C1389T04 PASSED (1) + +*** C1389T05 start ******************************* +mem01 +mem01 0 TINFO : Free Mem: 20463 Mb +mem01 0 TINFO : Free Swap: 0 Mb +mem01 0 TINFO : Total Free: 20463 Mb +mem01 0 TINFO : Total Tested: 3056 Mb +mem01 0 TINFO : touching 3056MB of malloc'ed memory (linear) +mem01 1 TPASS : malloc - alloc of 3056MB succeeded +*** C1389T05 PASSED (1)