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