diff options
Diffstat (limited to 'include/linux/gfp.h')
-rw-r--r-- | include/linux/gfp.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/include/linux/gfp.h b/include/linux/gfp.h new file mode 100644 index 000000000000..848a1baac079 --- /dev/null +++ b/include/linux/gfp.h | |||
@@ -0,0 +1,134 @@ | |||
1 | #ifndef __LINUX_GFP_H | ||
2 | #define __LINUX_GFP_H | ||
3 | |||
4 | #include <linux/mmzone.h> | ||
5 | #include <linux/stddef.h> | ||
6 | #include <linux/linkage.h> | ||
7 | #include <linux/config.h> | ||
8 | |||
9 | struct vm_area_struct; | ||
10 | |||
11 | /* | ||
12 | * GFP bitmasks.. | ||
13 | */ | ||
14 | /* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low two bits) */ | ||
15 | #define __GFP_DMA 0x01 | ||
16 | #define __GFP_HIGHMEM 0x02 | ||
17 | |||
18 | /* | ||
19 | * Action modifiers - doesn't change the zoning | ||
20 | * | ||
21 | * __GFP_REPEAT: Try hard to allocate the memory, but the allocation attempt | ||
22 | * _might_ fail. This depends upon the particular VM implementation. | ||
23 | * | ||
24 | * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller | ||
25 | * cannot handle allocation failures. | ||
26 | * | ||
27 | * __GFP_NORETRY: The VM implementation must not retry indefinitely. | ||
28 | */ | ||
29 | #define __GFP_WAIT 0x10u /* Can wait and reschedule? */ | ||
30 | #define __GFP_HIGH 0x20u /* Should access emergency pools? */ | ||
31 | #define __GFP_IO 0x40u /* Can start physical IO? */ | ||
32 | #define __GFP_FS 0x80u /* Can call down to low-level FS? */ | ||
33 | #define __GFP_COLD 0x100u /* Cache-cold page required */ | ||
34 | #define __GFP_NOWARN 0x200u /* Suppress page allocation failure warning */ | ||
35 | #define __GFP_REPEAT 0x400u /* Retry the allocation. Might fail */ | ||
36 | #define __GFP_NOFAIL 0x800u /* Retry for ever. Cannot fail */ | ||
37 | #define __GFP_NORETRY 0x1000u /* Do not retry. Might fail */ | ||
38 | #define __GFP_NO_GROW 0x2000u /* Slab internal usage */ | ||
39 | #define __GFP_COMP 0x4000u /* Add compound page metadata */ | ||
40 | #define __GFP_ZERO 0x8000u /* Return zeroed page on success */ | ||
41 | |||
42 | #define __GFP_BITS_SHIFT 16 /* Room for 16 __GFP_FOO bits */ | ||
43 | #define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1) | ||
44 | |||
45 | /* if you forget to add the bitmask here kernel will crash, period */ | ||
46 | #define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \ | ||
47 | __GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \ | ||
48 | __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP) | ||
49 | |||
50 | #define GFP_ATOMIC (__GFP_HIGH) | ||
51 | #define GFP_NOIO (__GFP_WAIT) | ||
52 | #define GFP_NOFS (__GFP_WAIT | __GFP_IO) | ||
53 | #define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) | ||
54 | #define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS) | ||
55 | #define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HIGHMEM) | ||
56 | |||
57 | /* Flag - indicates that the buffer will be suitable for DMA. Ignored on some | ||
58 | platforms, used as appropriate on others */ | ||
59 | |||
60 | #define GFP_DMA __GFP_DMA | ||
61 | |||
62 | |||
63 | /* | ||
64 | * There is only one page-allocator function, and two main namespaces to | ||
65 | * it. The alloc_page*() variants return 'struct page *' and as such | ||
66 | * can allocate highmem pages, the *get*page*() variants return | ||
67 | * virtual kernel addresses to the allocated page(s). | ||
68 | */ | ||
69 | |||
70 | /* | ||
71 | * We get the zone list from the current node and the gfp_mask. | ||
72 | * This zone list contains a maximum of MAXNODES*MAX_NR_ZONES zones. | ||
73 | * | ||
74 | * For the normal case of non-DISCONTIGMEM systems the NODE_DATA() gets | ||
75 | * optimized to &contig_page_data at compile-time. | ||
76 | */ | ||
77 | |||
78 | #ifndef HAVE_ARCH_FREE_PAGE | ||
79 | static inline void arch_free_page(struct page *page, int order) { } | ||
80 | #endif | ||
81 | |||
82 | extern struct page * | ||
83 | FASTCALL(__alloc_pages(unsigned int, unsigned int, struct zonelist *)); | ||
84 | |||
85 | static inline struct page *alloc_pages_node(int nid, unsigned int __nocast gfp_mask, | ||
86 | unsigned int order) | ||
87 | { | ||
88 | if (unlikely(order >= MAX_ORDER)) | ||
89 | return NULL; | ||
90 | |||
91 | return __alloc_pages(gfp_mask, order, | ||
92 | NODE_DATA(nid)->node_zonelists + (gfp_mask & GFP_ZONEMASK)); | ||
93 | } | ||
94 | |||
95 | #ifdef CONFIG_NUMA | ||
96 | extern struct page *alloc_pages_current(unsigned int __nocast gfp_mask, unsigned order); | ||
97 | |||
98 | static inline struct page * | ||
99 | alloc_pages(unsigned int __nocast gfp_mask, unsigned int order) | ||
100 | { | ||
101 | if (unlikely(order >= MAX_ORDER)) | ||
102 | return NULL; | ||
103 | |||
104 | return alloc_pages_current(gfp_mask, order); | ||
105 | } | ||
106 | extern struct page *alloc_page_vma(unsigned __nocast gfp_mask, | ||
107 | struct vm_area_struct *vma, unsigned long addr); | ||
108 | #else | ||
109 | #define alloc_pages(gfp_mask, order) \ | ||
110 | alloc_pages_node(numa_node_id(), gfp_mask, order) | ||
111 | #define alloc_page_vma(gfp_mask, vma, addr) alloc_pages(gfp_mask, 0) | ||
112 | #endif | ||
113 | #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) | ||
114 | |||
115 | extern unsigned long FASTCALL(__get_free_pages(unsigned int __nocast gfp_mask, unsigned int order)); | ||
116 | extern unsigned long FASTCALL(get_zeroed_page(unsigned int __nocast gfp_mask)); | ||
117 | |||
118 | #define __get_free_page(gfp_mask) \ | ||
119 | __get_free_pages((gfp_mask),0) | ||
120 | |||
121 | #define __get_dma_pages(gfp_mask, order) \ | ||
122 | __get_free_pages((gfp_mask) | GFP_DMA,(order)) | ||
123 | |||
124 | extern void FASTCALL(__free_pages(struct page *page, unsigned int order)); | ||
125 | extern void FASTCALL(free_pages(unsigned long addr, unsigned int order)); | ||
126 | extern void FASTCALL(free_hot_page(struct page *page)); | ||
127 | extern void FASTCALL(free_cold_page(struct page *page)); | ||
128 | |||
129 | #define __free_page(page) __free_pages((page), 0) | ||
130 | #define free_page(addr) free_pages((addr),0) | ||
131 | |||
132 | void page_alloc_init(void); | ||
133 | |||
134 | #endif /* __LINUX_GFP_H */ | ||