| 1 |
|
| 2 | #ifndef _LINUX_MMAN_H
|
| 3 | #define _LINUX_MMAN_H
|
| 4 |
|
| 5 | #include <linux/mm.h>
|
| 6 | #include <linux/percpu_counter.h>
|
| 7 |
|
| 8 | #include <linux/atomic.h>
|
| 9 | #include <uapi/linux/mman.h>
|
| 10 |
|
| 11 | |
| 12 | * Arrange for legacy / undefined architecture specific flags to be
|
| 13 | * ignored by mmap handling code.
|
| 14 |
|
| 15 | #ifndef MAP_32BIT
|
| 16 | #define MAP_32BIT 0
|
| 17 | #endif
|
| 18 | #ifndef MAP_HUGE_2MB
|
| 19 | #define MAP_HUGE_2MB 0
|
| 20 | #endif
|
| 21 | #ifndef MAP_HUGE_1GB
|
| 22 | #define MAP_HUGE_1GB 0
|
| 23 | #endif
|
| 24 | #ifndef MAP_UNINITIALIZED
|
| 25 | #define MAP_UNINITIALIZED 0
|
| 26 | #endif
|
| 27 | #ifndef MAP_SYNC
|
| 28 | #define MAP_SYNC 0
|
| 29 | #endif
|
| 30 |
|
| 31 | |
| 32 | * The historical set of flags that all mmap implementations implicitly
|
| 33 | * support when a ->mmap_validate() op is not provided in file_operations.
|
| 34 |
|
| 35 | #define LEGACY_MAP_MASK (MAP_SHARED \
|
| 36 | | MAP_PRIVATE \
|
| 37 | | MAP_FIXED \
|
| 38 | | MAP_ANONYMOUS \
|
| 39 | | MAP_DENYWRITE \
|
| 40 | | MAP_EXECUTABLE \
|
| 41 | | MAP_UNINITIALIZED \
|
| 42 | | MAP_GROWSDOWN \
|
| 43 | | MAP_LOCKED \
|
| 44 | | MAP_NORESERVE \
|
| 45 | | MAP_POPULATE \
|
| 46 | | MAP_NONBLOCK \
|
| 47 | | MAP_STACK \
|
| 48 | | MAP_HUGETLB \
|
| 49 | | MAP_32BIT \
|
| 50 | | MAP_HUGE_2MB \
|
| 51 | | MAP_HUGE_1GB)
|
| 52 |
|
| 53 | extern int sysctl_overcommit_memory;
|
| 54 | extern int sysctl_overcommit_ratio;
|
| 55 | extern unsigned long sysctl_overcommit_kbytes;
|
| 56 | extern struct percpu_counter vm_committed_as;
|
| 57 |
|
| 58 | #ifdef CONFIG_SMP
|
| 59 | extern s32 vm_committed_as_batch;
|
| 60 | #else
|
| 61 | #define vm_committed_as_batch 0
|
| 62 | #endif
|
| 63 |
|
| 64 | unsigned long vm_memory_committed(void);
|
| 65 |
|
| 66 | static inline void vm_acct_memory(long pages)
|
| 67 | {
|
| 68 | percpu_counter_add_batch(&vm_committed_as, pages, vm_committed_as_batch);
|
| 69 | }
|
| 70 |
|
| 71 | static inline void vm_unacct_memory(long pages)
|
| 72 | {
|
| 73 | vm_acct_memory(-pages);
|
| 74 | }
|
| 75 |
|
| 76 | |
| 77 | * Allow architectures to handle additional protection bits
|
| 78 |
|
| 79 |
|
| 80 | #ifndef arch_calc_vm_prot_bits
|
| 81 | #define arch_calc_vm_prot_bits(prot, pkey) 0
|
| 82 | #endif
|
| 83 |
|
| 84 | #ifndef arch_vm_get_page_prot
|
| 85 | #define arch_vm_get_page_prot(vm_flags) __pgprot(0)
|
| 86 | #endif
|
| 87 |
|
| 88 | #ifndef arch_validate_prot
|
| 89 | |
| 90 | * This is called from mprotect(). PROT_GROWSDOWN and PROT_GROWSUP have
|
| 91 | * already been masked out.
|
| 92 | *
|
| 93 | * Returns true if the prot flags are valid
|
| 94 |
|
| 95 | static inline bool arch_validate_prot(unsigned long prot, unsigned long addr)
|
| 96 | {
|
| 97 | return (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) == 0;
|
| 98 | }
|
| 99 | #define arch_validate_prot arch_validate_prot
|
| 100 | #endif
|
| 101 |
|
| 102 | |
| 103 | * Optimisation macro. It is equivalent to:
|
| 104 | * (x & bit1) ? bit2 : 0
|
| 105 | * but this version is faster.
|
| 106 | * ("bit1" and "bit2" must be single bits)
|
| 107 |
|
| 108 | #define _calc_vm_trans(x, bit1, bit2) \
|
| 109 | ((!(bit1) || !(bit2)) ? 0 : \
|
| 110 | ((bit1) <= (bit2) ? ((x) & (bit1)) * ((bit2) / (bit1)) \
|
| 111 | : ((x) & (bit1)) / ((bit1) / (bit2))))
|
| 112 |
|
| 113 | |
| 114 | * Combine the mmap "prot" argument into "vm_flags" used internally.
|
| 115 |
|
| 116 | static inline unsigned long
|
| 117 | calc_vm_prot_bits(unsigned long prot, unsigned long pkey)
|
| 118 | {
|
| 119 | return _calc_vm_trans(prot, PROT_READ, VM_READ ) |
|
| 120 | _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
|
| 121 | _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) |
|
| 122 | arch_calc_vm_prot_bits(prot, pkey);
|
| 123 | }
|
| 124 |
|
| 125 | |
| 126 | * Combine the mmap "flags" argument into "vm_flags" used internally.
|
| 127 |
|
| 128 | static inline unsigned long
|
| 129 | calc_vm_flag_bits(unsigned long flags)
|
| 130 | {
|
| 131 | return _calc_vm_trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN ) |
|
| 132 | _calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) |
|
| 133 | _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED ) |
|
| 134 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC );
|
| 135 | }
|
| 136 |
|
| 137 | unsigned long vm_commit_limit(void);
|
| 138 | #endif
|