/* ihklib001_lin.c COPYRIGHT FUJITSU LIMITED 2018 */ #include #include #include #include #include #include #include #include "util.h" #include "mck_bps_conflict.h" #define DEBUG int main(int argc, char **argv) { int ret, status; FILE *fp, *fp1, *fp2; char buf[65536], buf1[65536], buf2[65536]; size_t nread; char cmd[1024]; char fn[256]; char kargs[256]; char logname[256], *envstr, *groups; int cpus[4]; int num_cpus; struct ihk_mem_chunk mem_chunks[4]; int num_mem_chunks; int indices[2]; int num_os_instances; ssize_t kmsg_size; struct ihk_ikc_cpu_map ikc_map[2]; int num_numa_nodes; unsigned long memfree[4]; int num_pgsizes; long pgsizes[3]; struct ihk_os_rusage rusage; char *retstr; int boot_shutdown = 0; int mcexec_shutdown = 0; int ikc_map_by_func = 0; int opt; while ((opt = getopt(argc, argv, "bxm")) != -1) { switch (opt) { case 'b': boot_shutdown = 1; break; case 'x': mcexec_shutdown = 1; break; case 'm': ikc_map_by_func = 1; break; default: /* '?' */ printf("unknown option %c\n", optopt); exit(1); } } fp = popen("logname", "r"); nread = fread(logname, 1, sizeof(logname), fp); CHKANDJUMP(nread == 0, -1, "%s: ERROR: fread\n", __func__); retstr = strrchr(logname, '\n'); if (retstr) { *retstr = 0; } printf("logname=%s\n", logname); envstr = getenv("MYGROUPS"); CHKANDJUMP(envstr == NULL, -1, "%s: ERROR: MYGROUPS not defined\n", __func__); groups = strdup(envstr); retstr = strrchr(groups, '\n'); if (retstr) { *retstr = 0; } printf("groups=%s\n", groups); if (geteuid() != 0) { printf("Execute as a root\n"); } /* Test error handling */ // reserve cpu cpus[0] = 3; cpus[2] = 1; num_cpus = 2; ret = ihk_reserve_cpu(0, cpus, num_cpus); OKNG(ret != 0, "ihk_reserve_cpu (1)\n"); // get # of reserved cpus num_cpus = ihk_get_num_reserved_cpus(0); //printf("num_cpus=%d\n", num_cpus); OKNG(num_cpus < 0, "ihk_get_num_reserved_cpu (1)\n"); // get reserved cpus ret = ihk_query_cpu(0, cpus, 1); OKNG(ret != 0, "ihk_query_cpu (1)\n"); // release cpu cpus[0] = 1; num_cpus = 1; ret = ihk_release_cpu(0, cpus, num_cpus); OKNG(ret != 0, "ihk_release_cpu (1)\n"); // reserve mem 128m@0,64m@0: expected to fail num_mem_chunks = 2; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; mem_chunks[1].size = 64*1024*1024ULL; mem_chunks[1].numa_node_number = 0; ret = ihk_reserve_mem(0, mem_chunks, num_mem_chunks); OKNG(ret != 0, "ihk_reserve_mem w/o /dev/mcd0\n"); // get # of reserved mem chunks: exptected to fail num_mem_chunks = ihk_get_num_reserved_mem_chunks(0); OKNG(num_mem_chunks < 0, "ihk_get_num_reserved_mem_chunks w/o /dev/mcd0\n"); // get reserved mem chunks: exptected to fail ret = ihk_query_mem(0, mem_chunks, 1); OKNG(ret != 0, "ihk_query_mem (1)\n"); // release mem 128m@0: expected to fail num_mem_chunks = 1; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_release_mem(0, mem_chunks, num_mem_chunks); OKNG(ret != 0, "ihk_release_mem w/o /dev/mcd0\n"); // create ret = ihk_create_os(0); OKNG(ret != 0, "ihk_create_os (1)\n"); // get # of OS instances num_os_instances = ihk_get_num_os_instances(0); //printf("num_os_instances=%d\n", num_os_instances); OKNG(num_os_instances < 0, "ihk_get_num_os_instances (1)\n"); // get OS instances ret = ihk_get_os_instances(0, indices, 1); OKNG(ret != 0, "ihk_get_os_instances (1)\n"); // get os_instances sprintf(cmd, "%s/sbin/ihkconfig 0 get os_instances", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "0") == NULL, "ihkconfig 0 get os_instances (1) returned:\n%s\n", buf); // destroy ret = ihk_destroy_os(0, 0); OKNG(ret != 0, "ihk_destroy_os (1)\n"); /* Expected to succeed */ sprintf(cmd, "insmod %s/kmod/ihk.ko", MCK_DIR); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); sprintf(cmd, "insmod %s/kmod/ihk-smp-%s.ko %s", MCK_DIR, ARCH, PART_MOD_PARAM); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); sprintf(cmd, "chown %s:%s /dev/mcd*\n", logname, groups); printf("%s\n", cmd); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); sprintf(cmd, "insmod %s/kmod/mcctrl.ko", MCK_DIR); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); // reserve cpu cpus[0] = 3; cpus[1] = 1; num_cpus = 2; ret = ihk_reserve_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_reserve_cpu\n"); // get # of reserved cpus num_cpus = ihk_get_num_reserved_cpus(0); OKNG(num_cpus == 2, "ihk_get_num_reserved_cpu (2)\n"); // get reserved cpus. Note that cpu# is sorted in ihk. ret = ihk_query_cpu(0, cpus, num_cpus); OKNG(ret == 0 && cpus[0] == 1 && cpus[1] == 3, "ihk_query_cpu (2)\n"); // release cpu cpus[0] = 1; num_cpus = 1; ret = ihk_release_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_release_cpu (2)\n"); // get # of reserved cpus num_cpus = ihk_get_num_reserved_cpus(0); OKNG(num_cpus == 1, "ihk_get_num_reserved_cpu (3)\n"); // get reserved cpus ret = ihk_query_cpu(0, cpus, num_cpus); OKNG(ret == 0 && cpus[0] == 3, "ihk_query_cpu (3)\n"); // reserve cpu cpus[0] = 1; num_cpus = 1; ret = ihk_reserve_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_reserve_cpu\n"); // get # of reserved cpus num_cpus = ihk_get_num_reserved_cpus(0); OKNG(num_cpus == 2, "ihk_get_num_reserved_cpu (3)\n"); // get reserved cpus. Note that cpu# is sorted in ihk. ret = ihk_query_cpu(0, cpus, num_cpus); OKNG(ret == 0 && cpus[0] == 1 && cpus[1] == 3, "ihk_query_cpu (4)\n"); // reserve mem 128m@0,64m@0 num_mem_chunks = 2; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; mem_chunks[1].size = 64*1024*1024ULL; mem_chunks[1].numa_node_number = 0; ret = ihk_reserve_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_reserve_mem\n"); // get # of reserved mem chunks num_mem_chunks = ihk_get_num_reserved_mem_chunks(0); OKNG(num_mem_chunks == 2, "ihk_get_num_reserved_mem_chunks\n"); // get reserved mem chunks ret = ihk_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && ((mem_chunks[0].size == 128*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 64*1024*1024ULL && mem_chunks[1].numa_node_number == 0) || (mem_chunks[0].size == 64*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 128*1024*1024ULL && mem_chunks[1].numa_node_number == 0)), "ihk_query_mem (2)\n"); // release mem 128m@0 num_mem_chunks = 1; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_release_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_release_mem w/o /dev/mcd0\n"); // get # of reserved mem chunks num_mem_chunks = ihk_get_num_reserved_mem_chunks(0); OKNG(num_mem_chunks == 1, "ihk_get_num_reserved_mem_chunks\n"); // get reserved mem chunks ret = ihk_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && mem_chunks[0].size == 64*1024*1024ULL && mem_chunks[0].numa_node_number == 0, "ihk_query_mem (3)\n"); // reserve mem 128m@0 num_mem_chunks = 1; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_reserve_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_reserve_mem\n"); // get # of reserved mem chunks num_mem_chunks = ihk_get_num_reserved_mem_chunks(0); OKNG(num_mem_chunks == 2, "ihk_get_num_reserved_mem_chunks\n"); // get reserved mem chunks ret = ihk_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && ((mem_chunks[0].size == 128*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 64*1024*1024ULL && mem_chunks[1].numa_node_number == 0) || (mem_chunks[0].size == 64*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 128*1024*1024ULL && mem_chunks[1].numa_node_number == 0)), "ihk_query_mem (3)\n"); /* Test error handling */ // assign cpu 3,1 num_cpus = 2; cpus[0] = 3; cpus[1] = 1; ret = ihk_os_assign_cpu(0, cpus, num_cpus); OKNG(ret != 0, "ihk_os_assign_cpu\n"); // get # of assigned cpus num_cpus = ihk_os_get_num_assigned_cpus(0); OKNG(num_cpus < 0, "ihk_os_get_num_assigned_cpus\n"); // get assigned cpus ret = ihk_os_query_cpu(0, cpus, 2); OKNG(ret != 0, "ihk_os_query_cpu (4)\n"); // release cpu num_cpus = 1; cpus[0] = 1; ret = ihk_os_release_cpu(0, cpus, num_cpus); OKNG(ret != 0, "ihk_os_release_cpu (1)\n"); // assign mem 128m@0,64m@0 num_mem_chunks = 2; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; mem_chunks[1].size = 64*1024*1024ULL; mem_chunks[1].numa_node_number = 0; ret = ihk_os_assign_mem(0, mem_chunks, num_mem_chunks); OKNG(ret != 0, "ihk_os_assign_mem (1)\n"); // get # of assigned mem chunks num_mem_chunks = ihk_os_get_num_assigned_mem_chunks(0); OKNG(num_mem_chunks < 0, "ihk_os_get_num_assigned_mem_chunks\n"); // get assigned mem chunks ret = ihk_os_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret != 0, "ihk_os_query_mem (1)\n"); // release mem chunks num_mem_chunks = 1; mem_chunks[0].size = 64*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_os_release_mem(0, mem_chunks, num_mem_chunks); OKNG(ret != 0, "ihk_os_release_mem\n"); if (ikc_map_by_func) { // set ikc_map ikc_map[0].src_cpu = 3; ikc_map[0].dst_cpu = 0; ikc_map[0].src_cpu = 1; ikc_map[0].dst_cpu = 2; ret = ihk_os_set_ikc_map(0, ikc_map, 2); OKNG(ret != 0, "ihk_os_set_ikc_map\n"); // get ikc_map ret = ihk_os_get_ikc_map(0, ikc_map, 2); OKNG(ret != 0, "ihk_os_get_ikc_map (1)\n"); } else { // set ikc_map sprintf(cmd, "%s/sbin/ihkosctl 0 set ikc_map 3:0+1:2 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "rror") != NULL, "ihkconfig 0 set ikc_map (1)\n"); // get ikc_map sprintf(cmd, "%s/sbin/ihkosctl 0 get ikc_map 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "3:0+1:2") == NULL, "ihkconfig 0 get ikc_map (1) returned:\n%s\n", buf); } // load sprintf(fn, "%s/%s/kernel/mckernel.img", MCK_DIR, TARGET); printf("%s\n", fn); ret = ihk_os_load(0, fn); OKNG(ret != 0, "ihk_os_load\n"); // kargs sprintf(kargs, "hidos ksyslogd=0"); ret = ihk_os_kargs(0, kargs); OKNG(ret != 0, "ihk_os_kargs\n"); // boot ret = ihk_os_boot(0); OKNG(ret != 0, "ihk_os_boot\n"); // get status ret = ihk_os_get_status(0); OKNG(ret < 0, "ihk_os_get_status (1)\n"); // get status sprintf(cmd, "%s//sbin/ihkosctl 0 get status 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "rror") != NULL, "ihkconfig 0 get status (1) returned:\n%s\n", buf); // kmsg size kmsg_size = ihk_os_get_kmsg_size(0); OKNG(kmsg_size < 0, "ihk_os_get_kmsg_size\n"); // get kmsg ret = ihk_os_kmsg(0, buf, 256); OKNG(ret != 0, "ihk_os_kmsg returns %d\n", ret); // clear kmsg ret = ihk_os_clear_kmsg(0); OKNG(ret != 0, "ihk_os_clear_kmsg\n"); // get # of NUMA nodes num_numa_nodes = ihk_os_get_num_numa_nodes(0); OKNG(num_numa_nodes < 0, "ihk_os_get_num_numa_nodes\n"); // query_free_mem ret = ihk_os_query_free_mem(0, memfree, num_numa_nodes); OKNG(ret != 0, "ihk_os_query_free_mem\n"); // get # of page sizes num_pgsizes = ihk_os_get_num_pagesizes(0); OKNG(num_pgsizes < 0, "ihk_os_get_num_pagesizes\n"); // get page sizes ret = ihk_os_get_pagesizes(0, pgsizes, num_pgsizes); OKNG(ret != 0, "ihk_os_get_pagesizes\n"); // get rusage ret = ihk_os_getrusage(0, &rusage, sizeof(rusage)); OKNG(ret != 0, "ihk_os_getrusage\n"); // shutdown ret = ihk_os_shutdown(0); OKNG(ret != 0, "ihk_os_shutdown (1)\n"); // destroy os ret = ihk_destroy_os(0, 0); OKNG(ret != 0, "ihk_destroy_os (2)\n"); /* Expected to succeed */ // create 0 ret = ihk_create_os(0); OKNG(ret == 0, "ihk_create_os (2)\n"); #if 0 // create 1 ret = ihk_create_os(0); OKNG(ret == 1, "ihk_create_os (3)\n"); // get # of OS instances num_os_instances = ihk_get_num_os_instances(0); OKNG(num_os_instances == 2, "ihk_get_num_os_instances (2)\n"); // get OS instances. Note that the index of the youngest OS // instance resides in [0]. ret = ihk_get_os_instances(0, indices, num_os_instances); OKNG(ret == 0 && indices[0] == 1 && indices[1] == 0, "ihk_get_os_instances (2)\n"); // get os_instances sprintf(cmd, "%s//sbin/ihkconfig 0 get os_instances", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "0") != NULL && strstr(buf, "1") != NULL, "ihkconfig 0 get os_instances (2) returned:\n%s\n", buf); // destroy one of them ret = ihk_destroy_os(0, 1); OKNG(ret == 0, "ihk_destroy_os (3)\n"); #else // get # of OS instances num_os_instances = ihk_get_num_os_instances(0); OKNG(num_os_instances == 1, "ihk_get_num_os_instances (2)\n"); // get OS instances. Note that the index of the youngest OS // instance resides in [0]. ret = ihk_get_os_instances(0, indices, num_os_instances); OKNG(ret == 0 && indices[0] == 0, "ihk_get_os_instances (2)\n"); // get os_instances sprintf(cmd, "%s//sbin/ihkconfig 0 get os_instances", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "0") != NULL, "ihkconfig 0 get os_instances (3) returned:\n%s\n", buf); #endif // get status ret = ihk_os_get_status(0); OKNG(ret == IHK_STATUS_INACTIVE, "ihk_os_get_status (2)\n"); // get status sprintf(cmd, "%s/sbin/ihkosctl 0 get status 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "INACTIVE") != NULL, "ihkconfig 0 get status (2) returned:\n%s\n", buf); sprintf(cmd, "chown %s:%s /dev/mcos*\n", logname, groups); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); // assign cpu 3,1 num_cpus = 2; cpus[0] = 3; cpus[1] = 1; ret = ihk_os_assign_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_os_assign_cpu\n"); // get # of assigned cpus num_cpus = ihk_os_get_num_assigned_cpus(0); OKNG(num_cpus == 2, "ihk_os_get_num_assigned_cpus\n"); // get assigned cpus ret = ihk_os_query_cpu(0, cpus, num_cpus); OKNG(ret == 0 && cpus[0] == 3 && cpus[1] == 1, "ihk_os_query_cpu (5)\n"); // release cpu num_cpus = 1; cpus[0] = 3; ret = ihk_os_release_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_os_release_cpu (2)\n"); // get # of assigned cpus num_cpus = ihk_os_get_num_assigned_cpus(0); OKNG(num_cpus == 1, "ihk_os_get_num_assigned_cpus\n"); // get assigned cpus ret = ihk_os_query_cpu(0, cpus, num_cpus); OKNG(ret == 0 && cpus[0] == 1, "ihk_os_query_cpu (6)\n"); // release cpu num_cpus = 1; cpus[0] = 1; ret = ihk_os_release_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_os_release_cpu (3)\n"); // assign cpu 3,1 num_cpus = 2; cpus[0] = 3; cpus[1] = 1; ret = ihk_os_assign_cpu(0, cpus, num_cpus); OKNG(ret == 0, "ihk_os_assign_cpu\n"); if (ikc_map_by_func) { // set ikc_map ikc_map[0].src_cpu = 3; ikc_map[0].dst_cpu = 0; ikc_map[1].src_cpu = 1; ikc_map[1].dst_cpu = 2; ret = ihk_os_set_ikc_map(0, ikc_map, num_cpus); OKNG(ret == 0, "ihk_os_set_ikc_map\n"); // get ikc_map ret = ihk_os_get_ikc_map(0, ikc_map, num_cpus); OKNG(ret == 0 && ikc_map[0].src_cpu == 3 && ikc_map[0].dst_cpu == 0 && ikc_map[1].src_cpu == 1 && ikc_map[1].dst_cpu == 2, "ihk_os_get_ikc_map (2)\n"); } else { // set ikc_map sprintf(cmd, "%s/sbin/ihkosctl 0 set ikc_map 3:0+1:2 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "rror") == NULL, "ihkconfig 0 set ikc_map (2)\n"); // get ikc_map sprintf(cmd, "%s/sbin/ihkosctl 0 get ikc_map 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "3:0+1:2") != NULL, "ihkconfig 0 get ikc_map (2) returned:\n%s\n", buf); } // assign mem 128m@0,64m@0 num_mem_chunks = 2; mem_chunks[0].size = 128*1024*1024ULL; mem_chunks[0].numa_node_number = 0; mem_chunks[1].size = 64*1024*1024ULL; mem_chunks[1].numa_node_number = 0; ret = ihk_os_assign_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_os_assign_mem (2)\n"); // get # of assigned mem chunks num_mem_chunks = ihk_os_get_num_assigned_mem_chunks(0); OKNG(num_mem_chunks == 2, "ihk_os_get_num_assigned_mem_chunks\n"); // get assigned mem chunks ret = ihk_os_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && ((mem_chunks[0].size == 128*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 64*1024*1024ULL && mem_chunks[1].numa_node_number == 0) || (mem_chunks[0].size == 64*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 128*1024*1024ULL && mem_chunks[1].numa_node_number == 0)), "ihk_os_query_mem (2)\n"); // release mem chunks num_mem_chunks = 1; mem_chunks[0].size = 64*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_os_release_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_os_release_mem\n"); // get # of assigned mem chunks num_mem_chunks = ihk_os_get_num_assigned_mem_chunks(0); OKNG(num_mem_chunks == 1, "ihk_os_get_num_assigned_mem_chunks\n"); // get assigned mem chunks ret = ihk_os_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && mem_chunks[0].size == 128*1024*1024ULL && mem_chunks[0].numa_node_number == 0, "ihk_os_query_mem (3)\n"); // assign mem 64m@0 num_mem_chunks = 1; mem_chunks[0].size = 64*1024*1024ULL; mem_chunks[0].numa_node_number = 0; ret = ihk_os_assign_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0, "ihk_os_assign_mem (3)\n"); // get # of assigned mem chunks num_mem_chunks = ihk_os_get_num_assigned_mem_chunks(0); OKNG(num_mem_chunks == 2, "ihk_os_get_num_assigned_mem_chunks\n"); // get assigned mem chunks ret = ihk_os_query_mem(0, mem_chunks, num_mem_chunks); OKNG(ret == 0 && ((mem_chunks[0].size == 128*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 64*1024*1024ULL && mem_chunks[1].numa_node_number == 0) || (mem_chunks[0].size == 64*1024*1024ULL && mem_chunks[0].numa_node_number == 0 && mem_chunks[1].size == 128*1024*1024ULL && mem_chunks[1].numa_node_number == 0)), "ihk_os_query_mem (4)\n"); // load sprintf(fn, "%s/%s/kernel/mckernel.img", MCK_DIR, TARGET); printf("%s\n", fn); ret = ihk_os_load(0, fn); OKNG(ret == 0, "ihk_os_load\n"); // kargs sprintf(kargs, "hidos ksyslogd=0"); ret = ihk_os_kargs(0, kargs); OKNG(ret == 0, "ihk_os_kargs\n"); // boot ret = ihk_os_boot(0); OKNG(ret == 0, "ihk_os_boot\n"); if (boot_shutdown) { /* #898 */ goto shutdown; } // get status ret = ihk_os_get_status(0); OKNG(ret == IHK_STATUS_BOOTING || ret == IHK_STATUS_RUNNING, "ihk_os_get_status (3)\n"); // get status sprintf(cmd, "%s/sbin/ihkosctl 0 get status 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "BOOTING") != NULL || strstr(buf, "RUNNING") != NULL, "ihkconfig 0 get status (3) returned:\n%s\n", buf); /* Make sure that all initialization related transactions * between McKernel and IHK finish * sysfs_init(void) (in mckernel/kernel/sysfs.c) * packet.msg = SCD_MSG_SYSFS_REQ_SETUP; * sysfsm_work_main() in (mckernel/executer/kernel/mcctrl/sysfs.c) * sysfsm_req_setup * sysfsm_setup */ usleep(100*1000); // get status ret = ihk_os_get_status(0); OKNG(ret == IHK_STATUS_RUNNING, "ihk_os_get_status (4)\n"); // get status sprintf(cmd, "%s/sbin/ihkosctl 0 get status 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "RUNNING") != NULL, "ihkconfig 0 get status (4) returned:\n%s\n", buf); // get kmsg size kmsg_size = ihk_os_get_kmsg_size(0); OKNG(kmsg_size > 0, "ihk_os_get_kmsg_size\n"); // get kmsg ret = ihk_os_kmsg(0, buf, kmsg_size); OKNG(ret > 0 && strstr(buf, "IHK/McKernel started.") != NULL, "ihk_os_kmsg\n"); // clear kmsg ret = ihk_os_clear_kmsg(0); OKNG(ret == 0, "ihk_os_clear_kmsg\n"); #if 0 // get kmsg ret = ihk_os_kmsg(0, buf, kmsg_size); printf("%s,%d", strstr(buf, "IHK/McKernel started."), ret); OKNG(ret == 0 && strstr(buf, "IHK/McKernel started.") == NULL, "ihk_os_kmsg returns %d\n", ret); #endif // mcexec sprintf(cmd, "%s/bin/mcexec ls -l | grep Makefile", MCK_DIR); if (mcexec_shutdown) { /* #928 */ status = system(cmd); goto shutdown; } fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "Makefile") != NULL, "mcexec\n"); // /proc sprintf(cmd, "%s/bin/mcexec cat /proc/stat", MCK_DIR); fp1 = popen(cmd, "r"); nread = fread(buf1, 1, sizeof(buf1), fp1); buf1[nread] = 0; fp2 = popen("cat /proc/stat", "r"); nread = fread(buf2, 1, sizeof(buf2), fp2); buf2[nread] = 0; OKNG(strcmp(buf1, buf2) != 0, "mcexec cat /proc/stat\n"); // get # of NUMA nodes num_numa_nodes = ihk_os_get_num_numa_nodes(0); OKNG(num_numa_nodes > 0, "ihk_os_get_num_numa_nodes\n"); // query_free_mem ret = ihk_os_query_free_mem(0, memfree, num_numa_nodes); OKNG(ret == 0 && memfree[0] > 0, "ihk_os_query_free_mem\n"); // get # of page sizes num_pgsizes = ihk_os_get_num_pagesizes(0); OKNG(num_pgsizes == 3, "ihk_os_get_num_pagesizes\n"); // get page sizes ret = ihk_os_get_pagesizes(0, pgsizes, num_pgsizes); OKNG(ret == 0 && pgsizes[0] == (1ULL<<12) && pgsizes[1] == (1ULL<<21) && pgsizes[2] == (1ULL<<30), "ihk_os_get_pagesizes\n"); #if 1 // shutdown // usleep(250*1000); // Wait for nothing is in-flight shutdown: ret = ihk_os_shutdown(0); OKNG(ret == 0, "ihk_os_shutdown (2)\n"); // get status. Note that the smp_ihk_os_shutdown() transitions // smp-x86 status to BUILTIN_OS_STATUS_SHUTDOWN // and smp_ihk_os_query_status() transitions os status to // IHK_OS_STATUS_NOT_BOOTED. ret = ihk_os_get_status(0); OKNG(ret == IHK_STATUS_SHUTDOWN || ret == IHK_STATUS_INACTIVE, "ihk_os_get_status (5) returned %d\n", ret); // get status sprintf(cmd, "%s/sbin/ihkosctl 0 get status 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "SHUTDOWN") != NULL || strstr(buf, "INACTIVE") != NULL, "ihkconfig 0 get status (5) returned:\n%s\n", buf); #endif #if 1 // destroy os usleep(250*1000); // Wait for nothing is in-flight ret = ihk_destroy_os(0, 0); OKNG(ret == 0, "ihk_destroy_os (4)\n"); #else // destroy os usleep(250*1000); // Wait for nothing is in-flight sprintf(cmd, "%s/sbin/ihkconfig 0 destroy 0 2>&1", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "rror") == NULL, "ihkconfig 0 destroy 0 returned:\n%s\n", buf); #endif // get # of OS instances num_os_instances = ihk_get_num_os_instances(0); OKNG(num_os_instances == 0, "ihk_get_num_os_instances (3)\n"); // get OS instances ret = ihk_get_os_instances(0, indices, num_os_instances); OKNG(ret == 0, "ihk_get_os_instances (3)\n"); // get os_instances sprintf(cmd, "%s/sbin/ihkconfig 0 get os_instances", MCK_DIR); fp = popen(cmd, "r"); nread = fread(buf, 1, sizeof(buf), fp); buf[nread] = 0; OKNG(strstr(buf, "0") == NULL, "ihkconfig 0 get os_instances (4) returned:\n%s\n", buf); sprintf(cmd, "rmmod %s/kmod/mcctrl.ko", MCK_DIR); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); sprintf(cmd, "rmmod %s/kmod/ihk-smp-%s.ko", MCK_DIR, ARCH); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); sprintf(cmd, "rmmod %s/kmod/ihk.ko", MCK_DIR); status = system(cmd); CHKANDJUMP(WEXITSTATUS(status) != 0, -1, "system"); printf("[INFO] All tests finished\n"); ret = 0; fn_exit: return ret; fn_fail: goto fn_exit; }