Blame view

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