mm: memcontrol: rewrite charge API
[cascardo/linux.git] / include / linux / memcontrol.h
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 #include <linux/vm_event_item.h>
24 #include <linux/hardirq.h>
25 #include <linux/jump_label.h>
26
27 struct mem_cgroup;
28 struct page_cgroup;
29 struct page;
30 struct mm_struct;
31 struct kmem_cache;
32
33 /*
34  * The corresponding mem_cgroup_stat_names is defined in mm/memcontrol.c,
35  * These two lists should keep in accord with each other.
36  */
37 enum mem_cgroup_stat_index {
38         /*
39          * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.
40          */
41         MEM_CGROUP_STAT_CACHE,          /* # of pages charged as cache */
42         MEM_CGROUP_STAT_RSS,            /* # of pages charged as anon rss */
43         MEM_CGROUP_STAT_RSS_HUGE,       /* # of pages charged as anon huge */
44         MEM_CGROUP_STAT_FILE_MAPPED,    /* # of pages charged as file rss */
45         MEM_CGROUP_STAT_WRITEBACK,      /* # of pages under writeback */
46         MEM_CGROUP_STAT_SWAP,           /* # of pages, swapped out */
47         MEM_CGROUP_STAT_NSTATS,
48 };
49
50 struct mem_cgroup_reclaim_cookie {
51         struct zone *zone;
52         int priority;
53         unsigned int generation;
54 };
55
56 #ifdef CONFIG_MEMCG
57 int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
58                           gfp_t gfp_mask, struct mem_cgroup **memcgp);
59 void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg,
60                               bool lrucare);
61 void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg);
62
63 struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
64 struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *);
65
66 /* For coalescing uncharge for reducing memcg' overhead*/
67 extern void mem_cgroup_uncharge_start(void);
68 extern void mem_cgroup_uncharge_end(void);
69
70 extern void mem_cgroup_uncharge_page(struct page *page);
71 extern void mem_cgroup_uncharge_cache_page(struct page *page);
72
73 bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg,
74                                   struct mem_cgroup *memcg);
75 bool task_in_mem_cgroup(struct task_struct *task,
76                         const struct mem_cgroup *memcg);
77
78 extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
79 extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
80
81 extern struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg);
82 extern struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *css);
83
84 static inline
85 bool mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *memcg)
86 {
87         struct mem_cgroup *task_memcg;
88         bool match;
89
90         rcu_read_lock();
91         task_memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
92         match = __mem_cgroup_same_or_subtree(memcg, task_memcg);
93         rcu_read_unlock();
94         return match;
95 }
96
97 extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);
98
99 extern void
100 mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
101                              struct mem_cgroup **memcgp);
102 extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,
103         struct page *oldpage, struct page *newpage, bool migration_ok);
104
105 struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
106                                    struct mem_cgroup *,
107                                    struct mem_cgroup_reclaim_cookie *);
108 void mem_cgroup_iter_break(struct mem_cgroup *, struct mem_cgroup *);
109
110 /*
111  * For memory reclaim.
112  */
113 int mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec);
114 int mem_cgroup_select_victim_node(struct mem_cgroup *memcg);
115 unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list);
116 void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int);
117 extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
118                                         struct task_struct *p);
119 extern void mem_cgroup_replace_page_cache(struct page *oldpage,
120                                         struct page *newpage);
121
122 static inline void mem_cgroup_oom_enable(void)
123 {
124         WARN_ON(current->memcg_oom.may_oom);
125         current->memcg_oom.may_oom = 1;
126 }
127
128 static inline void mem_cgroup_oom_disable(void)
129 {
130         WARN_ON(!current->memcg_oom.may_oom);
131         current->memcg_oom.may_oom = 0;
132 }
133
134 static inline bool task_in_memcg_oom(struct task_struct *p)
135 {
136         return p->memcg_oom.memcg;
137 }
138
139 bool mem_cgroup_oom_synchronize(bool wait);
140
141 #ifdef CONFIG_MEMCG_SWAP
142 extern int do_swap_account;
143 #endif
144
145 static inline bool mem_cgroup_disabled(void)
146 {
147         if (memory_cgrp_subsys.disabled)
148                 return true;
149         return false;
150 }
151
152 void __mem_cgroup_begin_update_page_stat(struct page *page, bool *locked,
153                                          unsigned long *flags);
154
155 extern atomic_t memcg_moving;
156
157 static inline void mem_cgroup_begin_update_page_stat(struct page *page,
158                                         bool *locked, unsigned long *flags)
159 {
160         if (mem_cgroup_disabled())
161                 return;
162         rcu_read_lock();
163         *locked = false;
164         if (atomic_read(&memcg_moving))
165                 __mem_cgroup_begin_update_page_stat(page, locked, flags);
166 }
167
168 void __mem_cgroup_end_update_page_stat(struct page *page,
169                                 unsigned long *flags);
170 static inline void mem_cgroup_end_update_page_stat(struct page *page,
171                                         bool *locked, unsigned long *flags)
172 {
173         if (mem_cgroup_disabled())
174                 return;
175         if (*locked)
176                 __mem_cgroup_end_update_page_stat(page, flags);
177         rcu_read_unlock();
178 }
179
180 void mem_cgroup_update_page_stat(struct page *page,
181                                  enum mem_cgroup_stat_index idx,
182                                  int val);
183
184 static inline void mem_cgroup_inc_page_stat(struct page *page,
185                                             enum mem_cgroup_stat_index idx)
186 {
187         mem_cgroup_update_page_stat(page, idx, 1);
188 }
189
190 static inline void mem_cgroup_dec_page_stat(struct page *page,
191                                             enum mem_cgroup_stat_index idx)
192 {
193         mem_cgroup_update_page_stat(page, idx, -1);
194 }
195
196 unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
197                                                 gfp_t gfp_mask,
198                                                 unsigned long *total_scanned);
199
200 void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
201 static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
202                                              enum vm_event_item idx)
203 {
204         if (mem_cgroup_disabled())
205                 return;
206         __mem_cgroup_count_vm_event(mm, idx);
207 }
208 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
209 void mem_cgroup_split_huge_fixup(struct page *head);
210 #endif
211
212 #ifdef CONFIG_DEBUG_VM
213 bool mem_cgroup_bad_page_check(struct page *page);
214 void mem_cgroup_print_bad_page(struct page *page);
215 #endif
216 #else /* CONFIG_MEMCG */
217 struct mem_cgroup;
218
219 static inline int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
220                                         gfp_t gfp_mask,
221                                         struct mem_cgroup **memcgp)
222 {
223         *memcgp = NULL;
224         return 0;
225 }
226
227 static inline void mem_cgroup_commit_charge(struct page *page,
228                                             struct mem_cgroup *memcg,
229                                             bool lrucare)
230 {
231 }
232
233 static inline void mem_cgroup_cancel_charge(struct page *page,
234                                             struct mem_cgroup *memcg)
235 {
236 }
237
238 static inline void mem_cgroup_uncharge_start(void)
239 {
240 }
241
242 static inline void mem_cgroup_uncharge_end(void)
243 {
244 }
245
246 static inline void mem_cgroup_uncharge_page(struct page *page)
247 {
248 }
249
250 static inline void mem_cgroup_uncharge_cache_page(struct page *page)
251 {
252 }
253
254 static inline struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone,
255                                                     struct mem_cgroup *memcg)
256 {
257         return &zone->lruvec;
258 }
259
260 static inline struct lruvec *mem_cgroup_page_lruvec(struct page *page,
261                                                     struct zone *zone)
262 {
263         return &zone->lruvec;
264 }
265
266 static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
267 {
268         return NULL;
269 }
270
271 static inline bool mm_match_cgroup(struct mm_struct *mm,
272                 struct mem_cgroup *memcg)
273 {
274         return true;
275 }
276
277 static inline bool task_in_mem_cgroup(struct task_struct *task,
278                                       const struct mem_cgroup *memcg)
279 {
280         return true;
281 }
282
283 static inline struct cgroup_subsys_state
284                 *mem_cgroup_css(struct mem_cgroup *memcg)
285 {
286         return NULL;
287 }
288
289 static inline void
290 mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
291                              struct mem_cgroup **memcgp)
292 {
293 }
294
295 static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,
296                 struct page *oldpage, struct page *newpage, bool migration_ok)
297 {
298 }
299
300 static inline struct mem_cgroup *
301 mem_cgroup_iter(struct mem_cgroup *root,
302                 struct mem_cgroup *prev,
303                 struct mem_cgroup_reclaim_cookie *reclaim)
304 {
305         return NULL;
306 }
307
308 static inline void mem_cgroup_iter_break(struct mem_cgroup *root,
309                                          struct mem_cgroup *prev)
310 {
311 }
312
313 static inline bool mem_cgroup_disabled(void)
314 {
315         return true;
316 }
317
318 static inline int
319 mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec)
320 {
321         return 1;
322 }
323
324 static inline unsigned long
325 mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list lru)
326 {
327         return 0;
328 }
329
330 static inline void
331 mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
332                               int increment)
333 {
334 }
335
336 static inline void
337 mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
338 {
339 }
340
341 static inline void mem_cgroup_begin_update_page_stat(struct page *page,
342                                         bool *locked, unsigned long *flags)
343 {
344 }
345
346 static inline void mem_cgroup_end_update_page_stat(struct page *page,
347                                         bool *locked, unsigned long *flags)
348 {
349 }
350
351 static inline void mem_cgroup_oom_enable(void)
352 {
353 }
354
355 static inline void mem_cgroup_oom_disable(void)
356 {
357 }
358
359 static inline bool task_in_memcg_oom(struct task_struct *p)
360 {
361         return false;
362 }
363
364 static inline bool mem_cgroup_oom_synchronize(bool wait)
365 {
366         return false;
367 }
368
369 static inline void mem_cgroup_inc_page_stat(struct page *page,
370                                             enum mem_cgroup_stat_index idx)
371 {
372 }
373
374 static inline void mem_cgroup_dec_page_stat(struct page *page,
375                                             enum mem_cgroup_stat_index idx)
376 {
377 }
378
379 static inline
380 unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
381                                             gfp_t gfp_mask,
382                                             unsigned long *total_scanned)
383 {
384         return 0;
385 }
386
387 static inline void mem_cgroup_split_huge_fixup(struct page *head)
388 {
389 }
390
391 static inline
392 void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
393 {
394 }
395 static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
396                                 struct page *newpage)
397 {
398 }
399 #endif /* CONFIG_MEMCG */
400
401 #if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM)
402 static inline bool
403 mem_cgroup_bad_page_check(struct page *page)
404 {
405         return false;
406 }
407
408 static inline void
409 mem_cgroup_print_bad_page(struct page *page)
410 {
411 }
412 #endif
413
414 enum {
415         UNDER_LIMIT,
416         SOFT_LIMIT,
417         OVER_LIMIT,
418 };
419
420 struct sock;
421 #if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM)
422 void sock_update_memcg(struct sock *sk);
423 void sock_release_memcg(struct sock *sk);
424 #else
425 static inline void sock_update_memcg(struct sock *sk)
426 {
427 }
428 static inline void sock_release_memcg(struct sock *sk)
429 {
430 }
431 #endif /* CONFIG_INET && CONFIG_MEMCG_KMEM */
432
433 #ifdef CONFIG_MEMCG_KMEM
434 extern struct static_key memcg_kmem_enabled_key;
435
436 extern int memcg_limited_groups_array_size;
437
438 /*
439  * Helper macro to loop through all memcg-specific caches. Callers must still
440  * check if the cache is valid (it is either valid or NULL).
441  * the slab_mutex must be held when looping through those caches
442  */
443 #define for_each_memcg_cache_index(_idx)        \
444         for ((_idx) = 0; (_idx) < memcg_limited_groups_array_size; (_idx)++)
445
446 static inline bool memcg_kmem_enabled(void)
447 {
448         return static_key_false(&memcg_kmem_enabled_key);
449 }
450
451 /*
452  * In general, we'll do everything in our power to not incur in any overhead
453  * for non-memcg users for the kmem functions. Not even a function call, if we
454  * can avoid it.
455  *
456  * Therefore, we'll inline all those functions so that in the best case, we'll
457  * see that kmemcg is off for everybody and proceed quickly.  If it is on,
458  * we'll still do most of the flag checking inline. We check a lot of
459  * conditions, but because they are pretty simple, they are expected to be
460  * fast.
461  */
462 bool __memcg_kmem_newpage_charge(gfp_t gfp, struct mem_cgroup **memcg,
463                                         int order);
464 void __memcg_kmem_commit_charge(struct page *page,
465                                        struct mem_cgroup *memcg, int order);
466 void __memcg_kmem_uncharge_pages(struct page *page, int order);
467
468 int memcg_cache_id(struct mem_cgroup *memcg);
469
470 int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s,
471                              struct kmem_cache *root_cache);
472 void memcg_free_cache_params(struct kmem_cache *s);
473
474 int memcg_update_cache_size(struct kmem_cache *s, int num_groups);
475 void memcg_update_array_size(int num_groups);
476
477 struct kmem_cache *
478 __memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp);
479
480 int __memcg_charge_slab(struct kmem_cache *cachep, gfp_t gfp, int order);
481 void __memcg_uncharge_slab(struct kmem_cache *cachep, int order);
482
483 int __memcg_cleanup_cache_params(struct kmem_cache *s);
484
485 /**
486  * memcg_kmem_newpage_charge: verify if a new kmem allocation is allowed.
487  * @gfp: the gfp allocation flags.
488  * @memcg: a pointer to the memcg this was charged against.
489  * @order: allocation order.
490  *
491  * returns true if the memcg where the current task belongs can hold this
492  * allocation.
493  *
494  * We return true automatically if this allocation is not to be accounted to
495  * any memcg.
496  */
497 static inline bool
498 memcg_kmem_newpage_charge(gfp_t gfp, struct mem_cgroup **memcg, int order)
499 {
500         if (!memcg_kmem_enabled())
501                 return true;
502
503         /*
504          * __GFP_NOFAIL allocations will move on even if charging is not
505          * possible. Therefore we don't even try, and have this allocation
506          * unaccounted. We could in theory charge it with
507          * res_counter_charge_nofail, but we hope those allocations are rare,
508          * and won't be worth the trouble.
509          */
510         if (gfp & __GFP_NOFAIL)
511                 return true;
512         if (in_interrupt() || (!current->mm) || (current->flags & PF_KTHREAD))
513                 return true;
514
515         /* If the test is dying, just let it go. */
516         if (unlikely(fatal_signal_pending(current)))
517                 return true;
518
519         return __memcg_kmem_newpage_charge(gfp, memcg, order);
520 }
521
522 /**
523  * memcg_kmem_uncharge_pages: uncharge pages from memcg
524  * @page: pointer to struct page being freed
525  * @order: allocation order.
526  *
527  * there is no need to specify memcg here, since it is embedded in page_cgroup
528  */
529 static inline void
530 memcg_kmem_uncharge_pages(struct page *page, int order)
531 {
532         if (memcg_kmem_enabled())
533                 __memcg_kmem_uncharge_pages(page, order);
534 }
535
536 /**
537  * memcg_kmem_commit_charge: embeds correct memcg in a page
538  * @page: pointer to struct page recently allocated
539  * @memcg: the memcg structure we charged against
540  * @order: allocation order.
541  *
542  * Needs to be called after memcg_kmem_newpage_charge, regardless of success or
543  * failure of the allocation. if @page is NULL, this function will revert the
544  * charges. Otherwise, it will commit the memcg given by @memcg to the
545  * corresponding page_cgroup.
546  */
547 static inline void
548 memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order)
549 {
550         if (memcg_kmem_enabled() && memcg)
551                 __memcg_kmem_commit_charge(page, memcg, order);
552 }
553
554 /**
555  * memcg_kmem_get_cache: selects the correct per-memcg cache for allocation
556  * @cachep: the original global kmem cache
557  * @gfp: allocation flags.
558  *
559  * All memory allocated from a per-memcg cache is charged to the owner memcg.
560  */
561 static __always_inline struct kmem_cache *
562 memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
563 {
564         if (!memcg_kmem_enabled())
565                 return cachep;
566         if (gfp & __GFP_NOFAIL)
567                 return cachep;
568         if (in_interrupt() || (!current->mm) || (current->flags & PF_KTHREAD))
569                 return cachep;
570         if (unlikely(fatal_signal_pending(current)))
571                 return cachep;
572
573         return __memcg_kmem_get_cache(cachep, gfp);
574 }
575 #else
576 #define for_each_memcg_cache_index(_idx)        \
577         for (; NULL; )
578
579 static inline bool memcg_kmem_enabled(void)
580 {
581         return false;
582 }
583
584 static inline bool
585 memcg_kmem_newpage_charge(gfp_t gfp, struct mem_cgroup **memcg, int order)
586 {
587         return true;
588 }
589
590 static inline void memcg_kmem_uncharge_pages(struct page *page, int order)
591 {
592 }
593
594 static inline void
595 memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order)
596 {
597 }
598
599 static inline int memcg_cache_id(struct mem_cgroup *memcg)
600 {
601         return -1;
602 }
603
604 static inline int memcg_alloc_cache_params(struct mem_cgroup *memcg,
605                 struct kmem_cache *s, struct kmem_cache *root_cache)
606 {
607         return 0;
608 }
609
610 static inline void memcg_free_cache_params(struct kmem_cache *s)
611 {
612 }
613
614 static inline struct kmem_cache *
615 memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
616 {
617         return cachep;
618 }
619 #endif /* CONFIG_MEMCG_KMEM */
620 #endif /* _LINUX_MEMCONTROL_H */
621