linux/include/linux/memcontrol.h
<<
>>
Prefs
   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
  25struct mem_cgroup;
  26struct page_cgroup;
  27struct page;
  28struct mm_struct;
  29
  30/* Stats that can be updated by kernel. */
  31enum mem_cgroup_page_stat_item {
  32        MEMCG_NR_FILE_MAPPED, /* # of pages charged as file rss */
  33};
  34
  35struct mem_cgroup_reclaim_cookie {
  36        struct zone *zone;
  37        int priority;
  38        unsigned int generation;
  39};
  40
  41#ifdef CONFIG_CGROUP_MEM_RES_CTLR
  42/*
  43 * All "charge" functions with gfp_mask should use GFP_KERNEL or
  44 * (gfp_mask & GFP_RECLAIM_MASK). In current implementatin, memcg doesn't
  45 * alloc memory but reclaims memory from all available zones. So, "where I want
  46 * memory from" bits of gfp_mask has no meaning. So any bits of that field is
  47 * available but adding a rule is better. charge functions' gfp_mask should
  48 * be set to GFP_KERNEL or gfp_mask & GFP_RECLAIM_MASK for avoiding ambiguous
  49 * codes.
  50 * (Of course, if memcg does memory allocation in future, GFP_KERNEL is sane.)
  51 */
  52
  53extern int mem_cgroup_newpage_charge(struct page *page, struct mm_struct *mm,
  54                                gfp_t gfp_mask);
  55/* for swap handling */
  56extern int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
  57                struct page *page, gfp_t mask, struct mem_cgroup **memcgp);
  58extern void mem_cgroup_commit_charge_swapin(struct page *page,
  59                                        struct mem_cgroup *memcg);
  60extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg);
  61
  62extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
  63                                        gfp_t gfp_mask);
  64
  65struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
  66struct lruvec *mem_cgroup_lru_add_list(struct zone *, struct page *,
  67                                       enum lru_list);
  68void mem_cgroup_lru_del_list(struct page *, enum lru_list);
  69void mem_cgroup_lru_del(struct page *);
  70struct lruvec *mem_cgroup_lru_move_lists(struct zone *, struct page *,
  71                                         enum lru_list, enum lru_list);
  72
  73/* For coalescing uncharge for reducing memcg' overhead*/
  74extern void mem_cgroup_uncharge_start(void);
  75extern void mem_cgroup_uncharge_end(void);
  76
  77extern void mem_cgroup_uncharge_page(struct page *page);
  78extern void mem_cgroup_uncharge_cache_page(struct page *page);
  79
  80extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask);
  81int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg);
  82
  83extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
  84extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
  85extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm);
  86
  87extern struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg);
  88extern struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont);
  89
  90static inline
  91int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup)
  92{
  93        struct mem_cgroup *memcg;
  94        rcu_read_lock();
  95        memcg = mem_cgroup_from_task(rcu_dereference((mm)->owner));
  96        rcu_read_unlock();
  97        return cgroup == memcg;
  98}
  99
 100extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);
 101
 102extern int
 103mem_cgroup_prepare_migration(struct page *page,
 104        struct page *newpage, struct mem_cgroup **memcgp, gfp_t gfp_mask);
 105extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,
 106        struct page *oldpage, struct page *newpage, bool migration_ok);
 107
 108struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
 109                                   struct mem_cgroup *,
 110                                   struct mem_cgroup_reclaim_cookie *);
 111void mem_cgroup_iter_break(struct mem_cgroup *, struct mem_cgroup *);
 112
 113/*
 114 * For memory reclaim.
 115 */
 116int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg,
 117                                    struct zone *zone);
 118int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg,
 119                                    struct zone *zone);
 120int mem_cgroup_select_victim_node(struct mem_cgroup *memcg);
 121unsigned long mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg,
 122                                        int nid, int zid, unsigned int lrumask);
 123struct zone_reclaim_stat *mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg,
 124                                                      struct zone *zone);
 125struct zone_reclaim_stat*
 126mem_cgroup_get_reclaim_stat_from_page(struct page *page);
 127extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
 128                                        struct task_struct *p);
 129extern void mem_cgroup_replace_page_cache(struct page *oldpage,
 130                                        struct page *newpage);
 131
 132#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
 133extern int do_swap_account;
 134#endif
 135
 136static inline bool mem_cgroup_disabled(void)
 137{
 138        if (mem_cgroup_subsys.disabled)
 139                return true;
 140        return false;
 141}
 142
 143void mem_cgroup_update_page_stat(struct page *page,
 144                                 enum mem_cgroup_page_stat_item idx,
 145                                 int val);
 146
 147static inline void mem_cgroup_inc_page_stat(struct page *page,
 148                                            enum mem_cgroup_page_stat_item idx)
 149{
 150        mem_cgroup_update_page_stat(page, idx, 1);
 151}
 152
 153static inline void mem_cgroup_dec_page_stat(struct page *page,
 154                                            enum mem_cgroup_page_stat_item idx)
 155{
 156        mem_cgroup_update_page_stat(page, idx, -1);
 157}
 158
 159unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
 160                                                gfp_t gfp_mask,
 161                                                unsigned long *total_scanned);
 162u64 mem_cgroup_get_limit(struct mem_cgroup *memcg);
 163
 164void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
 165#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 166void mem_cgroup_split_huge_fixup(struct page *head);
 167#endif
 168
 169#ifdef CONFIG_DEBUG_VM
 170bool mem_cgroup_bad_page_check(struct page *page);
 171void mem_cgroup_print_bad_page(struct page *page);
 172#endif
 173#else /* CONFIG_CGROUP_MEM_RES_CTLR */
 174struct mem_cgroup;
 175
 176static inline int mem_cgroup_newpage_charge(struct page *page,
 177                                        struct mm_struct *mm, gfp_t gfp_mask)
 178{
 179        return 0;
 180}
 181
 182static inline int mem_cgroup_cache_charge(struct page *page,
 183                                        struct mm_struct *mm, gfp_t gfp_mask)
 184{
 185        return 0;
 186}
 187
 188static inline int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
 189                struct page *page, gfp_t gfp_mask, struct mem_cgroup **memcgp)
 190{
 191        return 0;
 192}
 193
 194static inline void mem_cgroup_commit_charge_swapin(struct page *page,
 195                                          struct mem_cgroup *memcg)
 196{
 197}
 198
 199static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
 200{
 201}
 202
 203static inline void mem_cgroup_uncharge_start(void)
 204{
 205}
 206
 207static inline void mem_cgroup_uncharge_end(void)
 208{
 209}
 210
 211static inline void mem_cgroup_uncharge_page(struct page *page)
 212{
 213}
 214
 215static inline void mem_cgroup_uncharge_cache_page(struct page *page)
 216{
 217}
 218
 219static inline struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone,
 220                                                    struct mem_cgroup *memcg)
 221{
 222        return &zone->lruvec;
 223}
 224
 225static inline struct lruvec *mem_cgroup_lru_add_list(struct zone *zone,
 226                                                     struct page *page,
 227                                                     enum lru_list lru)
 228{
 229        return &zone->lruvec;
 230}
 231
 232static inline void mem_cgroup_lru_del_list(struct page *page, enum lru_list lru)
 233{
 234}
 235
 236static inline void mem_cgroup_lru_del(struct page *page)
 237{
 238}
 239
 240static inline struct lruvec *mem_cgroup_lru_move_lists(struct zone *zone,
 241                                                       struct page *page,
 242                                                       enum lru_list from,
 243                                                       enum lru_list to)
 244{
 245        return &zone->lruvec;
 246}
 247
 248static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
 249{
 250        return NULL;
 251}
 252
 253static inline struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm)
 254{
 255        return NULL;
 256}
 257
 258static inline int mm_match_cgroup(struct mm_struct *mm,
 259                struct mem_cgroup *memcg)
 260{
 261        return 1;
 262}
 263
 264static inline int task_in_mem_cgroup(struct task_struct *task,
 265                                     const struct mem_cgroup *memcg)
 266{
 267        return 1;
 268}
 269
 270static inline struct cgroup_subsys_state
 271                *mem_cgroup_css(struct mem_cgroup *memcg)
 272{
 273        return NULL;
 274}
 275
 276static inline int
 277mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
 278        struct mem_cgroup **memcgp, gfp_t gfp_mask)
 279{
 280        return 0;
 281}
 282
 283static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,
 284                struct page *oldpage, struct page *newpage, bool migration_ok)
 285{
 286}
 287
 288static inline struct mem_cgroup *
 289mem_cgroup_iter(struct mem_cgroup *root,
 290                struct mem_cgroup *prev,
 291                struct mem_cgroup_reclaim_cookie *reclaim)
 292{
 293        return NULL;
 294}
 295
 296static inline void mem_cgroup_iter_break(struct mem_cgroup *root,
 297                                         struct mem_cgroup *prev)
 298{
 299}
 300
 301static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *memcg)
 302{
 303        return 0;
 304}
 305
 306static inline void mem_cgroup_note_reclaim_priority(struct mem_cgroup *memcg,
 307                                                int priority)
 308{
 309}
 310
 311static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *memcg,
 312                                                int priority)
 313{
 314}
 315
 316static inline bool mem_cgroup_disabled(void)
 317{
 318        return true;
 319}
 320
 321static inline int
 322mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone)
 323{
 324        return 1;
 325}
 326
 327static inline int
 328mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg, struct zone *zone)
 329{
 330        return 1;
 331}
 332
 333static inline unsigned long
 334mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, int nid, int zid,
 335                                unsigned int lru_mask)
 336{
 337        return 0;
 338}
 339
 340
 341static inline struct zone_reclaim_stat*
 342mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg, struct zone *zone)
 343{
 344        return NULL;
 345}
 346
 347static inline struct zone_reclaim_stat*
 348mem_cgroup_get_reclaim_stat_from_page(struct page *page)
 349{
 350        return NULL;
 351}
 352
 353static inline void
 354mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
 355{
 356}
 357
 358static inline void mem_cgroup_inc_page_stat(struct page *page,
 359                                            enum mem_cgroup_page_stat_item idx)
 360{
 361}
 362
 363static inline void mem_cgroup_dec_page_stat(struct page *page,
 364                                            enum mem_cgroup_page_stat_item idx)
 365{
 366}
 367
 368static inline
 369unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
 370                                            gfp_t gfp_mask,
 371                                            unsigned long *total_scanned)
 372{
 373        return 0;
 374}
 375
 376static inline
 377u64 mem_cgroup_get_limit(struct mem_cgroup *memcg)
 378{
 379        return 0;
 380}
 381
 382static inline void mem_cgroup_split_huge_fixup(struct page *head)
 383{
 384}
 385
 386static inline
 387void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
 388{
 389}
 390static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
 391                                struct page *newpage)
 392{
 393}
 394#endif /* CONFIG_CGROUP_MEM_CONT */
 395
 396#if !defined(CONFIG_CGROUP_MEM_RES_CTLR) || !defined(CONFIG_DEBUG_VM)
 397static inline bool
 398mem_cgroup_bad_page_check(struct page *page)
 399{
 400        return false;
 401}
 402
 403static inline void
 404mem_cgroup_print_bad_page(struct page *page)
 405{
 406}
 407#endif
 408
 409enum {
 410        UNDER_LIMIT,
 411        SOFT_LIMIT,
 412        OVER_LIMIT,
 413};
 414
 415struct sock;
 416#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
 417void sock_update_memcg(struct sock *sk);
 418void sock_release_memcg(struct sock *sk);
 419#else
 420static inline void sock_update_memcg(struct sock *sk)
 421{
 422}
 423static inline void sock_release_memcg(struct sock *sk)
 424{
 425}
 426#endif /* CONFIG_CGROUP_MEM_RES_CTLR_KMEM */
 427#endif /* _LINUX_MEMCONTROL_H */
 428
 429