1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_VMALLOC_H 3 #define _LINUX_VMALLOC_H 4 5 #include <linux/spinlock.h> 6 #include <linux/init.h> 7 #include <linux/list.h> 8 #include <linux/llist.h> 9 #include <asm/page.h> /* pgprot_t */ 10 #include <linux/rbtree.h> 11 12 struct vm_area_struct; /* vma defining user mapping in mm_types.h */ 13 struct notifier_block; /* in notifier.h */ 14 15 /* bits in flags of vmalloc's vm_struct below */ 16 #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ 17 #define VM_ALLOC 0x00000002 /* vmalloc() */ 18 #define VM_MAP 0x00000004 /* vmap()ed pages */ 19 #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ 20 #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ 21 #define VM_NO_GUARD 0x00000040 /* don't add guard page */ 22 #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */ 23 /* bits [20..32] reserved for arch specific ioremap internals */ 24 25 /* 26 * Maximum alignment for ioremap() regions. 27 * Can be overriden by arch-specific value. 28 */ 29 #ifndef IOREMAP_MAX_ORDER 30 #define IOREMAP_MAX_ORDER (7 + PAGE_SHIFT) /* 128 pages */ 31 #endif 32 33 struct vm_struct { 34 struct vm_struct *next; 35 void *addr; 36 unsigned long size; 37 unsigned long flags; 38 struct page **pages; 39 unsigned int nr_pages; 40 phys_addr_t phys_addr; 41 const void *caller; 42 }; 43 44 struct vmap_area { 45 unsigned long va_start; 46 unsigned long va_end; 47 unsigned long flags; 48 struct rb_node rb_node; /* address sorted rbtree */ 49 struct list_head list; /* address sorted list */ 50 struct llist_node purge_list; /* "lazy purge" list */ 51 struct vm_struct *vm; 52 struct rcu_head rcu_head; 53 }; 54 55 /* 56 * Highlevel APIs for driver use 57 */ 58 extern void vm_unmap_ram(const void *mem, unsigned int count); 59 extern void *vm_map_ram(struct page **pages, unsigned int count, 60 int node, pgprot_t prot); 61 extern void vm_unmap_aliases(void); 62 63 #ifdef CONFIG_MMU 64 extern void __init vmalloc_init(void); 65 #else 66 static inline void vmalloc_init(void) 67 { 68 } 69 #endif 70 71 extern void *vmalloc(unsigned long size); 72 extern void *vzalloc(unsigned long size); 73 extern void *vmalloc_user(unsigned long size); 74 extern void *vmalloc_node(unsigned long size, int node); 75 extern void *vzalloc_node(unsigned long size, int node); 76 extern void *vmalloc_exec(unsigned long size); 77 extern void *vmalloc_32(unsigned long size); 78 extern void *vmalloc_32_user(unsigned long size); 79 extern void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot); 80 extern void *__vmalloc_node_range(unsigned long size, unsigned long align, 81 unsigned long start, unsigned long end, gfp_t gfp_mask, 82 pgprot_t prot, unsigned long vm_flags, int node, 83 const void *caller); 84 #ifndef CONFIG_MMU 85 extern void *__vmalloc_node_flags(unsigned long size, int node, gfp_t flags); 86 static inline void *__vmalloc_node_flags_caller(unsigned long size, int node, 87 gfp_t flags, void *caller) 88 { 89 return __vmalloc_node_flags(size, node, flags); 90 } 91 #else 92 extern void *__vmalloc_node_flags_caller(unsigned long size, 93 int node, gfp_t flags, void *caller); 94 #endif 95 96 extern void vfree(const void *addr); 97 extern void vfree_atomic(const void *addr); 98 99 extern void *vmap(struct page **pages, unsigned int count, 100 unsigned long flags, pgprot_t prot); 101 extern void vunmap(const void *addr); 102 103 extern int remap_vmalloc_range_partial(struct vm_area_struct *vma, 104 unsigned long uaddr, void *kaddr, 105 unsigned long size); 106 107 extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, 108 unsigned long pgoff); 109 void vmalloc_sync_all(void); 110 111 /* 112 * Lowlevel-APIs (not for driver use!) 113 */ 114 115 static inline size_t get_vm_area_size(const struct vm_struct *area) 116 { 117 if (!(area->flags & VM_NO_GUARD)) 118 /* return actual size without guard page */ 119 return area->size - PAGE_SIZE; 120 else 121 return area->size; 122 123 } 124 125 extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags); 126 extern struct vm_struct *get_vm_area_caller(unsigned long size, 127 unsigned long flags, const void *caller); 128 extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, 129 unsigned long start, unsigned long end); 130 extern struct vm_struct *__get_vm_area_caller(unsigned long size, 131 unsigned long flags, 132 unsigned long start, unsigned long end, 133 const void *caller); 134 extern struct vm_struct *remove_vm_area(const void *addr); 135 extern struct vm_struct *find_vm_area(const void *addr); 136 137 extern int map_vm_area(struct vm_struct *area, pgprot_t prot, 138 struct page **pages); 139 #ifdef CONFIG_MMU 140 extern int map_kernel_range_noflush(unsigned long start, unsigned long size, 141 pgprot_t prot, struct page **pages); 142 extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size); 143 extern void unmap_kernel_range(unsigned long addr, unsigned long size); 144 #else 145 static inline int 146 map_kernel_range_noflush(unsigned long start, unsigned long size, 147 pgprot_t prot, struct page **pages) 148 { 149 return size >> PAGE_SHIFT; 150 } 151 static inline void 152 unmap_kernel_range_noflush(unsigned long addr, unsigned long size) 153 { 154 } 155 static inline void 156 unmap_kernel_range(unsigned long addr, unsigned long size) 157 { 158 } 159 #endif 160 161 /* Allocate/destroy a 'vmalloc' VM area. */ 162 extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes); 163 extern void free_vm_area(struct vm_struct *area); 164 165 /* for /dev/kmem */ 166 extern long vread(char *buf, char *addr, unsigned long count); 167 extern long vwrite(char *buf, char *addr, unsigned long count); 168 169 /* 170 * Internals. Dont't use.. 171 */ 172 extern struct list_head vmap_area_list; 173 extern __init void vm_area_add_early(struct vm_struct *vm); 174 extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); 175 176 #ifdef CONFIG_SMP 177 # ifdef CONFIG_MMU 178 struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, 179 const size_t *sizes, int nr_vms, 180 size_t align); 181 182 void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); 183 # else 184 static inline struct vm_struct ** 185 pcpu_get_vm_areas(const unsigned long *offsets, 186 const size_t *sizes, int nr_vms, 187 size_t align) 188 { 189 return NULL; 190 } 191 192 static inline void 193 pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) 194 { 195 } 196 # endif 197 #endif 198 199 #ifdef CONFIG_MMU 200 #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) 201 #else 202 #define VMALLOC_TOTAL 0UL 203 #endif 204 205 int register_vmap_purge_notifier(struct notifier_block *nb); 206 int unregister_vmap_purge_notifier(struct notifier_block *nb); 207 208 #endif /* _LINUX_VMALLOC_H */ 209