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