add: testcases for #1032, #1033, #1034

This commit is contained in:
Ken Sato
2018-03-15 14:31:29 +09:00
parent c107d1fdf9
commit 6a979cf4b8
18 changed files with 1785 additions and 0 deletions

View File

@ -0,0 +1,97 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_001"
int main(int argc, char* argv[])
{
int rc;
struct rusage cur_rusage;
long cur_utime, cur_stime;
long delta_utime, delta_stime;
long prev_utime = 0, prev_stime = 0;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_utime < 0 || cur_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < 0 || cur_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
/* add utime 2sec */
printf("---- add utime 2sec ----\n");
add_utime(2);
/* check rusage 2nd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_SELF ]\n");
OKNG(delta_utime < (1.9 * ONE_SEC) || delta_utime > (2.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < 0 || delta_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
/* add stime 1sec */
printf("---- add stime 1sec ----\n");
add_stime(1);
/* check rusage 3rd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 3rd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_SELF ]\n");
OKNG(delta_utime < 0 || delta_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < (0.9 * ONE_SEC) || delta_stime > (1.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,92 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_002"
int main(int argc, char* argv[])
{
int rc;
char *buf1 = NULL, *buf2 = NULL;
struct rusage cur_rusage;
long cur_maxrss, prev_maxrss = 0, delta_maxrss;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_maxrss < 0,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
/* mmap 12MB */
printf("---- mmap and access 12MB (%d KB) ----\n", 12 * 1024);
buf1 = mmap(0, 12 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf1, "mmap 1st");
memset(buf1, 0xff, 12 * M_BYTE);
/* check rusage 2nd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_maxrss < (12 * 1024),
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
/* munmap 12MB */
printf("---- munmap 12MB (%d KB) ----\n", 12 * 1024);
munmap(buf1, 12 * M_BYTE);
/* check rusage 3rd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 3rd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_maxrss != prev_maxrss,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
/* mmap 16MB */
printf("---- mmap and access 16MB (%d KB) ----\n", 16 * 1024);
buf2 = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf2, "mmap 2nd");
memset(buf2, 0xff, 16 * M_BYTE);
/* check rusage 4th */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 4th");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(delta_maxrss < (3.8 * 1024) || delta_maxrss > (4.2 * 1024),
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
munmap(buf2, 16 * M_BYTE);
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,92 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_003"
void *subth_func(void *arg)
{
/* add utime 2sec */
printf(" ---- add utime 2sec in sub thread ----\n");
add_utime(2);
/* add stime 1sec */
printf(" ---- add stime 1sec in sub thread ----\n");
add_stime(1);
printf(" ---- sub thread exit ----\n");
}
int main(int argc, char* argv[])
{
int rc;
struct rusage cur_rusage;
long cur_utime, cur_stime;
long delta_utime, delta_stime;
long prev_utime = 0, prev_stime = 0;
int status;
pthread_t sub_th;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_utime < 0 || cur_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < 0 || cur_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
printf("---- create thread and join ----\n");
status = pthread_create(&sub_th, NULL, subth_func, NULL);
CHKANDJUMP(status != 0, "pthread_create()");
pthread_join(sub_th, NULL);
/* check rusage 2nd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_SELF ]\n");
OKNG(delta_utime < (1.9 * ONE_SEC) || delta_utime > (2.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < (3.9 * ONE_SEC) || delta_stime > (4.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_004"
void *subth_func(void *arg)
{
char *buf_subth = NULL;
/* mmap 16MB */
printf(" ---- mmap and access 16MB (%d KB) in sub thread ----\n", 16 * 1024);
buf_subth = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
memset(buf_subth, 0xff, 16 * M_BYTE);
printf(" ---- munmap 16MB (%d KB) in sub thread ----\n", 16 * 1024);
/* unmap */
munmap(buf_subth, 16 * M_BYTE);
printf(" ---- sub thread exit ----\n");
}
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL;
struct rusage cur_rusage;
long cur_maxrss, prev_maxrss = 0, delta_maxrss;
int status;
pthread_t sub_th;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_maxrss < 0 ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("---- create thread and join ----\n");
status = pthread_create(&sub_th, NULL, subth_func, NULL);
CHKANDJUMP(status != 0, "pthread_create()");
pthread_join(sub_th, NULL);
/* check rusage 2nd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_maxrss < (16 * 1024) ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,119 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_005"
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL;
struct rusage cur_rusage;
long cur_utime, cur_stime, cur_maxrss;
long delta_utime, delta_stime, delta_maxrss;
long prev_utime = 0, prev_stime = 0, prev_maxrss = 0;
int pid, status;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(cur_utime < 0 || cur_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < 0 || cur_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
OKNG(cur_maxrss < 0 ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_utime = cur_utime;
prev_stime = cur_stime;
prev_maxrss = cur_maxrss;
printf("---- fork child process ----\n");
pid = fork();
CHKANDJUMP(pid == -1, "fork");
if (pid == 0) { /* child */
/* add utime 1sec */
printf(" ---- add utime 1sec in child ----\n");
add_utime(1);
/* add stime 1sec */
printf(" ---- add stime 1sec in child ----\n");
add_stime(1);
/* mmap 16MB */
printf(" ---- mmap and access 16MB (%d KB) in child ----\n", 16 * 1024);
buf = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf, "mmap");
memset(buf, 0xff, 16 * M_BYTE);
/* munmap 16MB */
printf(" ---- munmap 16MB (%d KB) in child ----\n", 16 * 1024);
munmap(buf, 16 * M_BYTE);
printf(" ---- child process exit ----\n");
_exit(123);
} else { /* parent */
/* add utime 3sec */
printf("---- add utime 3sec in parent ----\n");
add_utime(3);
printf("---- wait child's exit ----\n");
rc = waitpid(pid, &status, 0);
CHKANDJUMP(rc == -1, "waitpid");
}
/* check rusage 2nd */
rc = getrusage(RUSAGE_SELF, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_SELF ]\n");
OKNG(delta_utime < (2.9 * ONE_SEC) || delta_utime > (3.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < 0 || delta_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
OKNG(cur_maxrss > 16 * 1024,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_utime = cur_utime;
prev_stime = cur_stime;
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,118 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_006"
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL;
struct rusage cur_rusage;
long cur_utime, cur_stime, cur_maxrss;
long delta_utime, delta_stime, delta_maxrss;
long prev_utime = 0, prev_stime = 0, prev_maxrss = 0;
int pid, status;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_utime != 0,
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime != 0,
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
printf("---- fork child process ----\n");
pid = fork();
CHKANDJUMP(pid == -1, "fork");
if (pid == 0) { /* child */
/* add utime 2sec */
printf(" ---- add utime 2sec in child ----\n");
add_utime(2);
/* add stime 1sec */
printf(" ---- add stime 1sec in child ----\n");
add_stime(1);
printf(" ---- child process exit ----\n");
_exit(123);
} else { /* parent */
/* add utime 1sec */
printf("---- add utime 1sec in parent ----\n");
add_utime(1);
/* check rusage 2nd */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_utime != 0,
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime != 0,
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
printf("---- wait child's exit ----\n");
rc = waitpid(pid, &status, 0);
CHKANDJUMP(rc == -1, "waitpid");
}
/* check rusage 3rd */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(delta_utime < (1.9 * ONE_SEC) || delta_utime > (2.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < (0.9 * ONE_SEC) || delta_stime > (1.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,93 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_007"
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL, *buf_child = NULL;
struct rusage cur_rusage;
long cur_utime, cur_stime, cur_maxrss;
long delta_utime, delta_stime, delta_maxrss;
long prev_utime = 0, prev_stime = 0, prev_maxrss = 0;
int pid, status;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_maxrss != 0,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("---- fork child process ----\n");
pid = fork();
CHKANDJUMP(pid == -1, "fork");
if (pid == 0) { /* child */
/* add utime 1sec */
printf(" ---- add utime 1sec in child ----\n");
add_utime(1);
/* mmap 16MB */
printf(" ---- mmap and access 16MB (%d KB) in child ----\n", 16 * 1024);
buf = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf, "mmap");
memset(buf, 0xff, 16 * M_BYTE);
/* munmap 16MB */
printf(" ---- munmap 16MB (%d KB) in child ----\n", 16 * 1024);
munmap(buf, 16 * M_BYTE);
printf(" ---- child process exit ----\n");
_exit(123);
} else { /* parent */
/* mmap 32MB */
printf("---- mmap and access 32MB (%d KB) in parent ----\n", 32 * 1024);
buf = mmap(0, 32 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf, "mmap");
memset(buf, 0xff, 32 * M_BYTE);
/* munmap 32MB */
printf("---- munmap 32MB (%d KB) in parent ----\n", 32 * 1024);
munmap(buf, 32 * M_BYTE);
printf("---- wait child's exit ----\n");
rc = waitpid(pid, &status, 0);
CHKANDJUMP(rc == -1, "waitpid");
}
/* check rusage 2nd */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_maxrss < 16 * 1024 || cur_maxrss > 32 * 1024,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,146 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_008"
int main(int argc, char* argv[])
{
int rc;
char *buf_child = NULL, *buf_mago = NULL;
struct rusage cur_rusage;
long cur_utime, cur_stime, cur_maxrss;
long delta_utime, delta_stime, delta_maxrss;
long prev_utime = 0, prev_stime = 0, prev_maxrss = 0;
int pid, pid_mago, status, status_mago;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_utime != 0,
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime != 0,
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
OKNG(cur_maxrss != 0 ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_utime = cur_utime;
prev_stime = cur_stime;
prev_maxrss = cur_maxrss;
printf("---- fork child process ----\n");
pid = fork();
CHKANDJUMP(pid == -1, "fork");
if (pid == 0) { /* child */
printf(" ---- fork mago process ----\n");
pid_mago = fork();
CHKANDJUMP(pid_mago == -1, "fork mago");
if (pid_mago == 0) /* mago */
{
/* add utime 1sec */
printf(" ---- add utime 1sec in mago ----\n");
add_utime(1);
/* add stime 1sec */
printf(" ---- add stime 1sec in mago ----\n");
add_stime(1);
/* mmap 32MB */
printf(" ---- mmap and access 32MB (%d KB) in mago ----\n", 32 * 1024);
buf_mago = mmap(0, 32 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf_mago, "mmap");
memset(buf_mago, 0xff, 32 * M_BYTE);
/* munmap 32MB */
printf(" ---- munmap 32MB (%d KB) in mago ----\n", 32 * 1024);
munmap(buf_mago, 16 * M_BYTE);
printf(" ---- mago process exit ----\n");
_exit(234);
}
/* add utime 2sec */
printf(" ---- add utime 2sec in child ----\n");
add_utime(2);
/* add stime 1sec */
printf(" ---- add stime 1sec in child ----\n");
add_stime(1);
/* mmap 8MB */
printf(" ---- mmap and access 8MB (%d KB) in child ----\n", 8 * 1024);
buf_child = mmap(0, 8 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf_child, "mmap");
memset(buf_child, 0xff, 8 * M_BYTE);
/* munmap 8MB */
printf(" ---- munmap 8MB (%d KB) in child ----\n", 8 * 1024);
munmap(buf_child, 8 * M_BYTE);
printf(" ---- wait mago's exit ----\n");
rc = waitpid(pid_mago, &status_mago, 0);
CHKANDJUMP(rc == -1, "waitpid");
printf(" ---- child process exit ----\n");
_exit(123);
} else { /* parent */
printf("---- wait child's exit ----\n");
rc = waitpid(pid, &status, 0);
CHKANDJUMP(rc == -1, "waitpid");
}
/* check rusage 2nd */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_utime < (2.9 * ONE_SEC) || delta_utime > (3.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < (1.9 * ONE_SEC) || delta_stime > (2.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
OKNG(cur_maxrss < 32 * 1024 || cur_maxrss > 40 * 1024,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_utime = cur_utime;
prev_stime = cur_stime;
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,142 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_009"
void *child_func(void *arg)
{
int rc;
struct rusage cur_rusage;
long cur_utime, cur_stime;
long delta_utime, delta_stime;
long prev_utime = 0, prev_stime = 0;
/* check rusage in sub thread */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf(" [ RUSAGE_THREAD ]\n");
OKNG(cur_utime < 0 || cur_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < 0 || cur_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
/* add utime 2sec */
printf(" ---- add utime 2sec in sub thread ----\n");
add_utime(2);
/* add stime 1sec */
printf(" ---- add stime 1sec in sub thread ----\n");
add_stime(1);
/* check rusage in sub thread */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf(" [ RUSAGE_THREAD ]\n");
OKNG(delta_utime < (1.9 * ONE_SEC) || delta_utime > (2.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < (0.9 * ONE_SEC) || delta_stime > (1.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
fn_fail:
printf(" ---- sub thread exit ----\n");
return;
}
int main(int argc, char* argv[])
{
int rc;
struct rusage cur_rusage;
long cur_utime, cur_stime;
long delta_utime, delta_stime;
long prev_utime = 0, prev_stime = 0;
int status;
pthread_t sub_th;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
OKNG(cur_utime < 0 || cur_utime > (0.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(cur_stime < 0 || cur_stime > (0.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
/* add utime 1sec */
printf("---- add utime 1sec in main thread ----\n");
add_utime(1);
printf("---- create thread and join ----\n");
status = pthread_create(&sub_th, NULL, child_func, NULL);
CHKANDJUMP(status != 0, "pthread_create()");
pthread_join(sub_th, NULL);
/* check rusage 2nd */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_utime = get_rusage_utime(&cur_rusage);
cur_stime = get_rusage_stime(&cur_rusage);
delta_utime = cur_utime - prev_utime;
delta_stime = cur_stime - prev_stime;
printf("[ RUSAGE_THREAD ]\n");
OKNG(delta_utime < (0.9 * ONE_SEC) || delta_utime > (1.1 * ONE_SEC),
" utime: %d.%06d s (+ %d.%06d s)",
(cur_utime / ONE_SEC), (cur_utime % ONE_SEC),
(delta_utime / ONE_SEC), (delta_utime % ONE_SEC));
OKNG(delta_stime < (2.9 * ONE_SEC) || delta_stime > (3.1 * ONE_SEC),
" stime: %d.%06d s (+ %d.%06d s)",
(cur_stime / ONE_SEC), (cur_stime % ONE_SEC),
(delta_stime / ONE_SEC), (delta_stime % ONE_SEC));
prev_utime = cur_utime;
prev_stime = cur_stime;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,101 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_010"
void *subth_func(void *arg)
{
int rc;
char *buf_subth = NULL;
struct rusage cur_rusage;
long cur_maxrss;
/* check rusage in sub thread */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
printf(" [ RUSAGE_THREAD ]\n");
OKNG(cur_maxrss < (8 * 1024) ,
" maxrss: %d KB", cur_maxrss);
/* mmap 16MB */
printf(" ---- mmap and access 16MB (%d KB) in sub thread ----\n", 16 * 1024);
buf_subth = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
memset(buf_subth, 0xff, 16 * M_BYTE);
printf(" ---- munmap 16MB (%d KB) in sub thread ----\n", 16 * 1024);
/* unmap */
munmap(buf_subth, 16 * M_BYTE);
fn_fail:
printf(" ---- sub thread exit ----\n");
return;
}
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL;
struct rusage cur_rusage;
long cur_maxrss, prev_maxrss = 0, delta_maxrss;
int status;
pthread_t sub_th;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_THREAD ]\n");
OKNG(cur_maxrss < 0 ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
/* mmap 8MB */
printf("---- mmap and access 8MB (%d KB) in main thread ----\n", 8 * 1024);
buf = mmap(0, 8 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
memset(buf, 0xff, 8 * M_BYTE);
printf("---- munmap 8MB (%d KB) in main thread ----\n", 8 * 1024);
/* unmap */
munmap(buf, 8 * M_BYTE);
printf("---- create and join thread ----\n");
status = pthread_create(&sub_th, NULL, subth_func, NULL);
CHKANDJUMP(status != 0, "pthread_create()");
pthread_join(sub_th, NULL);
/* check rusage 2nd */
rc = getrusage(RUSAGE_THREAD, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_THREAD ]\n");
OKNG(cur_maxrss < (16 * 1024) ,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

View File

@ -0,0 +1,60 @@
CC = gcc
MCK_DIR=/home/satoken/ppos
obj-m += test_driver.o
MCEXEC=$(MCK_DIR)/bin/mcexec
TARGET=modules CT_001 CT_002 CT_003 CT_004 CT_005 CT_006 CT_007 CT_008 CT_009 CT_010
CPPFLAGS =
LDFLAGS =
all: $(TARGET)
modules:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
CT_001: CT_001.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_002: CT_002.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_003: CT_003.c
$(CC) -o $@ $^ $(LDFLAGS) -pthread
CT_004: CT_004.c
$(CC) -o $@ $^ $(LDFLAGS) -pthread
CT_005: CT_005.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_006: CT_006.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_007: CT_007.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_008: CT_008.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_009: CT_009.c
$(CC) -o $@ $^ $(LDFLAGS) -pthread
CT_010: CT_010.c
$(CC) -o $@ $^ $(LDFLAGS) -pthread
test: all
$(MCEXEC) ./CT_001
$(MCEXEC) ./CT_002
$(MCEXEC) ./CT_003
$(MCEXEC) ./CT_004
$(MCEXEC) ./CT_005
$(MCEXEC) ./CT_006
$(MCEXEC) ./CT_007
$(MCEXEC) ./CT_008
$(MCEXEC) ./CT_009
$(MCEXEC) ./CT_010
clean:
rm -f $(TARGET) *.o
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,189 @@
【Issue#1032#1034 動作確認】
Issue#1032#1034が解決され、既存機能に影響がないことをIssueで報告されたテストプログラム3項目と、
McKernelでのgetrusage()の基本動作確認10項目の計13項目のテストによって確認した。
なお、各テストの実行結果は./result.log として格納している。
①Issueで報告されたテストプログラムによる確認
・Issue#1032
報告で使用されたテストプログラムを100回ずつ実行し、現象が再現しないことを確認した。
実行時の出力の1回分を./result.log に記載している
②McKernelでのgetrusage()の基本動作確認
以下の内容で、Issue#1032#1034による変更が既存機能に影響しないことを確認した。
各項目はそれぞれ100回ずつ実行し、すべてでPASSすることを確認した。
基本動作確認の詳細を以下に示す。
1. テストの実行方法
以下の手順でテストを実行する
1. Makefileの変数MCK_DIRの内容を、McKernelがインストールされているディレクトリに変更する
2. sh make を実行する
3. ./ins_test_driver.sh を実行し、テスト用のデバイスドライバをロードする
4. sh make test を実行する
5. ./rm_test_driver.sh を実行し、テスト用のデバイスドライバをアンロードする
2. テスト項目
CT_001: 単一プロセスでのRUSAGE_SELFの utime, stime計測動作
観点自プロセスのutime, stime計測を確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. 2秒程度かかる処理をユーザモードで実行
3. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 0.1秒未満
4. 1秒程度かかる処理をカーネルモードで実行
- utimeの増分が 0.1秒未満
- stimeの増分が 1秒程度
CT_002: 単一プロセスでのRUSAGE_SELF のmaxrss計測
観点自プロセスのmaxrss計測を確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 0より大きい
2. mmap()で12Mバイトの領域を確保し、全体に書き込み処理を実施
3. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 12Mバイト以上
4. 確保した領域(12Mバイト)をmunmap()で解放
5. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 前回と同じ
6. mmap()で16Mバイトの領域を確保し、全体に書き込み処理を実施
7. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの増分が 4Mバイト程度
8. 確保した領域(16Mバイト)をmunmap()で解放
CT_003: サブスレッド作成時のRUSAGE_SELF のutime, stime計測
観点サブスレッドの動作がutime, stimeに加算されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. pthread_create()でサブスレッドを作成する
3. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドが、2秒程度かかる処理をユーザモードで実行
3.2. サブスレッドが、1秒程度かかる処理をカーネルモードで実行
3.3. サブスレッドが、終了する
4. メインスレッドがgetrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 2秒程度 (サブスレッド増分2秒)
- stimeの増分が 4秒程度 (サブスレッド増分1秒、メインスレッドjoin待ち3秒)
※ Linuxではjoin待ち中は他タスクへとスイッチされてシステム時間が加算されないため、
Linuxでの実行時、本項目はFAILとなる
CT_004: サブスレッド作成時のRUSAGE_SELF のmaxrss計測
観点サブスレッドの動作がmaxrssに加算されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 0より大きい
2. pthread_create()でサブスレッドを作成する
3. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドが、mmap()で16Mバイトの領域を確保し、全体に書き込み処理を実施
3.2. サブスレッドが、確保した領域(16Mバイト)をmunmap()で解放
3.3. サブスレッドが、終了する
4. メインスレッドがgetrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 16Mバイト以上
CT_005: 子プロセス作成時のRUSAGE_SELF のutime, stime, maxrss計測
観点子プロセスのutime, stime, maxrssが加算されないことを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
- maxrssの値が 0より大きい
2. fork()で子プロセスを作成する
3. 親プロセスが、3秒程度かかる処理をユーザモードで実行
3.1. 子プロセスが、1秒程度かかる処理をユーザモードで実行
3.2. 子プロセスが、1秒程度かかる処理をカーネルモードで実行
3.3. 子プロセスが、16Mバイトの領域の確保、書き込み、解放処理を実施
3.4. 子プロセスが終了する
4. 親プロセスがwaitpid()で子プロセスの終了を回収する
5. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 3秒程度
- stimeの増分が 0.1秒未満
- maxrssの値が 16Mバイト未満
CT_006: 子プロセス作成時のRUSAGE_CHILDREN のutime, stime計測
観点子プロセスのutime, stimeのみが計測されていることを確認する
1. getrusage(RUSAGE_CHILDREN) を実行し、以下を確認
- utimeの値が 0
- stimeの値が 0
2. fork()で子プロセスを作成する
3. 親プロセスが、1秒程度かかる処理をユーザモードで実行
3.1. 子プロセスが、2秒程度かかる処理をユーザモードで実行
4. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの値が 0 (子プロセスがまだ終了していないため)
- stimeの値が 0
5. 親プロセスがwaitpid()で子プロセスの終了を待つ
5.1. 子プロセスが、1秒程度かかる処理をカーネルモードで実行
5.2. 子プロセスが終了する
6. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 1秒程度
CT_007: 子プロセス作成時のRUSAGE_CHILDREN のmaxrss計測
観点子プロセスのmaxrssのみが計測されていることを確認する
1. getrusage(RUSAGE_CHILDREN) を実行し、以下を確認
- maxrssの値が 0
2. fork()で子プロセスを作成する
3. 親プロセスが、32Mバイトの領域の確保、書き込み、解放処理を実施
4. 親プロセスがwaitpid()で子プロセスの終了を待つ
4.1. 子プロセスが、1秒程度かかる処理をユーザモードで実行
4.2. 子プロセスが、16Mバイトの領域の確保、書き込み、解放処理を実施
4.3. 子プロセスが終了する
5. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- maxrssの値が 16 < maxrss < 32 (MB)
CT_008: 孫プロセス作成時のRUSAGE_CHILDREN のutime, stime, maxrss計測
観点:子プロセス、孫プロセスの使用資源が計測されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0
- stimeの値が 0
- maxrssの値が 0
2. fork()で子プロセスを作成し、waitpidで子プロセスの終了を待つ
2.1. 子プロセスが、fork()で孫プロセスを作成する
2.2. 子プロセスが、ユーザモード処理2秒、カーネルモード処理1秒 を実施
2.3. 子プロセスが、8Mバイトの領域の確保、書き込み、開放処理を実施
2.4. 子プロセスが、waitpid()で孫プロセスの終了を待つ
2.4.1. 孫プロセスが、ユーザモード処理1秒、カーネルモード処理1秒 を実施
2.4.2. 孫プロセスが、32Mバイトの領域の確保、書き込み、開放処理を実施
2.4.3. 孫プロセスが終了する
2.5. 子プロセスが終了する
3. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの値が 3秒程度 (子2秒、孫1秒の和)
- stimeの値が 2秒程度 (子1秒、孫1秒の和)
- maxrssの値が 32 < maxrss < 40 (MB) (子、孫のmaxrssの最大値)
CT_009: サブスレッド作成時のRUSAGE_THREAD のutime, stime計測
観点複数のスレッドでそれぞれのutime, stimeが計測されることを確認する
1. getrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. 1秒程度かかる処理をユーザモードで実行
3. pthread_create()でサブスレッドを作成する
4. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
4.1. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの値が 0 < utime 0.1 (秒)
- stimeの値が 0 < stime 0.1 (秒)
4.2. サブスレッドが、2秒程度かかる処理をユーザモードで実行
4.3. サブスレッドが、1秒程度かかる処理をカーネルモードで実行
4.4. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 1秒程度
4.4. サブスレッドが、終了する
5. メインスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの増分が 1秒程度
- stimeの増分が 3秒程度 (join待ち3秒)
※ Linuxではjoin待ち中は他タスクへとスイッチされてシステム時間が加算されないため、
Linuxでの実行時、本項目はFAILとなる
CT_010: サブスレッド作成時のRUSAGE_THREAD のmaxrss計測
観点複数のスレッドで、プロセス全体のmaxrssが取得されることを確認する
1. getrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 0より大きい
2. 8Mバイトの領域の確保、書き込み、解放処理を実施
3. pthread_create()でサブスレッドを作成し、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 8MB 以上
3.2. サブスレッドが16Mバイトの領域の確保、書き込み、解放処理を実施
3.3. サブスレッドが終了する
4. メインスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 16MB 以上
3. 結果
テストプログラムの1回分の実行結果をresult.log に示す。
上記の項目がすべてPASSしていることを確認した。

View File

@ -0,0 +1,7 @@
#!/bin/sh
MOD_NAME="test_driver"
DEV_PATH="/dev/test_rusage"
sudo insmod ./${MOD_NAME}.ko
sudo chmod 666 ${DEV_PATH}

View File

@ -0,0 +1,239 @@
①Issueで報告されたテストプログラムによる確認
$ mcexec ./test_mck -s getrusage -n 0
TEST_SUITE: getrusage
TEST_NUMBER: 0
ARGS:
------------------------------
show_rusage():
ru_utime=0s + 565us
ru_stime=0s + 14923us
ru_maxrss=6088
------------------------------
allocation memory 16777216 byte(16384 KiB)
alarm 2 seconds wait.
sleep 2 seconds wait.
------------------------------
show_rusage():
ru_utime=1s + 998545us
ru_stime=2s + 17802us
ru_maxrss=22492
------------------------------
free memory 16777216 byte(16384 KiB)
------------------------------
show_rusage():
ru_utime=1s + 998554us
ru_stime=2s + 17932us
ru_maxrss=22492
------------------------------
RESULT: you need check rusage value
$ mcexec ./test_mck -s getrusage -n 1
TEST_SUITE: getrusage
TEST_NUMBER: 1
ARGS:
------------------------------
show_rusage():
ru_utime=0s + 0us
ru_stime=0s + 0us
ru_maxrss=0
------------------------------
allocation memory 16777216 byte(16384 KiB)
alarm 2 seconds wait.
sleep 2 seconds wait.
free memory 16777216 byte(16384 KiB)
------------------------------
show_rusage():
ru_utime=1s + 998065us
ru_stime=2s + 2942us
ru_maxrss=21828
------------------------------
RESULT: you need check rusage value
$ mcexec ./test_mck -s getrusage -n 1
TEST_SUITE: getrusage
TEST_NUMBER: 2
ARGS:
[parent before]
------------------------------
show_rusage():
ru_utime=0s + 563us
ru_stime=0s + 10281us
ru_maxrss=6096
------------------------------
[child before]
------------------------------
show_rusage():
ru_utime=0s + 7us
ru_stime=0s + 30us
ru_maxrss=14304
------------------------------
allocation memory 16777216 byte(16384 KiB)
alarm 2 seconds wait.
sleep 2 seconds wait.
free memory 16777216 byte(16384 KiB)
[child after]
------------------------------
show_rusage():
ru_utime=1s + 997905us
ru_stime=2s + 3090us
ru_maxrss=30708
------------------------------
[parent after]
------------------------------
show_rusage():
ru_utime=0s + 580us
ru_stime=4s + 12829us
ru_maxrss=30712
------------------------------
RESULT: you need check rusage value
②McKernelでのgetrusage()の基本動作確認
/home/satoken/ppos/bin/mcexec ./CT_001
---- just started ----
[ RUSAGE_SELF ]
[OK] utime: 0.000526 s (+ 0.000526 s)
[OK] stime: 0.010256 s (+ 0.010256 s)
---- add utime 2sec ----
[ RUSAGE_SELF ]
[OK] utime: 1.997451 s (+ 1.996925 s)
[OK] stime: 0.010382 s (+ 0.000126 s)
---- add stime 1sec ----
[ RUSAGE_SELF ]
[OK] utime: 1.997458 s (+ 0.000007 s)
[OK] stime: 1.008919 s (+ 0.998537 s)
*** CT_001 PASS
/home/satoken/ppos/bin/mcexec ./CT_002
---- just started ----
[ RUSAGE_SELF ]
[OK] maxrss: 6016 KB (+ 6016 KB)
---- mmap and access 12MB (12288 KB) ----
[ RUSAGE_SELF ]
[OK] maxrss: 18356 KB (+ 12340 KB)
---- munmap 12MB (12288 KB) ----
[ RUSAGE_SELF ]
[OK] maxrss: 18356 KB (+ 0 KB)
---- mmap and access 16MB (16384 KB) ----
[ RUSAGE_SELF ]
[OK] maxrss: 22452 KB (+ 4096 KB)
*** CT_002 PASS
/home/satoken/ppos/bin/mcexec ./CT_003
---- just started ----
[ RUSAGE_SELF ]
[OK] utime: 0.000528 s (+ 0.000528 s)
[OK] stime: 0.010259 s (+ 0.010259 s)
---- create thread and join ----
---- add utime 2sec in sub thread ----
---- add stime 1sec in sub thread ----
---- sub thread exit ----
[ RUSAGE_SELF ]
[OK] utime: 1.997488 s (+ 1.996960 s)
[OK] stime: 4.005689 s (+ 3.995430 s)
*** CT_003 PASS
/home/satoken/ppos/bin/mcexec ./CT_004
---- just started ----
[ RUSAGE_SELF ]
[OK] maxrss: 6012 KB (+ 6012 KB)
---- create thread and join ----
---- mmap and access 16MB (16384 KB) in sub thread ----
---- munmap 16MB (16384 KB) in sub thread ----
---- sub thread exit ----
[ RUSAGE_SELF ]
[OK] maxrss: 30652 KB (+ 24640 KB)
*** CT_004 PASS
/home/satoken/ppos/bin/mcexec ./CT_005
---- just started ----
[ RUSAGE_SELF ]
[OK] utime: 0.000520 s (+ 0.000520 s)
[OK] stime: 0.010293 s (+ 0.010293 s)
[OK] maxrss: 6016 KB (+ 6016 KB)
---- fork child process ----
---- add utime 3sec in parent ----
---- wait child's exit ----
[ RUSAGE_SELF ]
[OK] utime: 2.995897 s (+ 2.995377 s)
[OK] stime: 0.015820 s (+ 0.005527 s)
[OK] maxrss: 6088 KB (+ 72 KB)
*** CT_005 PASS
/home/satoken/ppos/bin/mcexec ./CT_006
---- just started ----
[ RUSAGE_CHILDREN ]
[OK] utime: 0.000000 s (+ 0.000000 s)
[OK] stime: 0.000000 s (+ 0.000000 s)
---- fork child process ----
---- add utime 1sec in parent ----
[ RUSAGE_CHILDREN ]
[OK] utime: 0.000000 s (+ 0.000000 s)
[OK] stime: 0.000000 s (+ 0.000000 s)
---- wait child's exit ----
[ RUSAGE_CHILDREN ]
[OK] utime: 1.996942 s (+ 1.996942 s)
[OK] stime: 0.998600 s (+ 0.998600 s)
*** CT_006 PASS
/home/satoken/ppos/bin/mcexec ./CT_007
---- just started ----
[ RUSAGE_CHILDREN ]
[OK] maxrss: 0 KB (+ 0 KB)
---- fork child process ----
---- mmap and access 32MB (32768 KB) in parent ----
---- munmap 32MB (32768 KB) in parent ----
---- wait child's exit ----
[ RUSAGE_CHILDREN ]
[OK] maxrss: 21520 KB (+ 21520 KB)
*** CT_007 PASS
/home/satoken/ppos/bin/mcexec ./CT_008
---- just started ----
[ RUSAGE_CHILDREN ]
[OK] utime: 0.000000 s (+ 0.000000 s)
[OK] stime: 0.000000 s (+ 0.000000 s)
[OK] maxrss: 0 KB (+ 0 KB)
---- fork child process ----
---- wait child's exit ----
[ RUSAGE_CHILDREN ]
[OK] utime: 2.999739 s (+ 2.999739 s)
[OK] stime: 2.009159 s (+ 2.009159 s)
[OK] maxrss: 37900 KB (+ 37900 KB)
*** CT_008 PASS
/home/satoken/ppos/bin/mcexec ./CT_009
---- just started ----
[OK] utime: 0.000533 s (+ 0.000533 s)
[OK] stime: 0.010117 s (+ 0.010117 s)
---- add utime 1sec in main thread ----
---- create thread and join ----
[ RUSAGE_THREAD ]
[OK] utime: 0.000005 s (+ 0.000005 s)
[OK] stime: 0.000015 s (+ 0.000015 s)
---- add utime 2sec in sub thread ----
---- add stime 1sec in sub thread ----
[ RUSAGE_THREAD ]
[OK] utime: 1.996923 s (+ 1.996923 s)
[OK] stime: 0.998568 s (+ 0.998568 s)
---- sub thread exit ----
[ RUSAGE_THREAD ]
[OK] utime: 0.999024 s (+ 0.998491 s)
[OK] stime: 3.007089 s (+ 2.996972 s)
*** CT_009 PASS
/home/satoken/ppos/bin/mcexec ./CT_010
---- just started ----
[ RUSAGE_THREAD ]
[OK] maxrss: 6012 KB (+ 6012 KB)
---- mmap and access 8MB (8192 KB) in main thread ----
---- munmap 8MB (8192 KB) in main thread ----
---- create and join thread ----
[ RUSAGE_THREAD ]
[OK] maxrss: 14268 KB
---- mmap and access 16MB (16384 KB) in sub thread ----
---- munmap 16MB (16384 KB) in sub thread ----
---- sub thread exit ----
[ RUSAGE_THREAD ]
[OK] maxrss: 30652 KB (+ 24640 KB)
*** CT_010 PASS

View File

@ -0,0 +1,12 @@
#!/bin/sh
MOD_NAME="test_driver"
lsmod | grep ${MOD_NAME} &> /dev/null
if [ $? -eq 1 ]; then
echo "Module test_driver is not currently loaded"
else
sudo rmmod ${MOD_NAME}
fi

View File

@ -0,0 +1,25 @@
#ifndef HEADER_TEST_CHK_H
#define HEADER_TEST_CHK_H
#define CHKANDJUMP(cond, ...) \
do { \
if (cond) { \
fprintf(stderr, " [NG] "); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " failed\n"); \
goto fn_fail; \
} \
} while(0);
#define OKNG(cond, ...) \
do { \
if (cond) { \
CHKANDJUMP(cond, __VA_ARGS__); \
} else { \
fprintf(stdout, " [OK] "); \
fprintf(stdout, __VA_ARGS__); \
fprintf(stdout, "\n"); \
} \
} while(0);
#endif

View File

@ -0,0 +1,94 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/time.h>
#define DEV_CLASS_NAME "dev_class"
#define DEVICE_NAME "test_rusage"
static int major_num = 0;
static struct class *test_class = NULL;
static struct device *test_dev = NULL;
static int dev_open(struct inode *inode, struct file *file)
{
return 0;
}
static int dev_release(struct inode *inode, struct file *file)
{
return 0;
}
static long dev_ioctl(struct file *file, unsigned int request, unsigned long arg)
{
mdelay(request * 1000);
return 0;
/*
struct timespec s_time, c_time;
getnstimeofday(&s_time);
while (1) {
getnstimeofday(&c_time);
if ( c_time.tv_sec >= s_time.tv_sec + request &&
c_time.tv_nsec >= s_time.tv_nsec) {
break;
}
}
return 0;
*/
}
static struct file_operations fops = {
.open = dev_open,
.release = dev_release,
.unlocked_ioctl = dev_ioctl,
};
static int register_device(void)
{
major_num = register_chrdev(0, DEVICE_NAME, &fops);
if (major_num < 0) {
printk(KERN_ALERT "failed\n");
return major_num;
}
test_class = class_create(THIS_MODULE, DEV_CLASS_NAME);
test_dev = device_create(test_class, NULL, MKDEV(major_num, 0), NULL, DEVICE_NAME);
return 0;
}
void unregister_device(void)
{
device_destroy(test_class, MKDEV(major_num, 0));
class_unregister(test_class);
class_destroy(test_class);
unregister_chrdev(major_num, DEVICE_NAME);
}
static int __init dev_init(void)
{
register_device();
return 0;
}
module_init(dev_init);
static void __exit dev_exit(void)
{
unregister_device();
}
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Test for getrusage");
MODULE_VERSION("1.0");

View File

@ -0,0 +1,83 @@
#ifndef __TEST_RUSAGE_H__
#define __TEST_RUSAGE_H__
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/resource.h>
#include <errno.h>
#include <signal.h>
#define ONE_SEC 1000000
#define M_BYTE 1024 * 1024
#define cpu_pause() \
({ \
__asm__ __volatile__("pause" ::: "memory"); \
})
int sig_count;
long get_rusage_utime(struct rusage *usage)
{
if (!usage) {
return -1;
}
return (usage->ru_utime.tv_sec * ONE_SEC) + usage->ru_utime.tv_usec;
}
long get_rusage_stime(struct rusage *usage)
{
if (!usage) {
return -1;
}
return (usage->ru_stime.tv_sec * ONE_SEC) + usage->ru_stime.tv_usec;
}
long get_rusage_maxrss(struct rusage *usage)
{
if (!usage) {
return -1;
}
return usage->ru_maxrss;
}
void alrm_handler(int sig)
{
sig_count = 1;
}
void add_utime(int sec)
{
int rc;
struct sigaction sa;
/* flag clear */
sig_count = 0;
/* set sighandler */
sa.sa_handler = alrm_handler;
rc = sigaction(SIGALRM, &sa, NULL);
alarm(sec);
while (!sig_count) {
cpu_pause();
}
}
void add_stime(int sec)
{
int fd;
fd = open("/dev/test_rusage", O_RDWR);
ioctl(fd, sec, NULL);
close(fd);
}
#endif /*__TEST_RUSAGE_H__*/