diff --git a/test/mng_mod/issues/1032-34/CT_001.c b/test/mng_mod/issues/1032-34/CT_001.c new file mode 100644 index 00000000..103512f6 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_001.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_002.c b/test/mng_mod/issues/1032-34/CT_002.c new file mode 100644 index 00000000..bd5e3beb --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_002.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_003.c b/test/mng_mod/issues/1032-34/CT_003.c new file mode 100644 index 00000000..c5affca3 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_003.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_004.c b/test/mng_mod/issues/1032-34/CT_004.c new file mode 100644 index 00000000..d7037b26 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_004.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_005.c b/test/mng_mod/issues/1032-34/CT_005.c new file mode 100644 index 00000000..16aad15d --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_005.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_006.c b/test/mng_mod/issues/1032-34/CT_006.c new file mode 100644 index 00000000..f97f3aef --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_006.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_007.c b/test/mng_mod/issues/1032-34/CT_007.c new file mode 100644 index 00000000..191fc0d9 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_007.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_008.c b/test/mng_mod/issues/1032-34/CT_008.c new file mode 100644 index 00000000..19462d22 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_008.c @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_009.c b/test/mng_mod/issues/1032-34/CT_009.c new file mode 100644 index 00000000..516f52af --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_009.c @@ -0,0 +1,142 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/CT_010.c b/test/mng_mod/issues/1032-34/CT_010.c new file mode 100644 index 00000000..fbafa4d1 --- /dev/null +++ b/test/mng_mod/issues/1032-34/CT_010.c @@ -0,0 +1,101 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#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; +} diff --git a/test/mng_mod/issues/1032-34/Makefile b/test/mng_mod/issues/1032-34/Makefile new file mode 100644 index 00000000..496848eb --- /dev/null +++ b/test/mng_mod/issues/1032-34/Makefile @@ -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 diff --git a/test/mng_mod/issues/1032-34/README b/test/mng_mod/issues/1032-34/README new file mode 100644 index 00000000..69a5384b --- /dev/null +++ b/test/mng_mod/issues/1032-34/README @@ -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していることを確認した。 diff --git a/test/mng_mod/issues/1032-34/ins_test_driver.sh b/test/mng_mod/issues/1032-34/ins_test_driver.sh new file mode 100755 index 00000000..82a73e57 --- /dev/null +++ b/test/mng_mod/issues/1032-34/ins_test_driver.sh @@ -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} diff --git a/test/mng_mod/issues/1032-34/result.log b/test/mng_mod/issues/1032-34/result.log new file mode 100644 index 00000000..22223d7a --- /dev/null +++ b/test/mng_mod/issues/1032-34/result.log @@ -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 + diff --git a/test/mng_mod/issues/1032-34/rm_test_driver.sh b/test/mng_mod/issues/1032-34/rm_test_driver.sh new file mode 100755 index 00000000..280efec2 --- /dev/null +++ b/test/mng_mod/issues/1032-34/rm_test_driver.sh @@ -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 + diff --git a/test/mng_mod/issues/1032-34/test_chk.h b/test/mng_mod/issues/1032-34/test_chk.h new file mode 100644 index 00000000..e0f45e6e --- /dev/null +++ b/test/mng_mod/issues/1032-34/test_chk.h @@ -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 diff --git a/test/mng_mod/issues/1032-34/test_driver.c b/test/mng_mod/issues/1032-34/test_driver.c new file mode 100644 index 00000000..ab45fb63 --- /dev/null +++ b/test/mng_mod/issues/1032-34/test_driver.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include + +#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"); diff --git a/test/mng_mod/issues/1032-34/test_rusage.h b/test/mng_mod/issues/1032-34/test_rusage.h new file mode 100644 index 00000000..1db6644d --- /dev/null +++ b/test/mng_mod/issues/1032-34/test_rusage.h @@ -0,0 +1,83 @@ +#ifndef __TEST_RUSAGE_H__ +#define __TEST_RUSAGE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#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__*/