Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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: 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 */ 196: