root/include/linux/mman.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. vm_acct_memory
  2. vm_unacct_memory
  3. arch_validate_prot
  4. calc_vm_prot_bits
  5. calc_vm_flag_bits

   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 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 /* _LINUX_MMAN_H */

/* [<][>][^][v][top][bottom][index][help] */