Back to index

numactl  2.0.8~rc4
Functions | Variables
mbind_mig_pages.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <numa.h>
#include <numaif.h>
#include <unistd.h>
#include <asm/unistd.h>

Go to the source code of this file.

Functions

int main (int argc, char **argv)

Variables

unsigned int pagesize
unsigned int page_count = 32
char * page_base
char * pages
void ** addr
int * status
int * nodes
int errors
int nr_nodes
struct bitmaskold_nodes
struct bitmasknew_nodes

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 29 of file mbind_mig_pages.c.

{
       int i, rc;

       pagesize = getpagesize();

       nr_nodes = numa_max_node()+1;

       old_nodes = numa_bitmask_alloc(nr_nodes);
       new_nodes = numa_bitmask_alloc(nr_nodes);
       numa_bitmask_setbit(old_nodes, 0);
       numa_bitmask_setbit(new_nodes, 1);

       if (nr_nodes < 2) {
              printf("A minimum of 2 nodes is required for this test.\n");
              exit(1);
       }

       setbuf(stdout, NULL);
       printf("mbind migration test ......\n");
       if (argc > 1)
              sscanf(argv[1], "%d", &page_count);

       page_base = malloc((pagesize + 1) * page_count);
       addr = malloc(sizeof(char *) * page_count);
       status = malloc(sizeof(int *) * page_count);
       nodes = malloc(sizeof(int *) * page_count);
       if (!page_base || !addr || !status || !nodes) {
              printf("Unable to allocate memory\n");
              exit(1);
       }

       pages = (void *) ((((long)page_base) & ~((long)(pagesize - 1))) + pagesize);

       for (i = 0; i < page_count; i++) {
              if (i != 2)
                     /* We leave page 2 unallocated */
                     pages[ i * pagesize ] = (char) i;
              addr[i] = pages + i * pagesize;
              nodes[i] = 0;
              status[i] = -123;
       }

       /* Move pages toi node zero */
       numa_move_pages(0, page_count, addr, nodes, status, 0);

       printf("\nPage status before page migration\n");
       printf("---------------------------------\n");
       rc = numa_move_pages(0, page_count, addr, NULL, status, 0);
       if (rc < 0) {
              perror("move_pages");
              exit(1);
       }

       for (i = 0; i < page_count; i++) {
              printf("Page %d vaddr=%p node=%d\n", i, pages + i * pagesize, status[i]);
              if (i != 2 && status[i]) {
                     printf("Bad page state. Page %d status %d\n",i, status[i]);
                     exit(1);
              }
       }

       /* Move to node zero */
       printf("\nMoving pages via mbind to node 0 ...\n");
       rc = mbind(pages, page_count * pagesize, MPOL_BIND, old_nodes->maskp,
              old_nodes->size + 1, MPOL_MF_MOVE | MPOL_MF_STRICT);
       if (rc < 0) {
              perror("mbind");
              errors++;
       }


       printf("\nMoving pages via mbind from node 0 to 1 ...\n");
       rc = mbind(pages, page_count * pagesize, MPOL_BIND, new_nodes->maskp,
              new_nodes->size + 1, MPOL_MF_MOVE | MPOL_MF_STRICT);
       if (rc < 0) {
              perror("mbind");
              errors++;
       }

       numa_move_pages(0, page_count, addr, NULL, status, 0);
       for (i = 0; i < page_count; i++) {
              printf("Page %d vaddr=%lx node=%d\n", i,
                     (unsigned long)(pages + i * pagesize), status[i]);
              if (i != 2) {
                     if (pages[ i* pagesize ] != (char) i) {
                            printf("*** Page content corrupted.\n");
                            errors++;
                     } else if (status[i] != 1) {
                            printf("*** Page on wrong node.\n");
                            errors++;
                     }
              }
       }

       if (!errors)
              printf("Test successful.\n");
       else
              printf("%d errors.\n", errors);

       return errors > 0 ? 1 : 0;
}

Here is the call graph for this function:


Variable Documentation

void** addr

Definition at line 20 of file mbind_mig_pages.c.

int errors

Definition at line 23 of file mbind_mig_pages.c.

struct bitmask* new_nodes

Definition at line 27 of file mbind_mig_pages.c.

int* nodes

Definition at line 22 of file mbind_mig_pages.c.

int nr_nodes

Definition at line 24 of file mbind_mig_pages.c.

struct bitmask* old_nodes

Definition at line 26 of file mbind_mig_pages.c.

char* page_base

Definition at line 17 of file mbind_mig_pages.c.

unsigned int page_count = 32

Definition at line 15 of file mbind_mig_pages.c.

char* pages

Definition at line 18 of file mbind_mig_pages.c.

unsigned int pagesize

Definition at line 14 of file mbind_mig_pages.c.

int* status

Definition at line 21 of file mbind_mig_pages.c.