pminfo(3)

__pm_get_page_info, __mld_to_node - retrieve placement information

As shipped in IRIX 6.5. First release of IRIX 6.5.

NAME
     __pm_get_page_info, __mld_to_node - retrieve placement information

SYNOPSIS
     #include <sys/types.h>
     #include <sys/pmo.h>

     typedef   struct pm_pginfo_s {
          caddr_t vaddr;
          dev_t     node_dev;
          uint page_size;
          pmo_handle_t pm_handle;
             void*   reserved[2];
     } pm_pginfo_t;

     int __pm_get_page_info(void *base_addr,
                            size_t length,
                            pm_pginfo_t* pginfo_buf,
                            int buf_len)

     dev_t __mld_to_node(pmo_handle_t mld_handle)


DESCRIPTION
     The above two interfaces can be used to get placement information of a
     process's address space. It has to be done from the context of that
     process.

     __pm_get_page_info takes an address range in terms of base_addr and
     length. pginfo_buf is an array of pm_pginfo_t structs passed by the
     caller. On completion of the system call pginfo_buf contains the
     placement information for every page in the address range that has been
     faulted in. The vaddr field of pm_pginfo_t contains the virtual address
     of the page, node_dev contains the hardware graph dev_t of the node where
     the page has been placed. page_size is the page size used while mapping
     that virtual address. pm_handle is the handle of the pm that is attached
     to that virtual address. From dev_t one can get the hardware graph device
     name by using the libc routine dev_to_devname. If a page in the virtual
     address range has not been faulted in there is no corresponding entry in
     the pginfo_buf. If there is no error the return value contains the number
     of entries in the buffer that have been filled by the kernel.

     __mld_to_node converts an mld to the node where the mld has been placed.
     It returns the HWG dev_t of the node. The hardware graph name can be
     found by using the library routine dev_to_devname.

     dev_to_devname has the following prototype:

     char* dev_to_devname(dev_t dev, char *devname, int *length)

     This function converts a dev_t to a hardware graph device name.
     devname is a character array and length is a pointer to an integer
     which contains the length of the array.


SEE ALSO
     numa(5), mmci(5), mld(3c), mldset(3c), pm(3c), migration(3c)

DIAGNOSTICS
     Returns -1 on error.

     EFAULT  pginfo_buf address does not exist in the address space.

     EINVAL If the number of elements in the pginfo is < 1

     E2BIG If the number of elements > 1024

EXAMPLE
          #include <sys/types.h>
          #include <sys/pmo.h>
          #include <sys/attributes.h>
          #include <sys/conf.h>
          #include <sys/hwgraph.h>
          #include <sys/stat.h>
          #include <invent.h>
          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>

          #define NUMNODES        100
          #define NBPP            16384
          #define STACK_SIZE      20*NBPP
          #define DATA_SIZE       20*NBPP

          char databuf[DATA_SIZE];

          pm_pginfo_t  node_buf[NUMNODES];

          void print_nodes(pm_pginfo_t *, int);
          extern int __pm_get_page_info();

          void
          main(int argc, char **argv)
          {
                  char    stkbuf[STACK_SIZE];
                  int     ret;
                  volatile char   *addr;


                  printf("addr %x len %x0,databuf, stkbuf - databuf + STACK_SIZE);
                  addr = databuf;
                  while (addr < (databuf + DATA_SIZE)) {
                          *addr = 0;
                          addr += NBPP;
                  }

                  ret = __pm_get_page_info(0, 0x7fffffff, &node_buf, NUMNODES);
                  printf("__pm_get_page_info returns ret %d0, ret);
                  if (ret == -1) {
                          perror("__pm_get_page_info");
                          exit(1);
                  }

                  printf("stack buf nodes0);
                  print_nodes(node_buf, ret);

                  ret = __pm_get_page_info(databuf, sizeof(databuf), &node_buf, NUMNODES);
                  printf("__pm_get_page_info returns ret %d0, ret);
                  if (ret == -1) {
                          perror("__pm_get_page_info");
                          exit(1);
                  }
                  printf("data buf nodes0);
                  print_nodes(node_buf, ret);
          }

          void
          print_nodes(pm_pginfo_t *nbuf, int numnodes)
          {
                  int     i;
                  char    devname[160];
                  int     length;


                  for (i = 0; i < numnodes; i++) {
                          length = sizeof(devname);
                          printf("Address %x devt %x node %s page size %d pm %d0,
                                  nbuf[i].vaddr,
                                  nbuf[i].node_dev,
                                  dev_to_devname(nbuf[i].node_dev,  devname, &length),
                                  nbuf[i].page_size,
                                  nbuf[i].pm_handle);
                  }
          }