Files
mckernel/test/issues/959/check_mempol_il.c
Ken Sato aef50d710c mempolicy: Support MPOL_INTERLEAVE
Change-Id: I6357892d792b2de8ea859a0a6799250f05066713
Refs: #959
2021-02-18 06:16:17 +00:00

140 lines
2.8 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <numaif.h>
#include <sys/mman.h>
#include <errno.h>
#include <ihklib.h>
#include <ihk/ihk_rusage.h>
#define NUMA_NUM 2
long long numa_stat_bfr[NUMA_NUM], numa_stat_aft[NUMA_NUM];
long long exp_diff[NUMA_NUM];
int
get_current_numa_stat(long long *stat, int numa_cnt)
{
int i, ret = 0;
struct ihk_os_rusage mck_rusage;
memset(&mck_rusage, 0, sizeof(mck_rusage));
ret = ihk_os_getrusage(0, &mck_rusage, sizeof(mck_rusage));
if (ret) {
perror("ihk_os_getrusage()");
goto out;
}
for (i = 0; i < numa_cnt; i++) {
if (mck_rusage.memory_numa_stat[i] != 0) {
stat[i] = mck_rusage.memory_numa_stat[i];
}
}
out:
return ret;
}
int
main(int argc, char **argv)
{
void *p;
unsigned long mask, bind_mask = 1;
unsigned long ps;
int i, mode, pgshift, pgnum, exp_0, exp_1, ret = 0;
if (argc < 7) {
printf("error: too few arguments\n");
ret = -1;
goto out;
}
mode = atoi(argv[1]); /* 1: set_mempolicy, 2: mbind */
pgshift = atoi(argv[2]);
pgnum = atoi(argv[3]);
mask = atoi(argv[4]);
exp_0 = atoi(argv[5]);
exp_1 = atoi(argv[6]);
ps = 1UL << pgshift;
exp_diff[0] = exp_0 * ps;
exp_diff[1] = exp_1 * ps;
if (mode != 1 && mode != 2) {
printf("error: invalid mode\n");
ret = -1;
goto out;
}
printf("INTERLEAVE BIT_MASK: 0x%lx\n", mask);
get_current_numa_stat(numa_stat_bfr, NUMA_NUM);
switch (mode) {
case 1: /* set_mempolicy */
printf("set_mempolicy: INTERLEAVE mask 0x%lx\n", mask);
if (set_mempolicy(MPOL_INTERLEAVE, &mask, NUMA_NUM)) {
perror("set_mempolicy");
ret = -1;
goto out;
}
p = mmap(NULL, ps * pgnum, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (p == ((void *)-1)) {
perror("mmap");
ret = -1;
goto out;
}
break;
case 2: /* mbind */
printf("set_mempolicy: BIND mask 0x%lx\n", bind_mask);
if (set_mempolicy(MPOL_BIND, &bind_mask, NUMA_NUM)) {
perror("set_mempolicy");
ret = -1;
goto out;
}
p = mmap(NULL, ps * pgnum, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (p == ((void *)-1)) {
perror("mmap");
ret = -1;
goto out;
}
printf("mbind : INTERLEAVE mask 0x%lx\n", mask);
if (mbind(p, ps * pgnum, MPOL_INTERLEAVE, &mask,
NUMA_NUM, 0) == -1) {
perror("mbind");
ret = -1;
goto out;
}
break;
default:
printf("error: invalid mode\n");
ret = -1;
goto out;
}
memset(p, '0', ps * pgnum);
get_current_numa_stat(numa_stat_aft, NUMA_NUM);
printf("** Difference of numa_stat **\n");
for (i = 0; i < NUMA_NUM; i++) {
long long diff = numa_stat_aft[i] - numa_stat_bfr[i];
if (diff == exp_diff[i]) {
printf("[OK] ");
} else {
printf("[NG] ");
ret = -1;
}
printf(" NUMA[%d] 0x%llx\n", i, diff);
}
munmap(p, ps * pgnum);
out:
return ret;
}