blob: d9e82daa6d569cdca69bbcb99736127d8fe5feba [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001#ifndef _LINUX_VMALLOC_H
2#define _LINUX_VMALLOC_H
3
4#include <linux/spinlock.h>
5#include <linux/init.h>
6#include <asm/page.h>
7
8struct vm_area_struct;
9
10#define VM_IOREMAP 0x00000001
11#define VM_ALLOC 0x00000002
12#define VM_MAP 0x00000004
13#define VM_USERMAP 0x00000008
14#define VM_VPAGES 0x00000010
15#define VM_UNLIST 0x00000020
16
17#ifndef IOREMAP_MAX_ORDER
18#define IOREMAP_MAX_ORDER (7 + PAGE_SHIFT)
19#endif
20
21struct vm_struct {
22 struct vm_struct *next;
23 void *addr;
24 unsigned long size;
25 unsigned long flags;
26 struct page **pages;
27 unsigned int nr_pages;
28 phys_addr_t phys_addr;
29 void *caller;
30};
31
32extern void vm_unmap_ram(const void *mem, unsigned int count);
33extern void *vm_map_ram(struct page **pages, unsigned int count,
34 int node, pgprot_t prot);
35extern void vm_unmap_aliases(void);
36
37#ifdef CONFIG_MMU
38extern void __init vmalloc_init(void);
39#else
40static inline void vmalloc_init(void)
41{
42}
43#endif
44
45extern void *vmalloc(unsigned long size);
46extern void *vzalloc(unsigned long size);
47extern void *vmalloc_user(unsigned long size);
48extern void *vmalloc_node(unsigned long size, int node);
49extern void *vzalloc_node(unsigned long size, int node);
50extern void *vmalloc_exec(unsigned long size);
51extern void *vmalloc_32(unsigned long size);
52extern void *vmalloc_32_user(unsigned long size);
53extern void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot);
54extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
55 unsigned long start, unsigned long end, gfp_t gfp_mask,
56 pgprot_t prot, int node, void *caller);
57extern void vfree(const void *addr);
58
59extern void *vmap(struct page **pages, unsigned int count,
60 unsigned long flags, pgprot_t prot);
61extern void vunmap(const void *addr);
62
63extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
64 unsigned long pgoff);
65void vmalloc_sync_all(void);
66
67
68static inline size_t get_vm_area_size(const struct vm_struct *area)
69{
70
71 return area->size - PAGE_SIZE;
72}
73
74extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags);
75extern struct vm_struct *get_vm_area_caller(unsigned long size,
76 unsigned long flags, void *caller);
77extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
78 unsigned long start, unsigned long end);
79extern struct vm_struct *__get_vm_area_caller(unsigned long size,
80 unsigned long flags,
81 unsigned long start, unsigned long end,
82 void *caller);
83extern struct vm_struct *remove_vm_area(const void *addr);
84
85extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
86 struct page ***pages);
87#ifdef CONFIG_MMU
88extern int map_kernel_range_noflush(unsigned long start, unsigned long size,
89 pgprot_t prot, struct page **pages);
90extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size);
91extern void unmap_kernel_range(unsigned long addr, unsigned long size);
92#else
93static inline int
94map_kernel_range_noflush(unsigned long start, unsigned long size,
95 pgprot_t prot, struct page **pages)
96{
97 return size >> PAGE_SHIFT;
98}
99static inline void
100unmap_kernel_range_noflush(unsigned long addr, unsigned long size)
101{
102}
103static inline void
104unmap_kernel_range(unsigned long addr, unsigned long size)
105{
106}
107#endif
108
109extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
110extern void free_vm_area(struct vm_struct *area);
111
112extern long vread(char *buf, char *addr, unsigned long count);
113extern long vwrite(char *buf, char *addr, unsigned long count);
114
115extern rwlock_t vmlist_lock;
116extern struct vm_struct *vmlist;
117extern __init void vm_area_add_early(struct vm_struct *vm);
118extern __init void vm_area_register_early(struct vm_struct *vm, size_t align);
119
120#ifdef CONFIG_SMP
121# ifdef CONFIG_MMU
122struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
123 const size_t *sizes, int nr_vms,
124 size_t align);
125
126void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms);
127# else
128static inline struct vm_struct **
129pcpu_get_vm_areas(const unsigned long *offsets,
130 const size_t *sizes, int nr_vms,
131 size_t align)
132{
133 return NULL;
134}
135
136static inline void
137pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
138{
139}
140# endif
141#endif
142
143#endif