diff options
Diffstat (limited to 'Documentation/vm/hugetlbpage.txt')
| -rw-r--r-- | Documentation/vm/hugetlbpage.txt | 169 | 
1 files changed, 2 insertions, 167 deletions
diff --git a/Documentation/vm/hugetlbpage.txt b/Documentation/vm/hugetlbpage.txt index bc31636973e..457634c1e03 100644 --- a/Documentation/vm/hugetlbpage.txt +++ b/Documentation/vm/hugetlbpage.txt @@ -299,176 +299,11 @@ map_hugetlb.c.  *******************************************************************  /* - * Example of using huge page memory in a user application using Sys V shared - * memory system calls.  In this example the app is requesting 256MB of - * memory that is backed by huge pages.  The application uses the flag - * SHM_HUGETLB in the shmget system call to inform the kernel that it is - * requesting huge pages. - * - * For the ia64 architecture, the Linux kernel reserves Region number 4 for - * huge pages.  That means that if one requires a fixed address, a huge page - * aligned address starting with 0x800000... will be required.  If a fixed - * address is not required, the kernel will select an address in the proper - * range. - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. - * - * Note: The default shared memory limit is quite low on many kernels, - * you may need to increase it via: - * - * echo 268435456 > /proc/sys/kernel/shmmax - * - * This will increase the maximum size per shared memory segment to 256MB. - * The other limit that you will hit eventually is shmall which is the - * total amount of shared memory in pages. To set it to 16GB on a system - * with a 4kB pagesize do: - * - * echo 4194304 > /proc/sys/kernel/shmall + * hugepage-shm:  see Documentation/vm/hugepage-shm.c   */ -#include <stdlib.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/ipc.h> -#include <sys/shm.h> -#include <sys/mman.h> - -#ifndef SHM_HUGETLB -#define SHM_HUGETLB 04000 -#endif - -#define LENGTH (256UL*1024*1024) - -#define dprintf(x)  printf(x) - -#define ADDR (void *)(0x0UL)	/* let kernel choose address */ -#define SHMAT_FLAGS (0) - -int main(void) -{ -	int shmid; -	unsigned long i; -	char *shmaddr; - -	if ((shmid = shmget(2, LENGTH, -			    SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) { -		perror("shmget"); -		exit(1); -	} -	printf("shmid: 0x%x\n", shmid); - -	shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS); -	if (shmaddr == (char *)-1) { -		perror("Shared memory attach failure"); -		shmctl(shmid, IPC_RMID, NULL); -		exit(2); -	} -	printf("shmaddr: %p\n", shmaddr); - -	dprintf("Starting the writes:\n"); -	for (i = 0; i < LENGTH; i++) { -		shmaddr[i] = (char)(i); -		if (!(i % (1024 * 1024))) -			dprintf("."); -	} -	dprintf("\n"); - -	dprintf("Starting the Check..."); -	for (i = 0; i < LENGTH; i++) -		if (shmaddr[i] != (char)i) -			printf("\nIndex %lu mismatched\n", i); -	dprintf("Done.\n"); - -	if (shmdt((const void *)shmaddr) != 0) { -		perror("Detach failure"); -		shmctl(shmid, IPC_RMID, NULL); -		exit(3); -	} - -	shmctl(shmid, IPC_RMID, NULL); - -	return 0; -}  *******************************************************************  /* - * Example of using huge page memory in a user application using the mmap - * system call.  Before running this application, make sure that the - * administrator has mounted the hugetlbfs filesystem (on some directory - * like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this - * example, the app is requesting memory of size 256MB that is backed by - * huge pages. - * - * For the ia64 architecture, the Linux kernel reserves Region number 4 for - * huge pages.  That means that if one requires a fixed address, a huge page - * aligned address starting with 0x800000... will be required.  If a fixed - * address is not required, the kernel will select an address in the proper - * range. - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. + * hugepage-mmap:  see Documentation/vm/hugepage-mmap.c   */ -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/mman.h> -#include <fcntl.h> - -#define FILE_NAME "/mnt/hugepagefile" -#define LENGTH (256UL*1024*1024) -#define PROTECTION (PROT_READ | PROT_WRITE) - -#define ADDR (void *)(0x0UL)	/* let kernel choose address */ -#define FLAGS (MAP_SHARED) - -void check_bytes(char *addr) -{ -	printf("First hex is %x\n", *((unsigned int *)addr)); -} - -void write_bytes(char *addr) -{ -	unsigned long i; - -	for (i = 0; i < LENGTH; i++) -		*(addr + i) = (char)i; -} - -void read_bytes(char *addr) -{ -	unsigned long i; - -	check_bytes(addr); -	for (i = 0; i < LENGTH; i++) -		if (*(addr + i) != (char)i) { -			printf("Mismatch at %lu\n", i); -			break; -		} -} - -int main(void) -{ -	void *addr; -	int fd; - -	fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); -	if (fd < 0) { -		perror("Open failed"); -		exit(1); -	} - -	addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); -	if (addr == MAP_FAILED) { -		perror("mmap"); -		unlink(FILE_NAME); -		exit(1); -	} - -	printf("Returned address is %p\n", addr); -	check_bytes(addr); -	write_bytes(addr); -	read_bytes(addr); - -	munmap(addr, LENGTH); -	close(fd); -	unlink(FILE_NAME); - -	return 0; -}  |