Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 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 : 3531717 : static inline void vm_acct_memory(long pages) 67 : : { 68 : 3531717 : percpu_counter_add_batch(&vm_committed_as, pages, vm_committed_as_batch); 69 : : } 70 : : 71 : 1081046 : static inline void vm_unacct_memory(long pages) 72 : : { 73 : 1081046 : vm_acct_memory(-pages); 74 : 2685 : } 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 : 468474 : static inline bool arch_validate_prot(unsigned long prot, unsigned long addr) 96 : : { 97 [ + - ]: 468474 : 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 : 2645248 : calc_vm_prot_bits(unsigned long prot, unsigned long pkey) 118 : : { 119 : 2645248 : return _calc_vm_trans(prot, PROT_READ, VM_READ ) | 120 : 2645248 : _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) | 121 : 2645248 : _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) | 122 [ - + ]: 2645248 : 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 : 2176774 : calc_vm_flag_bits(unsigned long flags) 130 : : { 131 : 2176774 : return _calc_vm_trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN ) | 132 : 2176774 : _calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) | 133 : 2176774 : _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED ) | 134 [ - + ]: 2176774 : _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ); 135 : : } 136 : : 137 : : unsigned long vm_commit_limit(void); 138 : : #endif /* _LINUX_MMAN_H */