1
/* Randomly change policy */
13
#define SIZE (100*1024*1024)
14
#define PAGES (SIZE/pagesize)
16
#define perror(x) printf("%s: %s\n", x, strerror(errno))
17
#define err(x) perror(x),exit(1)
28
void setpol(unsigned long offset, unsigned long length, int policy, unsigned long nodes)
32
printf("off:%lx length:%lx policy:%d nodes:%lx\n",
33
offset, length, policy, nodes);
35
if (mbind(map + offset*pagesize, length*pagesize, policy,
37
printf("mbind: %s offset %lx length %lx policy %d nodes %lx\n",
39
offset*pagesize, length*pagesize,
44
for (i = offset; i < offset+length; i++) {
45
pages[i].mask = nodes;
46
pages[i].policy = policy;
52
end = offset+length+20;
55
for (; i < end; i++) {
58
if (get_mempolicy(&pol2, &nodes2, sizeof(long)*8, map+i*pagesize,
61
if (pol2 != pages[i].policy) {
62
printf("%lx: got policy %d expected %d, nodes got %lx expected %lx\n",
64
pol2, pages[i].policy, nodes2, pages[i].mask);
66
if (policy != MPOL_DEFAULT && nodes2 != pages[i].mask) {
67
printf("%lx: nodes %lx, expected %lx, policy %d\n",
68
i, nodes2, pages[i].mask, policy);
73
static unsigned char pop4[16] = {
74
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
77
int popcnt(unsigned long val)
81
count += pop4[val & 0xf];
90
pages = calloc(1, PAGES * sizeof(struct page));
94
printf("simple tests\n");
95
#define MB ((1024*1024)/pagesize)
96
setpol(0, PAGES, MPOL_INTERLEAVE, 3);
97
setpol(0, MB, MPOL_BIND, 1);
98
setpol(MB, MB, MPOL_BIND, 1);
99
setpol(MB, MB, MPOL_DEFAULT, 0);
100
setpol(MB, MB, MPOL_PREFERRED, 2);
101
setpol(MB/2, MB, MPOL_DEFAULT, 0);
102
setpol(MB+MB/2, MB, MPOL_BIND, 2);
103
setpol(MB/2+100, 100, MPOL_PREFERRED, 1);
104
setpol(100, 200, MPOL_PREFERRED, 1);
108
unsigned long offset = random() % PAGES;
109
int policy = random() % (MPOL_MAX+1);
110
unsigned long nodes = random() % 4;
111
long length = random() % (PAGES - offset);
118
case MPOL_INTERLEAVE:
124
if (popcnt(nodes) != 1)
130
setpol(offset, length, policy, nodes);
135
int main(int ac, char **av)
139
pagesize = getpagesize();
142
map = mmap(NULL, SIZE, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, 0, 0);
143
if (map == (char*)-1)
146
int shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0666);
147
if (shmid < 0) err("shmget");
148
map = shmat(shmid, NULL, SHM_RDONLY);
149
shmctl(shmid, IPC_RMID, NULL);
150
if (map == (char *)-1) err("shmat");
151
printf("map %p\n", map);
156
unsigned long timeout = strtoul(av[1], &end, 0);
158
case 'h': timeout *= 3600; break;
159
case 'm': timeout *= 60; break;
161
printf("running for %lu seconds\n", timeout);
164
printf("running forever\n");
167
seed = strtoul(av[2], 0, 0);
171
printf("random seed %lu\n", seed);