Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Documentation/vm/: split txt and source files

Documentation/vm/:
Expose example and tool source files in the Documentation/ directory in
their own files instead of being buried (almost hidden) in readme/txt files.
This should help to prevent bitrot.

This will make them more visible/usable to users who may need
to use them, to developers who may need to test with them, and
to anyone who would fix/update them if they were more visible.

Also, if any of these possibly should not be in the kernel tree at
all, it will be clearer that they are here and we can discuss if
they should be removed.

Also build the recently-added map_hugetlb.c.
Make several functions static to prevent linker warnings.

Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Acked-by: Eric B Munson <ebmunson@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Randy Dunlap and committed by
Linus Torvalds
70bace8c 1e0051ae

+209 -173
+14 -2
Documentation/vm/00-INDEX
··· 4 4 - An explanation from Linus about tsk->active_mm vs tsk->mm. 5 5 balance 6 6 - various information on memory balancing. 7 + hugepage-mmap.c 8 + - Example app using huge page memory with the mmap system call. 9 + hugepage-shm.c 10 + - Example app using huge page memory with Sys V shared memory system calls. 7 11 hugetlbpage.txt 8 12 - a brief summary of hugetlbpage support in the Linux kernel. 13 + hwpoison.txt 14 + - explains what hwpoison is 9 15 ksm.txt 10 16 - how to use the Kernel Samepage Merging feature. 11 17 locking 12 18 - info on how locking and synchronization is done in the Linux vm code. 19 + map_hugetlb.c 20 + - an example program that uses the MAP_HUGETLB mmap flag. 13 21 numa 14 22 - information about NUMA specific code in the Linux vm. 15 23 numa_memory_policy.txt 16 24 - documentation of concepts and APIs of the 2.6 memory policy support. 17 25 overcommit-accounting 18 26 - description of the Linux kernels overcommit handling modes. 27 + page-types.c 28 + - Tool for querying page flags 19 29 page_migration 20 30 - description of page migration in NUMA systems. 31 + pagemap.txt 32 + - pagemap, from the userspace perspective 21 33 slabinfo.c 22 34 - source code for a tool to get reports about slabs. 23 35 slub.txt 24 36 - a short users guide for SLUB. 25 - map_hugetlb.c 26 - - an example program that uses the MAP_HUGETLB mmap flag. 37 + unevictable-lru.txt 38 + - Unevictable LRU infrastructure
+1 -1
Documentation/vm/Makefile
··· 2 2 obj- := dummy.o 3 3 4 4 # List of programs to build 5 - hostprogs-y := slabinfo page-types 5 + hostprogs-y := slabinfo page-types hugepage-mmap hugepage-shm map_hugetlb 6 6 7 7 # Tell kbuild to always build the programs 8 8 always := $(hostprogs-y)
+91
Documentation/vm/hugepage-mmap.c
··· 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 + 25 + #define FILE_NAME "/mnt/hugepagefile" 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 + 51 + static void read_bytes(char *addr) 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); 59 + break; 60 + } 61 + } 62 + 63 + int main(void) 64 + { 65 + void *addr; 66 + int fd; 67 + 68 + fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); 69 + if (fd < 0) { 70 + perror("Open failed"); 71 + exit(1); 72 + } 73 + 74 + addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); 75 + if (addr == MAP_FAILED) { 76 + perror("mmap"); 77 + unlink(FILE_NAME); 78 + exit(1); 79 + } 80 + 81 + printf("Returned address is %p\n", addr); 82 + check_bytes(addr); 83 + write_bytes(addr); 84 + read_bytes(addr); 85 + 86 + munmap(addr, LENGTH); 87 + close(fd); 88 + unlink(FILE_NAME); 89 + 90 + return 0; 91 + }
+98
Documentation/vm/hugepage-shm.c
··· 1 + /* 2 + * hugepage-shm: 3 + * 4 + * Example of using huge page memory in a user application using Sys V shared 5 + * memory system calls. In this example the app is requesting 256MB of 6 + * memory that is backed by huge pages. The application uses the flag 7 + * SHM_HUGETLB in the shmget system call to inform the kernel that it is 8 + * requesting huge pages. 9 + * 10 + * For the ia64 architecture, the Linux kernel reserves Region number 4 for 11 + * huge pages. That means that if one requires a fixed address, a huge page 12 + * aligned address starting with 0x800000... will be required. If a fixed 13 + * address is not required, the kernel will select an address in the proper 14 + * range. 15 + * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. 16 + * 17 + * Note: The default shared memory limit is quite low on many kernels, 18 + * you may need to increase it via: 19 + * 20 + * echo 268435456 > /proc/sys/kernel/shmmax 21 + * 22 + * This will increase the maximum size per shared memory segment to 256MB. 23 + * The other limit that you will hit eventually is shmall which is the 24 + * total amount of shared memory in pages. To set it to 16GB on a system 25 + * with a 4kB pagesize do: 26 + * 27 + * echo 4194304 > /proc/sys/kernel/shmall 28 + */ 29 + 30 + #include <stdlib.h> 31 + #include <stdio.h> 32 + #include <sys/types.h> 33 + #include <sys/ipc.h> 34 + #include <sys/shm.h> 35 + #include <sys/mman.h> 36 + 37 + #ifndef SHM_HUGETLB 38 + #define SHM_HUGETLB 04000 39 + #endif 40 + 41 + #define LENGTH (256UL*1024*1024) 42 + 43 + #define dprintf(x) printf(x) 44 + 45 + /* Only ia64 requires this */ 46 + #ifdef __ia64__ 47 + #define ADDR (void *)(0x8000000000000000UL) 48 + #define SHMAT_FLAGS (SHM_RND) 49 + #else 50 + #define ADDR (void *)(0x0UL) 51 + #define SHMAT_FLAGS (0) 52 + #endif 53 + 54 + int main(void) 55 + { 56 + int shmid; 57 + unsigned long i; 58 + char *shmaddr; 59 + 60 + if ((shmid = shmget(2, LENGTH, 61 + SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) { 62 + perror("shmget"); 63 + exit(1); 64 + } 65 + printf("shmid: 0x%x\n", shmid); 66 + 67 + shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS); 68 + if (shmaddr == (char *)-1) { 69 + perror("Shared memory attach failure"); 70 + shmctl(shmid, IPC_RMID, NULL); 71 + exit(2); 72 + } 73 + printf("shmaddr: %p\n", shmaddr); 74 + 75 + dprintf("Starting the writes:\n"); 76 + for (i = 0; i < LENGTH; i++) { 77 + shmaddr[i] = (char)(i); 78 + if (!(i % (1024 * 1024))) 79 + dprintf("."); 80 + } 81 + dprintf("\n"); 82 + 83 + dprintf("Starting the Check..."); 84 + for (i = 0; i < LENGTH; i++) 85 + if (shmaddr[i] != (char)i) 86 + printf("\nIndex %lu mismatched\n", i); 87 + dprintf("Done.\n"); 88 + 89 + if (shmdt((const void *)shmaddr) != 0) { 90 + perror("Detach failure"); 91 + shmctl(shmid, IPC_RMID, NULL); 92 + exit(3); 93 + } 94 + 95 + shmctl(shmid, IPC_RMID, NULL); 96 + 97 + return 0; 98 + }
+2 -167
Documentation/vm/hugetlbpage.txt
··· 299 299 ******************************************************************* 300 300 301 301 /* 302 - * Example of using huge page memory in a user application using Sys V shared 303 - * memory system calls. In this example the app is requesting 256MB of 304 - * memory that is backed by huge pages. The application uses the flag 305 - * SHM_HUGETLB in the shmget system call to inform the kernel that it is 306 - * requesting huge pages. 307 - * 308 - * For the ia64 architecture, the Linux kernel reserves Region number 4 for 309 - * huge pages. That means that if one requires a fixed address, a huge page 310 - * aligned address starting with 0x800000... will be required. If a fixed 311 - * address is not required, the kernel will select an address in the proper 312 - * range. 313 - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. 314 - * 315 - * Note: The default shared memory limit is quite low on many kernels, 316 - * you may need to increase it via: 317 - * 318 - * echo 268435456 > /proc/sys/kernel/shmmax 319 - * 320 - * This will increase the maximum size per shared memory segment to 256MB. 321 - * The other limit that you will hit eventually is shmall which is the 322 - * total amount of shared memory in pages. To set it to 16GB on a system 323 - * with a 4kB pagesize do: 324 - * 325 - * echo 4194304 > /proc/sys/kernel/shmall 302 + * hugepage-shm: see Documentation/vm/hugepage-shm.c 326 303 */ 327 - #include <stdlib.h> 328 - #include <stdio.h> 329 - #include <sys/types.h> 330 - #include <sys/ipc.h> 331 - #include <sys/shm.h> 332 - #include <sys/mman.h> 333 - 334 - #ifndef SHM_HUGETLB 335 - #define SHM_HUGETLB 04000 336 - #endif 337 - 338 - #define LENGTH (256UL*1024*1024) 339 - 340 - #define dprintf(x) printf(x) 341 - 342 - #define ADDR (void *)(0x0UL) /* let kernel choose address */ 343 - #define SHMAT_FLAGS (0) 344 - 345 - int main(void) 346 - { 347 - int shmid; 348 - unsigned long i; 349 - char *shmaddr; 350 - 351 - if ((shmid = shmget(2, LENGTH, 352 - SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) { 353 - perror("shmget"); 354 - exit(1); 355 - } 356 - printf("shmid: 0x%x\n", shmid); 357 - 358 - shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS); 359 - if (shmaddr == (char *)-1) { 360 - perror("Shared memory attach failure"); 361 - shmctl(shmid, IPC_RMID, NULL); 362 - exit(2); 363 - } 364 - printf("shmaddr: %p\n", shmaddr); 365 - 366 - dprintf("Starting the writes:\n"); 367 - for (i = 0; i < LENGTH; i++) { 368 - shmaddr[i] = (char)(i); 369 - if (!(i % (1024 * 1024))) 370 - dprintf("."); 371 - } 372 - dprintf("\n"); 373 - 374 - dprintf("Starting the Check..."); 375 - for (i = 0; i < LENGTH; i++) 376 - if (shmaddr[i] != (char)i) 377 - printf("\nIndex %lu mismatched\n", i); 378 - dprintf("Done.\n"); 379 - 380 - if (shmdt((const void *)shmaddr) != 0) { 381 - perror("Detach failure"); 382 - shmctl(shmid, IPC_RMID, NULL); 383 - exit(3); 384 - } 385 - 386 - shmctl(shmid, IPC_RMID, NULL); 387 - 388 - return 0; 389 - } 390 304 391 305 ******************************************************************* 392 306 393 307 /* 394 - * Example of using huge page memory in a user application using the mmap 395 - * system call. Before running this application, make sure that the 396 - * administrator has mounted the hugetlbfs filesystem (on some directory 397 - * like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this 398 - * example, the app is requesting memory of size 256MB that is backed by 399 - * huge pages. 400 - * 401 - * For the ia64 architecture, the Linux kernel reserves Region number 4 for 402 - * huge pages. That means that if one requires a fixed address, a huge page 403 - * aligned address starting with 0x800000... will be required. If a fixed 404 - * address is not required, the kernel will select an address in the proper 405 - * range. 406 - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. 308 + * hugepage-mmap: see Documentation/vm/hugepage-mmap.c 407 309 */ 408 - #include <stdlib.h> 409 - #include <stdio.h> 410 - #include <unistd.h> 411 - #include <sys/mman.h> 412 - #include <fcntl.h> 413 - 414 - #define FILE_NAME "/mnt/hugepagefile" 415 - #define LENGTH (256UL*1024*1024) 416 - #define PROTECTION (PROT_READ | PROT_WRITE) 417 - 418 - #define ADDR (void *)(0x0UL) /* let kernel choose address */ 419 - #define FLAGS (MAP_SHARED) 420 - 421 - void check_bytes(char *addr) 422 - { 423 - printf("First hex is %x\n", *((unsigned int *)addr)); 424 - } 425 - 426 - void write_bytes(char *addr) 427 - { 428 - unsigned long i; 429 - 430 - for (i = 0; i < LENGTH; i++) 431 - *(addr + i) = (char)i; 432 - } 433 - 434 - void read_bytes(char *addr) 435 - { 436 - unsigned long i; 437 - 438 - check_bytes(addr); 439 - for (i = 0; i < LENGTH; i++) 440 - if (*(addr + i) != (char)i) { 441 - printf("Mismatch at %lu\n", i); 442 - break; 443 - } 444 - } 445 - 446 - int main(void) 447 - { 448 - void *addr; 449 - int fd; 450 - 451 - fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); 452 - if (fd < 0) { 453 - perror("Open failed"); 454 - exit(1); 455 - } 456 - 457 - addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); 458 - if (addr == MAP_FAILED) { 459 - perror("mmap"); 460 - unlink(FILE_NAME); 461 - exit(1); 462 - } 463 - 464 - printf("Returned address is %p\n", addr); 465 - check_bytes(addr); 466 - write_bytes(addr); 467 - read_bytes(addr); 468 - 469 - munmap(addr, LENGTH); 470 - close(fd); 471 - unlink(FILE_NAME); 472 - 473 - return 0; 474 - }
+3 -3
Documentation/vm/map_hugetlb.c
··· 31 31 #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) 32 32 #endif 33 33 34 - void check_bytes(char *addr) 34 + static void check_bytes(char *addr) 35 35 { 36 36 printf("First hex is %x\n", *((unsigned int *)addr)); 37 37 } 38 38 39 - void write_bytes(char *addr) 39 + static void write_bytes(char *addr) 40 40 { 41 41 unsigned long i; 42 42 ··· 44 44 *(addr + i) = (char)i; 45 45 } 46 46 47 - void read_bytes(char *addr) 47 + static void read_bytes(char *addr) 48 48 { 49 49 unsigned long i; 50 50