Root/
1 | /* memcontrol.h - Memory Controller |
2 | * |
3 | * Copyright IBM Corporation, 2007 |
4 | * Author Balbir Singh <balbir@linux.vnet.ibm.com> |
5 | * |
6 | * Copyright 2007 OpenVZ SWsoft Inc |
7 | * Author: Pavel Emelianov <xemul@openvz.org> |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or |
12 | * (at your option) any later version. |
13 | * |
14 | * This program is distributed in the hope that it will be useful, |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. |
18 | */ |
19 | |
20 | #ifndef _LINUX_MEMCONTROL_H |
21 | #define _LINUX_MEMCONTROL_H |
22 | #include <linux/cgroup.h> |
23 | struct mem_cgroup; |
24 | struct page_cgroup; |
25 | struct page; |
26 | struct mm_struct; |
27 | |
28 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
29 | /* |
30 | * All "charge" functions with gfp_mask should use GFP_KERNEL or |
31 | * (gfp_mask & GFP_RECLAIM_MASK). In current implementatin, memcg doesn't |
32 | * alloc memory but reclaims memory from all available zones. So, "where I want |
33 | * memory from" bits of gfp_mask has no meaning. So any bits of that field is |
34 | * available but adding a rule is better. charge functions' gfp_mask should |
35 | * be set to GFP_KERNEL or gfp_mask & GFP_RECLAIM_MASK for avoiding ambiguous |
36 | * codes. |
37 | * (Of course, if memcg does memory allocation in future, GFP_KERNEL is sane.) |
38 | */ |
39 | |
40 | extern int mem_cgroup_newpage_charge(struct page *page, struct mm_struct *mm, |
41 | gfp_t gfp_mask); |
42 | /* for swap handling */ |
43 | extern int mem_cgroup_try_charge_swapin(struct mm_struct *mm, |
44 | struct page *page, gfp_t mask, struct mem_cgroup **ptr); |
45 | extern void mem_cgroup_commit_charge_swapin(struct page *page, |
46 | struct mem_cgroup *ptr); |
47 | extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr); |
48 | |
49 | extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
50 | gfp_t gfp_mask); |
51 | extern void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru); |
52 | extern void mem_cgroup_del_lru_list(struct page *page, enum lru_list lru); |
53 | extern void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru); |
54 | extern void mem_cgroup_del_lru(struct page *page); |
55 | extern void mem_cgroup_move_lists(struct page *page, |
56 | enum lru_list from, enum lru_list to); |
57 | |
58 | /* For coalescing uncharge for reducing memcg' overhead*/ |
59 | extern void mem_cgroup_uncharge_start(void); |
60 | extern void mem_cgroup_uncharge_end(void); |
61 | |
62 | extern void mem_cgroup_uncharge_page(struct page *page); |
63 | extern void mem_cgroup_uncharge_cache_page(struct page *page); |
64 | extern int mem_cgroup_shmem_charge_fallback(struct page *page, |
65 | struct mm_struct *mm, gfp_t gfp_mask); |
66 | |
67 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, |
68 | struct list_head *dst, |
69 | unsigned long *scanned, int order, |
70 | int mode, struct zone *z, |
71 | struct mem_cgroup *mem_cont, |
72 | int active, int file); |
73 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); |
74 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); |
75 | |
76 | extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page); |
77 | extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); |
78 | |
79 | static inline |
80 | int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup) |
81 | { |
82 | struct mem_cgroup *mem; |
83 | rcu_read_lock(); |
84 | mem = mem_cgroup_from_task(rcu_dereference((mm)->owner)); |
85 | rcu_read_unlock(); |
86 | return cgroup == mem; |
87 | } |
88 | |
89 | extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem); |
90 | |
91 | extern int |
92 | mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr); |
93 | extern void mem_cgroup_end_migration(struct mem_cgroup *mem, |
94 | struct page *oldpage, struct page *newpage); |
95 | |
96 | /* |
97 | * For memory reclaim. |
98 | */ |
99 | extern int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem); |
100 | extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, |
101 | int priority); |
102 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, |
103 | int priority); |
104 | int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg); |
105 | int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg); |
106 | unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, |
107 | struct zone *zone, |
108 | enum lru_list lru); |
109 | struct zone_reclaim_stat *mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg, |
110 | struct zone *zone); |
111 | struct zone_reclaim_stat* |
112 | mem_cgroup_get_reclaim_stat_from_page(struct page *page); |
113 | extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, |
114 | struct task_struct *p); |
115 | |
116 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP |
117 | extern int do_swap_account; |
118 | #endif |
119 | |
120 | static inline bool mem_cgroup_disabled(void) |
121 | { |
122 | if (mem_cgroup_subsys.disabled) |
123 | return true; |
124 | return false; |
125 | } |
126 | |
127 | void mem_cgroup_update_file_mapped(struct page *page, int val); |
128 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, |
129 | gfp_t gfp_mask, int nid, |
130 | int zid); |
131 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
132 | struct mem_cgroup; |
133 | |
134 | static inline int mem_cgroup_newpage_charge(struct page *page, |
135 | struct mm_struct *mm, gfp_t gfp_mask) |
136 | { |
137 | return 0; |
138 | } |
139 | |
140 | static inline int mem_cgroup_cache_charge(struct page *page, |
141 | struct mm_struct *mm, gfp_t gfp_mask) |
142 | { |
143 | return 0; |
144 | } |
145 | |
146 | static inline int mem_cgroup_try_charge_swapin(struct mm_struct *mm, |
147 | struct page *page, gfp_t gfp_mask, struct mem_cgroup **ptr) |
148 | { |
149 | return 0; |
150 | } |
151 | |
152 | static inline void mem_cgroup_commit_charge_swapin(struct page *page, |
153 | struct mem_cgroup *ptr) |
154 | { |
155 | } |
156 | |
157 | static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr) |
158 | { |
159 | } |
160 | |
161 | static inline void mem_cgroup_uncharge_start(void) |
162 | { |
163 | } |
164 | |
165 | static inline void mem_cgroup_uncharge_end(void) |
166 | { |
167 | } |
168 | |
169 | static inline void mem_cgroup_uncharge_page(struct page *page) |
170 | { |
171 | } |
172 | |
173 | static inline void mem_cgroup_uncharge_cache_page(struct page *page) |
174 | { |
175 | } |
176 | |
177 | static inline int mem_cgroup_shmem_charge_fallback(struct page *page, |
178 | struct mm_struct *mm, gfp_t gfp_mask) |
179 | { |
180 | return 0; |
181 | } |
182 | |
183 | static inline void mem_cgroup_add_lru_list(struct page *page, int lru) |
184 | { |
185 | } |
186 | |
187 | static inline void mem_cgroup_del_lru_list(struct page *page, int lru) |
188 | { |
189 | return ; |
190 | } |
191 | |
192 | static inline void mem_cgroup_rotate_lru_list(struct page *page, int lru) |
193 | { |
194 | return ; |
195 | } |
196 | |
197 | static inline void mem_cgroup_del_lru(struct page *page) |
198 | { |
199 | return ; |
200 | } |
201 | |
202 | static inline void |
203 | mem_cgroup_move_lists(struct page *page, enum lru_list from, enum lru_list to) |
204 | { |
205 | } |
206 | |
207 | static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) |
208 | { |
209 | return NULL; |
210 | } |
211 | |
212 | static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) |
213 | { |
214 | return 1; |
215 | } |
216 | |
217 | static inline int task_in_mem_cgroup(struct task_struct *task, |
218 | const struct mem_cgroup *mem) |
219 | { |
220 | return 1; |
221 | } |
222 | |
223 | static inline struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem) |
224 | { |
225 | return NULL; |
226 | } |
227 | |
228 | static inline int |
229 | mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr) |
230 | { |
231 | return 0; |
232 | } |
233 | |
234 | static inline void mem_cgroup_end_migration(struct mem_cgroup *mem, |
235 | struct page *oldpage, |
236 | struct page *newpage) |
237 | { |
238 | } |
239 | |
240 | static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem) |
241 | { |
242 | return 0; |
243 | } |
244 | |
245 | static inline void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, |
246 | int priority) |
247 | { |
248 | } |
249 | |
250 | static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, |
251 | int priority) |
252 | { |
253 | } |
254 | |
255 | static inline bool mem_cgroup_disabled(void) |
256 | { |
257 | return true; |
258 | } |
259 | |
260 | static inline int |
261 | mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg) |
262 | { |
263 | return 1; |
264 | } |
265 | |
266 | static inline int |
267 | mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg) |
268 | { |
269 | return 1; |
270 | } |
271 | |
272 | static inline unsigned long |
273 | mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, struct zone *zone, |
274 | enum lru_list lru) |
275 | { |
276 | return 0; |
277 | } |
278 | |
279 | |
280 | static inline struct zone_reclaim_stat* |
281 | mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg, struct zone *zone) |
282 | { |
283 | return NULL; |
284 | } |
285 | |
286 | static inline struct zone_reclaim_stat* |
287 | mem_cgroup_get_reclaim_stat_from_page(struct page *page) |
288 | { |
289 | return NULL; |
290 | } |
291 | |
292 | static inline void |
293 | mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) |
294 | { |
295 | } |
296 | |
297 | static inline void mem_cgroup_update_file_mapped(struct page *page, |
298 | int val) |
299 | { |
300 | } |
301 | |
302 | static inline |
303 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, |
304 | gfp_t gfp_mask, int nid, int zid) |
305 | { |
306 | return 0; |
307 | } |
308 | |
309 | #endif /* CONFIG_CGROUP_MEM_CONT */ |
310 | |
311 | #endif /* _LINUX_MEMCONTROL_H */ |
312 | |
313 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9