linux/tools/testing/selftests/vm/map_hugetlb.c
<<
>>
Prefs
   1/*
   2 * Example of using hugepage memory in a user application using the mmap
   3 * system call with MAP_HUGETLB flag.  Before running this program make
   4 * sure the administrator has allocated enough default sized huge pages
   5 * to cover the 256 MB allocation.
   6 *
   7 * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages.
   8 * That means the addresses starting with 0x800000... will need to be
   9 * specified.  Specifying a fixed address is not required on ppc64, i386
  10 * or x86_64.
  11 */
  12#include <stdlib.h>
  13#include <stdio.h>
  14#include <unistd.h>
  15#include <sys/mman.h>
  16#include <fcntl.h>
  17
  18#define LENGTH (256UL*1024*1024)
  19#define PROTECTION (PROT_READ | PROT_WRITE)
  20
  21#ifndef MAP_HUGETLB
  22#define MAP_HUGETLB 0x40000 /* arch specific */
  23#endif
  24
  25/* Only ia64 requires this */
  26#ifdef __ia64__
  27#define ADDR (void *)(0x8000000000000000UL)
  28#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED)
  29#else
  30#define ADDR (void *)(0x0UL)
  31#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB)
  32#endif
  33
  34static void check_bytes(char *addr)
  35{
  36        printf("First hex is %x\n", *((unsigned int *)addr));
  37}
  38
  39static void write_bytes(char *addr)
  40{
  41        unsigned long i;
  42
  43        for (i = 0; i < LENGTH; i++)
  44                *(addr + i) = (char)i;
  45}
  46
  47static int read_bytes(char *addr)
  48{
  49        unsigned long i;
  50
  51        check_bytes(addr);
  52        for (i = 0; i < LENGTH; i++)
  53                if (*(addr + i) != (char)i) {
  54                        printf("Mismatch at %lu\n", i);
  55                        return 1;
  56                }
  57        return 0;
  58}
  59
  60int main(void)
  61{
  62        void *addr;
  63        int ret;
  64
  65        addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0);
  66        if (addr == MAP_FAILED) {
  67                perror("mmap");
  68                exit(1);
  69        }
  70
  71        printf("Returned address is %p\n", addr);
  72        check_bytes(addr);
  73        write_bytes(addr);
  74        ret = read_bytes(addr);
  75
  76        munmap(addr, LENGTH);
  77
  78        return ret;
  79}
  80