Branch data Line data Source code
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 : : #include <linux/overflow.h>
12 : :
13 : : #include <asm/vmalloc.h>
14 : :
15 : : struct vm_area_struct; /* vma defining user mapping in mm_types.h */
16 : : struct notifier_block; /* in notifier.h */
17 : :
18 : : /* bits in flags of vmalloc's vm_struct below */
19 : : #define VM_IOREMAP 0x00000001 /* ioremap() and friends */
20 : : #define VM_ALLOC 0x00000002 /* vmalloc() */
21 : : #define VM_MAP 0x00000004 /* vmap()ed pages */
22 : : #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */
23 : : #define VM_DMA_COHERENT 0x00000010 /* dma_alloc_coherent */
24 : : #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */
25 : : #define VM_NO_GUARD 0x00000040 /* don't add guard page */
26 : : #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */
27 : :
28 : : /*
29 : : * VM_KASAN is used slighly differently depending on CONFIG_KASAN_VMALLOC.
30 : : *
31 : : * If IS_ENABLED(CONFIG_KASAN_VMALLOC), VM_KASAN is set on a vm_struct after
32 : : * shadow memory has been mapped. It's used to handle allocation errors so that
33 : : * we don't try to poision shadow on free if it was never allocated.
34 : : *
35 : : * Otherwise, VM_KASAN is set for kasan_module_alloc() allocations and used to
36 : : * determine which allocations need the module shadow freed.
37 : : */
38 : :
39 : : /*
40 : : * Memory with VM_FLUSH_RESET_PERMS cannot be freed in an interrupt or with
41 : : * vfree_atomic().
42 : : */
43 : : #define VM_FLUSH_RESET_PERMS 0x00000100 /* Reset direct map and flush TLB on unmap */
44 : :
45 : : /* bits [20..32] reserved for arch specific ioremap internals */
46 : :
47 : : /*
48 : : * Maximum alignment for ioremap() regions.
49 : : * Can be overriden by arch-specific value.
50 : : */
51 : : #ifndef IOREMAP_MAX_ORDER
52 : : #define IOREMAP_MAX_ORDER (7 + PAGE_SHIFT) /* 128 pages */
53 : : #endif
54 : :
55 : : struct vm_struct {
56 : : struct vm_struct *next;
57 : : void *addr;
58 : : unsigned long size;
59 : : unsigned long flags;
60 : : struct page **pages;
61 : : unsigned int nr_pages;
62 : : phys_addr_t phys_addr;
63 : : const void *caller;
64 : : };
65 : :
66 : : struct vmap_area {
67 : : unsigned long va_start;
68 : : unsigned long va_end;
69 : :
70 : : struct rb_node rb_node; /* address sorted rbtree */
71 : : struct list_head list; /* address sorted list */
72 : :
73 : : /*
74 : : * The following three variables can be packed, because
75 : : * a vmap_area object is always one of the three states:
76 : : * 1) in "free" tree (root is vmap_area_root)
77 : : * 2) in "busy" tree (root is free_vmap_area_root)
78 : : * 3) in purge list (head is vmap_purge_list)
79 : : */
80 : : union {
81 : : unsigned long subtree_max_size; /* in "free" tree */
82 : : struct vm_struct *vm; /* in "busy" tree */
83 : : struct llist_node purge_list; /* in purge list */
84 : : };
85 : : };
86 : :
87 : : /*
88 : : * Highlevel APIs for driver use
89 : : */
90 : : extern void vm_unmap_ram(const void *mem, unsigned int count);
91 : : extern void *vm_map_ram(struct page **pages, unsigned int count,
92 : : int node, pgprot_t prot);
93 : : extern void vm_unmap_aliases(void);
94 : :
95 : : #ifdef CONFIG_MMU
96 : : extern void __init vmalloc_init(void);
97 : : extern unsigned long vmalloc_nr_pages(void);
98 : : #else
99 : : static inline void vmalloc_init(void)
100 : : {
101 : : }
102 : : static inline unsigned long vmalloc_nr_pages(void) { return 0; }
103 : : #endif
104 : :
105 : : extern void *vmalloc(unsigned long size);
106 : : extern void *vzalloc(unsigned long size);
107 : : extern void *vmalloc_user(unsigned long size);
108 : : extern void *vmalloc_node(unsigned long size, int node);
109 : : extern void *vzalloc_node(unsigned long size, int node);
110 : : extern void *vmalloc_user_node_flags(unsigned long size, int node, gfp_t flags);
111 : : extern void *vmalloc_exec(unsigned long size);
112 : : extern void *vmalloc_32(unsigned long size);
113 : : extern void *vmalloc_32_user(unsigned long size);
114 : : extern void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot);
115 : : extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
116 : : unsigned long start, unsigned long end, gfp_t gfp_mask,
117 : : pgprot_t prot, unsigned long vm_flags, int node,
118 : : const void *caller);
119 : : #ifndef CONFIG_MMU
120 : : extern void *__vmalloc_node_flags(unsigned long size, int node, gfp_t flags);
121 : : static inline void *__vmalloc_node_flags_caller(unsigned long size, int node,
122 : : gfp_t flags, void *caller)
123 : : {
124 : : return __vmalloc_node_flags(size, node, flags);
125 : : }
126 : : #else
127 : : extern void *__vmalloc_node_flags_caller(unsigned long size,
128 : : int node, gfp_t flags, void *caller);
129 : : #endif
130 : :
131 : : extern void vfree(const void *addr);
132 : : extern void vfree_atomic(const void *addr);
133 : :
134 : : extern void *vmap(struct page **pages, unsigned int count,
135 : : unsigned long flags, pgprot_t prot);
136 : : extern void vunmap(const void *addr);
137 : :
138 : : extern int remap_vmalloc_range_partial(struct vm_area_struct *vma,
139 : : unsigned long uaddr, void *kaddr,
140 : : unsigned long size);
141 : :
142 : : extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
143 : : unsigned long pgoff);
144 : : void vmalloc_sync_mappings(void);
145 : : void vmalloc_sync_unmappings(void);
146 : :
147 : : /*
148 : : * Lowlevel-APIs (not for driver use!)
149 : : */
150 : :
151 : 362032 : static inline size_t get_vm_area_size(const struct vm_struct *area)
152 : : {
153 [ + - - - : 362032 : if (!(area->flags & VM_NO_GUARD))
- - - - -
- + + +
+ ]
154 : : /* return actual size without guard page */
155 : 242132 : return area->size - PAGE_SIZE;
156 : : else
157 : : return area->size;
158 : :
159 : : }
160 : :
161 : : extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags);
162 : : extern struct vm_struct *get_vm_area_caller(unsigned long size,
163 : : unsigned long flags, const void *caller);
164 : : extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
165 : : unsigned long start, unsigned long end);
166 : : extern struct vm_struct *__get_vm_area_caller(unsigned long size,
167 : : unsigned long flags,
168 : : unsigned long start, unsigned long end,
169 : : const void *caller);
170 : : extern struct vm_struct *remove_vm_area(const void *addr);
171 : : extern struct vm_struct *find_vm_area(const void *addr);
172 : :
173 : : extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
174 : : struct page **pages);
175 : : #ifdef CONFIG_MMU
176 : : extern int map_kernel_range_noflush(unsigned long start, unsigned long size,
177 : : pgprot_t prot, struct page **pages);
178 : : extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size);
179 : : extern void unmap_kernel_range(unsigned long addr, unsigned long size);
180 : 682 : static inline void set_vm_flush_reset_perms(void *addr)
181 : : {
182 : 682 : struct vm_struct *vm = find_vm_area(addr);
183 : :
184 [ + - + - ]: 682 : if (vm)
185 : 682 : vm->flags |= VM_FLUSH_RESET_PERMS;
186 : : }
187 : : #else
188 : : static inline int
189 : : map_kernel_range_noflush(unsigned long start, unsigned long size,
190 : : pgprot_t prot, struct page **pages)
191 : : {
192 : : return size >> PAGE_SHIFT;
193 : : }
194 : : static inline void
195 : : unmap_kernel_range_noflush(unsigned long addr, unsigned long size)
196 : : {
197 : : }
198 : : static inline void
199 : : unmap_kernel_range(unsigned long addr, unsigned long size)
200 : : {
201 : : }
202 : : static inline void set_vm_flush_reset_perms(void *addr)
203 : : {
204 : : }
205 : : #endif
206 : :
207 : : /* Allocate/destroy a 'vmalloc' VM area. */
208 : : extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
209 : : extern void free_vm_area(struct vm_struct *area);
210 : :
211 : : /* for /dev/kmem */
212 : : extern long vread(char *buf, char *addr, unsigned long count);
213 : : extern long vwrite(char *buf, char *addr, unsigned long count);
214 : :
215 : : /*
216 : : * Internals. Dont't use..
217 : : */
218 : : extern struct list_head vmap_area_list;
219 : : extern __init void vm_area_add_early(struct vm_struct *vm);
220 : : extern __init void vm_area_register_early(struct vm_struct *vm, size_t align);
221 : :
222 : : #ifdef CONFIG_SMP
223 : : # ifdef CONFIG_MMU
224 : : struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
225 : : const size_t *sizes, int nr_vms,
226 : : size_t align);
227 : :
228 : : void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms);
229 : : # else
230 : : static inline struct vm_struct **
231 : : pcpu_get_vm_areas(const unsigned long *offsets,
232 : : const size_t *sizes, int nr_vms,
233 : : size_t align)
234 : : {
235 : : return NULL;
236 : : }
237 : :
238 : : static inline void
239 : : pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
240 : : {
241 : : }
242 : : # endif
243 : : #endif
244 : :
245 : : #ifdef CONFIG_MMU
246 : : #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
247 : : #else
248 : : #define VMALLOC_TOTAL 0UL
249 : : #endif
250 : :
251 : : int register_vmap_purge_notifier(struct notifier_block *nb);
252 : : int unregister_vmap_purge_notifier(struct notifier_block *nb);
253 : :
254 : : #endif /* _LINUX_VMALLOC_H */
|