linux/include/linux/vmalloc.h
<<
>>
Prefs
   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
  10struct 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
  29struct 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
  40struct 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 */
  54extern void vm_unmap_ram(const void *mem, unsigned int count);
  55extern void *vm_map_ram(struct page **pages, unsigned int count,
  56                                int node, pgprot_t prot);
  57extern void vm_unmap_aliases(void);
  58
  59#ifdef CONFIG_MMU
  60extern void __init vmalloc_init(void);
  61#else
  62static inline void vmalloc_init(void)
  63{
  64}
  65#endif
  66
  67extern void *vmalloc(unsigned long size);
  68extern void *vzalloc(unsigned long size);
  69extern void *vmalloc_user(unsigned long size);
  70extern void *vmalloc_node(unsigned long size, int node);
  71extern void *vzalloc_node(unsigned long size, int node);
  72extern void *vmalloc_exec(unsigned long size);
  73extern void *vmalloc_32(unsigned long size);
  74extern void *vmalloc_32_user(unsigned long size);
  75extern void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot);
  76extern 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);
  79extern void vfree(const void *addr);
  80
  81extern void *vmap(struct page **pages, unsigned int count,
  82                        unsigned long flags, pgprot_t prot);
  83extern void vunmap(const void *addr);
  84
  85extern int remap_vmalloc_range_partial(struct vm_area_struct *vma,
  86                                       unsigned long uaddr, void *kaddr,
  87                                       unsigned long size);
  88
  89extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
  90                                                        unsigned long pgoff);
  91void vmalloc_sync_all(void);
  92 
  93/*
  94 *      Lowlevel-APIs (not for driver use!)
  95 */
  96
  97static 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
 103extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags);
 104extern struct vm_struct *get_vm_area_caller(unsigned long size,
 105                                        unsigned long flags, const void *caller);
 106extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
 107                                        unsigned long start, unsigned long end);
 108extern 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);
 112extern struct vm_struct *remove_vm_area(const void *addr);
 113extern struct vm_struct *find_vm_area(const void *addr);
 114
 115extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
 116                        struct page ***pages);
 117#ifdef CONFIG_MMU
 118extern int map_kernel_range_noflush(unsigned long start, unsigned long size,
 119                                    pgprot_t prot, struct page **pages);
 120extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size);
 121extern void unmap_kernel_range(unsigned long addr, unsigned long size);
 122#else
 123static inline int
 124map_kernel_range_noflush(unsigned long start, unsigned long size,
 125                        pgprot_t prot, struct page **pages)
 126{
 127        return size >> PAGE_SHIFT;
 128}
 129static inline void
 130unmap_kernel_range_noflush(unsigned long addr, unsigned long size)
 131{
 132}
 133static inline void
 134unmap_kernel_range(unsigned long addr, unsigned long size)
 135{
 136}
 137#endif
 138
 139/* Allocate/destroy a 'vmalloc' VM area. */
 140extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
 141extern void free_vm_area(struct vm_struct *area);
 142
 143/* for /dev/kmem */
 144extern long vread(char *buf, char *addr, unsigned long count);
 145extern long vwrite(char *buf, char *addr, unsigned long count);
 146
 147/*
 148 *      Internals.  Dont't use..
 149 */
 150extern struct list_head vmap_area_list;
 151extern __init void vm_area_add_early(struct vm_struct *vm);
 152extern __init void vm_area_register_early(struct vm_struct *vm, size_t align);
 153
 154#ifdef CONFIG_SMP
 155# ifdef CONFIG_MMU
 156struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
 157                                     const size_t *sizes, int nr_vms,
 158                                     size_t align);
 159
 160void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms);
 161# else
 162static inline struct vm_struct **
 163pcpu_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
 170static inline void
 171pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
 172{
 173}
 174# endif
 175#endif
 176
 177struct 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)
 184extern void get_vmalloc_info(struct vmalloc_info *vmi);
 185#else
 186
 187#define VMALLOC_TOTAL 0UL
 188#define get_vmalloc_info(vmi)                   \
 189do {                                            \
 190        (vmi)->used = 0;                        \
 191        (vmi)->largest_chunk = 0;               \
 192} while (0)
 193#endif
 194
 195#endif /* _LINUX_VMALLOC_H */
 196