| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * hugepage-mmap: | 
|  | 3 | * | 
|  | 4 | * Example of using huge page memory in a user application using the mmap | 
|  | 5 | * system call.  Before running this application, make sure that the | 
|  | 6 | * administrator has mounted the hugetlbfs filesystem (on some directory | 
|  | 7 | * like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this | 
|  | 8 | * example, the app is requesting memory of size 256MB that is backed by | 
|  | 9 | * huge pages. | 
|  | 10 | * | 
|  | 11 | * For the ia64 architecture, the Linux kernel reserves Region number 4 for | 
|  | 12 | * huge pages.  That means that if one requires a fixed address, a huge page | 
|  | 13 | * aligned address starting with 0x800000... will be required.  If a fixed | 
|  | 14 | * address is not required, the kernel will select an address in the proper | 
|  | 15 | * range. | 
|  | 16 | * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. | 
|  | 17 | */ | 
|  | 18 |  | 
|  | 19 | #include <stdlib.h> | 
|  | 20 | #include <stdio.h> | 
|  | 21 | #include <unistd.h> | 
|  | 22 | #include <sys/mman.h> | 
|  | 23 | #include <fcntl.h> | 
|  | 24 |  | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 25 | #define FILE_NAME "huge/hugepagefile" | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 26 | #define LENGTH (256UL*1024*1024) | 
|  | 27 | #define PROTECTION (PROT_READ | PROT_WRITE) | 
|  | 28 |  | 
|  | 29 | /* Only ia64 requires this */ | 
|  | 30 | #ifdef __ia64__ | 
|  | 31 | #define ADDR (void *)(0x8000000000000000UL) | 
|  | 32 | #define FLAGS (MAP_SHARED | MAP_FIXED) | 
|  | 33 | #else | 
|  | 34 | #define ADDR (void *)(0x0UL) | 
|  | 35 | #define FLAGS (MAP_SHARED) | 
|  | 36 | #endif | 
|  | 37 |  | 
|  | 38 | static void check_bytes(char *addr) | 
|  | 39 | { | 
|  | 40 | printf("First hex is %x\n", *((unsigned int *)addr)); | 
|  | 41 | } | 
|  | 42 |  | 
|  | 43 | static void write_bytes(char *addr) | 
|  | 44 | { | 
|  | 45 | unsigned long i; | 
|  | 46 |  | 
|  | 47 | for (i = 0; i < LENGTH; i++) | 
|  | 48 | *(addr + i) = (char)i; | 
|  | 49 | } | 
|  | 50 |  | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 51 | static int read_bytes(char *addr) | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 52 | { | 
|  | 53 | unsigned long i; | 
|  | 54 |  | 
|  | 55 | check_bytes(addr); | 
|  | 56 | for (i = 0; i < LENGTH; i++) | 
|  | 57 | if (*(addr + i) != (char)i) { | 
|  | 58 | printf("Mismatch at %lu\n", i); | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 59 | return 1; | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 60 | } | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 61 | return 0; | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 62 | } | 
|  | 63 |  | 
|  | 64 | int main(void) | 
|  | 65 | { | 
|  | 66 | void *addr; | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 67 | int fd, ret; | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 68 |  | 
|  | 69 | fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); | 
|  | 70 | if (fd < 0) { | 
|  | 71 | perror("Open failed"); | 
|  | 72 | exit(1); | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); | 
|  | 76 | if (addr == MAP_FAILED) { | 
|  | 77 | perror("mmap"); | 
|  | 78 | unlink(FILE_NAME); | 
|  | 79 | exit(1); | 
|  | 80 | } | 
|  | 81 |  | 
|  | 82 | printf("Returned address is %p\n", addr); | 
|  | 83 | check_bytes(addr); | 
|  | 84 | write_bytes(addr); | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 85 | ret = read_bytes(addr); | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 86 |  | 
|  | 87 | munmap(addr, LENGTH); | 
|  | 88 | close(fd); | 
|  | 89 | unlink(FILE_NAME); | 
|  | 90 |  | 
| Dave Young | f0f57b2 | 2012-03-28 14:42:56 -0700 | [diff] [blame] | 91 | return ret; | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 92 | } |