 42d7395feb
			
		
	
	
	42d7395feb
	
	
	
		
			
			There was some desire in large applications using MAP_HUGETLB or SHM_HUGETLB to use 1GB huge pages on some mappings, and stay with 2MB on others. This is useful together with NUMA policy: use 2MB interleaving on some mappings, but 1GB on local mappings. This patch extends the IPC/SHM syscall interfaces slightly to allow specifying the page size. It borrows some upper bits in the existing flag arguments and allows encoding the log of the desired page size in addition to the *_HUGETLB flag. When 0 is specified the default size is used, this makes the change fully compatible. Extending the internal hugetlb code to handle this is straight forward. Instead of a single mount it just keeps an array of them and selects the right mount based on the specified page size. When no page size is specified it uses the mount of the default page size. The change is not visible in /proc/mounts because internal mounts don't appear there. It also has very little overhead: the additional mounts just consume a super block, but not more memory when not used. I also exported the new flags to the user headers (they were previously under __KERNEL__). Right now only symbols for x86 and some other architecture for 1GB and 2MB are defined. The interface should already work for all other architectures though. Only architectures that define multiple hugetlb sizes actually need it (that is currently x86, tile, powerpc). However tile and powerpc have user configurable hugetlb sizes, so it's not easy to add defines. A program on those architectures would need to query sysfs and use the appropiate log2. [akpm@linux-foundation.org: cleanups] [rientjes@google.com: fix build] [akpm@linux-foundation.org: checkpatch fixes] Signed-off-by: Andi Kleen <ak@linux.intel.com> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Hillf Danton <dhillf@gmail.com> Signed-off-by: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			3.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			3.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __PARISC_MMAN_H__
 | |
| #define __PARISC_MMAN_H__
 | |
| 
 | |
| #define PROT_READ	0x1		/* page can be read */
 | |
| #define PROT_WRITE	0x2		/* page can be written */
 | |
| #define PROT_EXEC	0x4		/* page can be executed */
 | |
| #define PROT_SEM	0x8		/* page may be used for atomic ops */
 | |
| #define PROT_NONE	0x0		/* page can not be accessed */
 | |
| #define PROT_GROWSDOWN	0x01000000	/* mprotect flag: extend change to start of growsdown vma */
 | |
| #define PROT_GROWSUP	0x02000000	/* mprotect flag: extend change to end of growsup vma */
 | |
| 
 | |
| #define MAP_SHARED	0x01		/* Share changes */
 | |
| #define MAP_PRIVATE	0x02		/* Changes are private */
 | |
| #define MAP_TYPE	0x03		/* Mask for type of mapping */
 | |
| #define MAP_FIXED	0x04		/* Interpret addr exactly */
 | |
| #define MAP_ANONYMOUS	0x10		/* don't use a file */
 | |
| 
 | |
| #define MAP_DENYWRITE	0x0800		/* ETXTBSY */
 | |
| #define MAP_EXECUTABLE	0x1000		/* mark it as an executable */
 | |
| #define MAP_LOCKED	0x2000		/* pages are locked */
 | |
| #define MAP_NORESERVE	0x4000		/* don't check for reservations */
 | |
| #define MAP_GROWSDOWN	0x8000		/* stack-like segment */
 | |
| #define MAP_POPULATE	0x10000		/* populate (prefault) pagetables */
 | |
| #define MAP_NONBLOCK	0x20000		/* do not block on IO */
 | |
| #define MAP_STACK	0x40000		/* give out an address that is best suited for process/thread stacks */
 | |
| #define MAP_HUGETLB	0x80000		/* create a huge page mapping */
 | |
| 
 | |
| #define MS_SYNC		1		/* synchronous memory sync */
 | |
| #define MS_ASYNC	2		/* sync memory asynchronously */
 | |
| #define MS_INVALIDATE	4		/* invalidate the caches */
 | |
| 
 | |
| #define MCL_CURRENT	1		/* lock all current mappings */
 | |
| #define MCL_FUTURE	2		/* lock all future mappings */
 | |
| 
 | |
| #define MADV_NORMAL     0               /* no further special treatment */
 | |
| #define MADV_RANDOM     1               /* expect random page references */
 | |
| #define MADV_SEQUENTIAL 2               /* expect sequential page references */
 | |
| #define MADV_WILLNEED   3               /* will need these pages */
 | |
| #define MADV_DONTNEED   4               /* don't need these pages */
 | |
| #define MADV_SPACEAVAIL 5               /* insure that resources are reserved */
 | |
| #define MADV_VPS_PURGE  6               /* Purge pages from VM page cache */
 | |
| #define MADV_VPS_INHERIT 7              /* Inherit parents page size */
 | |
| 
 | |
| /* common/generic parameters */
 | |
| #define MADV_REMOVE	9		/* remove these pages & resources */
 | |
| #define MADV_DONTFORK	10		/* don't inherit across fork */
 | |
| #define MADV_DOFORK	11		/* do inherit across fork */
 | |
| 
 | |
| /* The range 12-64 is reserved for page size specification. */
 | |
| #define MADV_4K_PAGES   12              /* Use 4K pages  */
 | |
| #define MADV_16K_PAGES  14              /* Use 16K pages */
 | |
| #define MADV_64K_PAGES  16              /* Use 64K pages */
 | |
| #define MADV_256K_PAGES 18              /* Use 256K pages */
 | |
| #define MADV_1M_PAGES   20              /* Use 1 Megabyte pages */
 | |
| #define MADV_4M_PAGES   22              /* Use 4 Megabyte pages */
 | |
| #define MADV_16M_PAGES  24              /* Use 16 Megabyte pages */
 | |
| #define MADV_64M_PAGES  26              /* Use 64 Megabyte pages */
 | |
| 
 | |
| #define MADV_MERGEABLE   65		/* KSM may merge identical pages */
 | |
| #define MADV_UNMERGEABLE 66		/* KSM may not merge identical pages */
 | |
| 
 | |
| #define MADV_HUGEPAGE	67		/* Worth backing with hugepages */
 | |
| #define MADV_NOHUGEPAGE	68		/* Not worth backing with hugepages */
 | |
| 
 | |
| #define MADV_DONTDUMP   69		/* Explicity exclude from the core dump,
 | |
| 					   overrides the coredump filter bits */
 | |
| #define MADV_DODUMP	70		/* Clear the MADV_NODUMP flag */
 | |
| 
 | |
| /* compatibility flags */
 | |
| #define MAP_FILE	0
 | |
| #define MAP_VARIABLE	0
 | |
| 
 | |
| /*
 | |
|  * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size.
 | |
|  * This gives us 6 bits, which is enough until someone invents 128 bit address
 | |
|  * spaces.
 | |
|  *
 | |
|  * Assume these are all power of twos.
 | |
|  * When 0 use the default page size.
 | |
|  */
 | |
| #define MAP_HUGE_SHIFT	26
 | |
| #define MAP_HUGE_MASK	0x3f
 | |
| 
 | |
| #endif /* __PARISC_MMAN_H__ */
 |