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#include <linux/hardirq.h>
  25#include <linux/jump_label.h>
  26#include <linux/page_counter.h>
  27#include <linux/vmpressure.h>
  28#include <linux/eventfd.h>
  29#include <linux/mmzone.h>
  30#include <linux/writeback.h>
  31#include <linux/page-flags.h>
  32
  33struct mem_cgroup;
  34struct page;
  35struct mm_struct;
  36struct kmem_cache;
  37
  38/*
  39 * The corresponding mem_cgroup_stat_names is defined in mm/memcontrol.c,
  40 * These two lists should keep in accord with each other.
  41 */
  42enum mem_cgroup_stat_index {
  43        /*
  44         * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.
  45         */
  46        MEM_CGROUP_STAT_CACHE,          /* # of pages charged as cache */
  47        MEM_CGROUP_STAT_RSS,            /* # of pages charged as anon rss */
  48        MEM_CGROUP_STAT_RSS_HUGE,       /* # of pages charged as anon huge */
  49        MEM_CGROUP_STAT_FILE_MAPPED,    /* # of pages charged as file rss */
  50        MEM_CGROUP_STAT_DIRTY,          /* # of dirty pages in page cache */
  51        MEM_CGROUP_STAT_WRITEBACK,      /* # of pages under writeback */
  52        MEM_CGROUP_STAT_SWAP,           /* # of pages, swapped out */
  53        MEM_CGROUP_STAT_NSTATS,
  54        /* default hierarchy stats */
  55        MEMCG_KERNEL_STACK = MEM_CGROUP_STAT_NSTATS,
  56        MEMCG_SLAB_RECLAIMABLE,
  57        MEMCG_SLAB_UNRECLAIMABLE,
  58        MEMCG_SOCK,
  59        MEMCG_NR_STAT,
  60};
  61
  62struct mem_cgroup_reclaim_cookie {
  63        struct zone *zone;
  64        int priority;
  65        unsigned int generation;
  66};
  67
  68enum mem_cgroup_events_index {
  69        MEM_CGROUP_EVENTS_PGPGIN,       /* # of pages paged in */
  70        MEM_CGROUP_EVENTS_PGPGOUT,      /* # of pages paged out */
  71        MEM_CGROUP_EVENTS_PGFAULT,      /* # of page-faults */
  72        MEM_CGROUP_EVENTS_PGMAJFAULT,   /* # of major page-faults */
  73        MEM_CGROUP_EVENTS_NSTATS,
  74        /* default hierarchy events */
  75        MEMCG_LOW = MEM_CGROUP_EVENTS_NSTATS,
  76        MEMCG_HIGH,
  77        MEMCG_MAX,
  78        MEMCG_OOM,
  79        MEMCG_NR_EVENTS,
  80};
  81
  82/*
  83 * Per memcg event counter is incremented at every pagein/pageout. With THP,
  84 * it will be incremated by the number of pages. This counter is used for
  85 * for trigger some periodic events. This is straightforward and better
  86 * than using jiffies etc. to handle periodic memcg event.
  87 */
  88enum mem_cgroup_events_target {
  89        MEM_CGROUP_TARGET_THRESH,
  90        MEM_CGROUP_TARGET_SOFTLIMIT,
  91        MEM_CGROUP_TARGET_NUMAINFO,
  92        MEM_CGROUP_NTARGETS,
  93};
  94
  95#ifdef CONFIG_MEMCG
  96
  97#define MEM_CGROUP_ID_SHIFT     16
  98#define MEM_CGROUP_ID_MAX       USHRT_MAX
  99
 100struct mem_cgroup_stat_cpu {
 101        long count[MEMCG_NR_STAT];
 102        unsigned long events[MEMCG_NR_EVENTS];
 103        unsigned long nr_page_events;
 104        unsigned long targets[MEM_CGROUP_NTARGETS];
 105};
 106
 107struct mem_cgroup_reclaim_iter {
 108        struct mem_cgroup *position;
 109        /* scan generation, increased every round-trip */
 110        unsigned int generation;
 111};
 112
 113/*
 114 * per-zone information in memory controller.
 115 */
 116struct mem_cgroup_per_zone {
 117        struct lruvec           lruvec;
 118        unsigned long           lru_size[NR_LRU_LISTS];
 119
 120        struct mem_cgroup_reclaim_iter  iter[DEF_PRIORITY + 1];
 121
 122        struct rb_node          tree_node;      /* RB tree node */
 123        unsigned long           usage_in_excess;/* Set to the value by which */
 124                                                /* the soft limit is exceeded*/
 125        bool                    on_tree;
 126        struct mem_cgroup       *memcg;         /* Back pointer, we cannot */
 127                                                /* use container_of        */
 128};
 129
 130struct mem_cgroup_per_node {
 131        struct mem_cgroup_per_zone zoneinfo[MAX_NR_ZONES];
 132};
 133
 134struct mem_cgroup_threshold {
 135        struct eventfd_ctx *eventfd;
 136        unsigned long threshold;
 137};
 138
 139/* For threshold */
 140struct mem_cgroup_threshold_ary {
 141        /* An array index points to threshold just below or equal to usage. */
 142        int current_threshold;
 143        /* Size of entries[] */
 144        unsigned int size;
 145        /* Array of thresholds */
 146        struct mem_cgroup_threshold entries[0];
 147};
 148
 149struct mem_cgroup_thresholds {
 150        /* Primary thresholds array */
 151        struct mem_cgroup_threshold_ary *primary;
 152        /*
 153         * Spare threshold array.
 154         * This is needed to make mem_cgroup_unregister_event() "never fail".
 155         * It must be able to store at least primary->size - 1 entries.
 156         */
 157        struct mem_cgroup_threshold_ary *spare;
 158};
 159
 160enum memcg_kmem_state {
 161        KMEM_NONE,
 162        KMEM_ALLOCATED,
 163        KMEM_ONLINE,
 164};
 165
 166/*
 167 * The memory controller data structure. The memory controller controls both
 168 * page cache and RSS per cgroup. We would eventually like to provide
 169 * statistics based on the statistics developed by Rik Van Riel for clock-pro,
 170 * to help the administrator determine what knobs to tune.
 171 */
 172struct mem_cgroup {
 173        struct cgroup_subsys_state css;
 174
 175        /* Accounted resources */
 176        struct page_counter memory;
 177        struct page_counter swap;
 178
 179        /* Legacy consumer-oriented counters */
 180        struct page_counter memsw;
 181        struct page_counter kmem;
 182        struct page_counter tcpmem;
 183
 184        /* Normal memory consumption range */
 185        unsigned long low;
 186        unsigned long high;
 187
 188        /* Range enforcement for interrupt charges */
 189        struct work_struct high_work;
 190
 191        unsigned long soft_limit;
 192
 193        /* vmpressure notifications */
 194        struct vmpressure vmpressure;
 195
 196        /*
 197         * Should the accounting and control be hierarchical, per subtree?
 198         */
 199        bool use_hierarchy;
 200
 201        /* protected by memcg_oom_lock */
 202        bool            oom_lock;
 203        int             under_oom;
 204
 205        int     swappiness;
 206        /* OOM-Killer disable */
 207        int             oom_kill_disable;
 208
 209        /* handle for "memory.events" */
 210        struct cgroup_file events_file;
 211
 212        /* protect arrays of thresholds */
 213        struct mutex thresholds_lock;
 214
 215        /* thresholds for memory usage. RCU-protected */
 216        struct mem_cgroup_thresholds thresholds;
 217
 218        /* thresholds for mem+swap usage. RCU-protected */
 219        struct mem_cgroup_thresholds memsw_thresholds;
 220
 221        /* For oom notifier event fd */
 222        struct list_head oom_notify;
 223
 224        /*
 225         * Should we move charges of a task when a task is moved into this
 226         * mem_cgroup ? And what type of charges should we move ?
 227         */
 228        unsigned long move_charge_at_immigrate;
 229        /*
 230         * set > 0 if pages under this cgroup are moving to other cgroup.
 231         */
 232        atomic_t                moving_account;
 233        /* taken only while moving_account > 0 */
 234        spinlock_t              move_lock;
 235        struct task_struct      *move_lock_task;
 236        unsigned long           move_lock_flags;
 237        /*
 238         * percpu counter.
 239         */
 240        struct mem_cgroup_stat_cpu __percpu *stat;
 241
 242        unsigned long           socket_pressure;
 243
 244        /* Legacy tcp memory accounting */
 245        bool                    tcpmem_active;
 246        int                     tcpmem_pressure;
 247
 248#ifndef CONFIG_SLOB
 249        /* Index in the kmem_cache->memcg_params.memcg_caches array */
 250        int kmemcg_id;
 251        enum memcg_kmem_state kmem_state;
 252#endif
 253
 254        int last_scanned_node;
 255#if MAX_NUMNODES > 1
 256        nodemask_t      scan_nodes;
 257        atomic_t        numainfo_events;
 258        atomic_t        numainfo_updating;
 259#endif
 260
 261#ifdef CONFIG_CGROUP_WRITEBACK
 262        struct list_head cgwb_list;
 263        struct wb_domain cgwb_domain;
 264#endif
 265
 266        /* List of events which userspace want to receive */
 267        struct list_head event_list;
 268        spinlock_t event_list_lock;
 269
 270        struct mem_cgroup_per_node *nodeinfo[0];
 271        /* WARNING: nodeinfo must be the last member here */
 272};
 273
 274extern struct mem_cgroup *root_mem_cgroup;
 275
 276static inline bool mem_cgroup_disabled(void)
 277{
 278        return !cgroup_subsys_enabled(memory_cgrp_subsys);
 279}
 280
 281/**
 282 * mem_cgroup_events - count memory events against a cgroup
 283 * @memcg: the memory cgroup
 284 * @idx: the event index
 285 * @nr: the number of events to account for
 286 */
 287static inline void mem_cgroup_events(struct mem_cgroup *memcg,
 288                       enum mem_cgroup_events_index idx,
 289                       unsigned int nr)
 290{
 291        this_cpu_add(memcg->stat->events[idx], nr);
 292        cgroup_file_notify(&memcg->events_file);
 293}
 294
 295bool mem_cgroup_low(struct mem_cgroup *root, struct mem_cgroup *memcg);
 296
 297int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
 298                          gfp_t gfp_mask, struct mem_cgroup **memcgp,
 299                          bool compound);
 300void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg,
 301                              bool lrucare, bool compound);
 302void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg,
 303                bool compound);
 304void mem_cgroup_uncharge(struct page *page);
 305void mem_cgroup_uncharge_list(struct list_head *page_list);
 306
 307void mem_cgroup_migrate(struct page *oldpage, struct page *newpage);
 308
 309struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
 310struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *);
 311
 312bool task_in_mem_cgroup(struct task_struct *task, struct mem_cgroup *memcg);
 313struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
 314
 315static inline
 316struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *css){
 317        return css ? container_of(css, struct mem_cgroup, css) : NULL;
 318}
 319
 320#define mem_cgroup_from_counter(counter, member)        \
 321        container_of(counter, struct mem_cgroup, member)
 322
 323struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
 324                                   struct mem_cgroup *,
 325                                   struct mem_cgroup_reclaim_cookie *);
 326void mem_cgroup_iter_break(struct mem_cgroup *, struct mem_cgroup *);
 327
 328static inline unsigned short mem_cgroup_id(struct mem_cgroup *memcg)
 329{
 330        if (mem_cgroup_disabled())
 331                return 0;
 332
 333        return memcg->css.id;
 334}
 335
 336/**
 337 * mem_cgroup_from_id - look up a memcg from an id
 338 * @id: the id to look up
 339 *
 340 * Caller must hold rcu_read_lock() and use css_tryget() as necessary.
 341 */
 342static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
 343{
 344        struct cgroup_subsys_state *css;
 345
 346        css = css_from_id(id, &memory_cgrp_subsys);
 347        return mem_cgroup_from_css(css);
 348}
 349
 350/**
 351 * parent_mem_cgroup - find the accounting parent of a memcg
 352 * @memcg: memcg whose parent to find
 353 *
 354 * Returns the parent memcg, or NULL if this is the root or the memory
 355 * controller is in legacy no-hierarchy mode.
 356 */
 357static inline struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg)
 358{
 359        if (!memcg->memory.parent)
 360                return NULL;
 361        return mem_cgroup_from_counter(memcg->memory.parent, memory);
 362}
 363
 364static inline bool mem_cgroup_is_descendant(struct mem_cgroup *memcg,
 365                              struct mem_cgroup *root)
 366{
 367        if (root == memcg)
 368                return true;
 369        if (!root->use_hierarchy)
 370                return false;
 371        return cgroup_is_descendant(memcg->css.cgroup, root->css.cgroup);
 372}
 373
 374static inline bool mm_match_cgroup(struct mm_struct *mm,
 375                                   struct mem_cgroup *memcg)
 376{
 377        struct mem_cgroup *task_memcg;
 378        bool match = false;
 379
 380        rcu_read_lock();
 381        task_memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 382        if (task_memcg)
 383                match = mem_cgroup_is_descendant(task_memcg, memcg);
 384        rcu_read_unlock();
 385        return match;
 386}
 387
 388struct cgroup_subsys_state *mem_cgroup_css_from_page(struct page *page);
 389ino_t page_cgroup_ino(struct page *page);
 390
 391static inline bool mem_cgroup_online(struct mem_cgroup *memcg)
 392{
 393        if (mem_cgroup_disabled())
 394                return true;
 395        return !!(memcg->css.flags & CSS_ONLINE);
 396}
 397
 398/*
 399 * For memory reclaim.
 400 */
 401int mem_cgroup_select_victim_node(struct mem_cgroup *memcg);
 402
 403void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
 404                int nr_pages);
 405
 406unsigned long mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,
 407                                           int nid, unsigned int lru_mask);
 408
 409static inline
 410unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list lru)
 411{
 412        struct mem_cgroup_per_zone *mz;
 413
 414        mz = container_of(lruvec, struct mem_cgroup_per_zone, lruvec);
 415        return mz->lru_size[lru];
 416}
 417
 418static inline bool mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec)
 419{
 420        unsigned long inactive_ratio;
 421        unsigned long inactive;
 422        unsigned long active;
 423        unsigned long gb;
 424
 425        inactive = mem_cgroup_get_lru_size(lruvec, LRU_INACTIVE_ANON);
 426        active = mem_cgroup_get_lru_size(lruvec, LRU_ACTIVE_ANON);
 427
 428        gb = (inactive + active) >> (30 - PAGE_SHIFT);
 429        if (gb)
 430                inactive_ratio = int_sqrt(10 * gb);
 431        else
 432                inactive_ratio = 1;
 433
 434        return inactive * inactive_ratio < active;
 435}
 436
 437void mem_cgroup_handle_over_high(void);
 438
 439void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
 440                                struct task_struct *p);
 441
 442static inline void mem_cgroup_oom_enable(void)
 443{
 444        WARN_ON(current->memcg_may_oom);
 445        current->memcg_may_oom = 1;
 446}
 447
 448static inline void mem_cgroup_oom_disable(void)
 449{
 450        WARN_ON(!current->memcg_may_oom);
 451        current->memcg_may_oom = 0;
 452}
 453
 454static inline bool task_in_memcg_oom(struct task_struct *p)
 455{
 456        return p->memcg_in_oom;
 457}
 458
 459bool mem_cgroup_oom_synchronize(bool wait);
 460
 461#ifdef CONFIG_MEMCG_SWAP
 462extern int do_swap_account;
 463#endif
 464
 465void lock_page_memcg(struct page *page);
 466void unlock_page_memcg(struct page *page);
 467
 468/**
 469 * mem_cgroup_update_page_stat - update page state statistics
 470 * @page: the page
 471 * @idx: page state item to account
 472 * @val: number of pages (positive or negative)
 473 *
 474 * The @page must be locked or the caller must use lock_page_memcg()
 475 * to prevent double accounting when the page is concurrently being
 476 * moved to another memcg:
 477 *
 478 *   lock_page(page) or lock_page_memcg(page)
 479 *   if (TestClearPageState(page))
 480 *     mem_cgroup_update_page_stat(page, state, -1);
 481 *   unlock_page(page) or unlock_page_memcg(page)
 482 */
 483static inline void mem_cgroup_update_page_stat(struct page *page,
 484                                 enum mem_cgroup_stat_index idx, int val)
 485{
 486        VM_BUG_ON(!(rcu_read_lock_held() || PageLocked(page)));
 487
 488        if (page->mem_cgroup)
 489                this_cpu_add(page->mem_cgroup->stat->count[idx], val);
 490}
 491
 492static inline void mem_cgroup_inc_page_stat(struct page *page,
 493                                            enum mem_cgroup_stat_index idx)
 494{
 495        mem_cgroup_update_page_stat(page, idx, 1);
 496}
 497
 498static inline void mem_cgroup_dec_page_stat(struct page *page,
 499                                            enum mem_cgroup_stat_index idx)
 500{
 501        mem_cgroup_update_page_stat(page, idx, -1);
 502}
 503
 504unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
 505                                                gfp_t gfp_mask,
 506                                                unsigned long *total_scanned);
 507
 508static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
 509                                             enum vm_event_item idx)
 510{
 511        struct mem_cgroup *memcg;
 512
 513        if (mem_cgroup_disabled())
 514                return;
 515
 516        rcu_read_lock();
 517        memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
 518        if (unlikely(!memcg))
 519                goto out;
 520
 521        switch (idx) {
 522        case PGFAULT:
 523                this_cpu_inc(memcg->stat->events[MEM_CGROUP_EVENTS_PGFAULT]);
 524                break;
 525        case PGMAJFAULT:
 526                this_cpu_inc(memcg->stat->events[MEM_CGROUP_EVENTS_PGMAJFAULT]);
 527                break;
 528        default:
 529                BUG();
 530        }
 531out:
 532        rcu_read_unlock();
 533}
 534#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 535void mem_cgroup_split_huge_fixup(struct page *head);
 536#endif
 537
 538#else /* CONFIG_MEMCG */
 539
 540#define MEM_CGROUP_ID_SHIFT     0
 541#define MEM_CGROUP_ID_MAX       0
 542
 543struct mem_cgroup;
 544
 545static inline bool mem_cgroup_disabled(void)
 546{
 547        return true;
 548}
 549
 550static inline void mem_cgroup_events(struct mem_cgroup *memcg,
 551                                     enum mem_cgroup_events_index idx,
 552                                     unsigned int nr)
 553{
 554}
 555
 556static inline bool mem_cgroup_low(struct mem_cgroup *root,
 557                                  struct mem_cgroup *memcg)
 558{
 559        return false;
 560}
 561
 562static inline int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
 563                                        gfp_t gfp_mask,
 564                                        struct mem_cgroup **memcgp,
 565                                        bool compound)
 566{
 567        *memcgp = NULL;
 568        return 0;
 569}
 570
 571static inline void mem_cgroup_commit_charge(struct page *page,
 572                                            struct mem_cgroup *memcg,
 573                                            bool lrucare, bool compound)
 574{
 575}
 576
 577static inline void mem_cgroup_cancel_charge(struct page *page,
 578                                            struct mem_cgroup *memcg,
 579                                            bool compound)
 580{
 581}
 582
 583static inline void mem_cgroup_uncharge(struct page *page)
 584{
 585}
 586
 587static inline void mem_cgroup_uncharge_list(struct list_head *page_list)
 588{
 589}
 590
 591static inline void mem_cgroup_migrate(struct page *old, struct page *new)
 592{
 593}
 594
 595static inline struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone,
 596                                                    struct mem_cgroup *memcg)
 597{
 598        return &zone->lruvec;
 599}
 600
 601static inline struct lruvec *mem_cgroup_page_lruvec(struct page *page,
 602                                                    struct zone *zone)
 603{
 604        return &zone->lruvec;
 605}
 606
 607static inline bool mm_match_cgroup(struct mm_struct *mm,
 608                struct mem_cgroup *memcg)
 609{
 610        return true;
 611}
 612
 613static inline bool task_in_mem_cgroup(struct task_struct *task,
 614                                      const struct mem_cgroup *memcg)
 615{
 616        return true;
 617}
 618
 619static inline struct mem_cgroup *
 620mem_cgroup_iter(struct mem_cgroup *root,
 621                struct mem_cgroup *prev,
 622                struct mem_cgroup_reclaim_cookie *reclaim)
 623{
 624        return NULL;
 625}
 626
 627static inline void mem_cgroup_iter_break(struct mem_cgroup *root,
 628                                         struct mem_cgroup *prev)
 629{
 630}
 631
 632static inline unsigned short mem_cgroup_id(struct mem_cgroup *memcg)
 633{
 634        return 0;
 635}
 636
 637static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
 638{
 639        WARN_ON_ONCE(id);
 640        /* XXX: This should always return root_mem_cgroup */
 641        return NULL;
 642}
 643
 644static inline bool mem_cgroup_online(struct mem_cgroup *memcg)
 645{
 646        return true;
 647}
 648
 649static inline bool
 650mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec)
 651{
 652        return true;
 653}
 654
 655static inline unsigned long
 656mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list lru)
 657{
 658        return 0;
 659}
 660
 661static inline void
 662mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
 663                              int increment)
 664{
 665}
 666
 667static inline unsigned long
 668mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,
 669                             int nid, unsigned int lru_mask)
 670{
 671        return 0;
 672}
 673
 674static inline void
 675mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
 676{
 677}
 678
 679static inline void lock_page_memcg(struct page *page)
 680{
 681}
 682
 683static inline void unlock_page_memcg(struct page *page)
 684{
 685}
 686
 687static inline void mem_cgroup_handle_over_high(void)
 688{
 689}
 690
 691static inline void mem_cgroup_oom_enable(void)
 692{
 693}
 694
 695static inline void mem_cgroup_oom_disable(void)
 696{
 697}
 698
 699static inline bool task_in_memcg_oom(struct task_struct *p)
 700{
 701        return false;
 702}
 703
 704static inline bool mem_cgroup_oom_synchronize(bool wait)
 705{
 706        return false;
 707}
 708
 709static inline void mem_cgroup_inc_page_stat(struct page *page,
 710                                            enum mem_cgroup_stat_index idx)
 711{
 712}
 713
 714static inline void mem_cgroup_dec_page_stat(struct page *page,
 715                                            enum mem_cgroup_stat_index idx)
 716{
 717}
 718
 719static inline
 720unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
 721                                            gfp_t gfp_mask,
 722                                            unsigned long *total_scanned)
 723{
 724        return 0;
 725}
 726
 727static inline void mem_cgroup_split_huge_fixup(struct page *head)
 728{
 729}
 730
 731static inline
 732void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
 733{
 734}
 735#endif /* CONFIG_MEMCG */
 736
 737#ifdef CONFIG_CGROUP_WRITEBACK
 738
 739struct list_head *mem_cgroup_cgwb_list(struct mem_cgroup *memcg);
 740struct wb_domain *mem_cgroup_wb_domain(struct bdi_writeback *wb);
 741void mem_cgroup_wb_stats(struct bdi_writeback *wb, unsigned long *pfilepages,
 742                         unsigned long *pheadroom, unsigned long *pdirty,
 743                         unsigned long *pwriteback);
 744
 745#else   /* CONFIG_CGROUP_WRITEBACK */
 746
 747static inline struct wb_domain *mem_cgroup_wb_domain(struct bdi_writeback *wb)
 748{
 749        return NULL;
 750}
 751
 752static inline void mem_cgroup_wb_stats(struct bdi_writeback *wb,
 753                                       unsigned long *pfilepages,
 754                                       unsigned long *pheadroom,
 755                                       unsigned long *pdirty,
 756                                       unsigned long *pwriteback)
 757{
 758}
 759
 760#endif  /* CONFIG_CGROUP_WRITEBACK */
 761
 762struct sock;
 763void sock_update_memcg(struct sock *sk);
 764void sock_release_memcg(struct sock *sk);
 765bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages);
 766void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages);
 767#ifdef CONFIG_MEMCG
 768extern struct static_key_false memcg_sockets_enabled_key;
 769#define mem_cgroup_sockets_enabled static_branch_unlikely(&memcg_sockets_enabled_key)
 770static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
 771{
 772        if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && memcg->tcpmem_pressure)
 773                return true;
 774        do {
 775                if (time_before(jiffies, memcg->socket_pressure))
 776                        return true;
 777        } while ((memcg = parent_mem_cgroup(memcg)));
 778        return false;
 779}
 780#else
 781#define mem_cgroup_sockets_enabled 0
 782static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
 783{
 784        return false;
 785}
 786#endif
 787
 788#if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
 789extern struct static_key_false memcg_kmem_enabled_key;
 790
 791extern int memcg_nr_cache_ids;
 792void memcg_get_cache_ids(void);
 793void memcg_put_cache_ids(void);
 794
 795/*
 796 * Helper macro to loop through all memcg-specific caches. Callers must still
 797 * check if the cache is valid (it is either valid or NULL).
 798 * the slab_mutex must be held when looping through those caches
 799 */
 800#define for_each_memcg_cache_index(_idx)        \
 801        for ((_idx) = 0; (_idx) < memcg_nr_cache_ids; (_idx)++)
 802
 803static inline bool memcg_kmem_enabled(void)
 804{
 805        return static_branch_unlikely(&memcg_kmem_enabled_key);
 806}
 807
 808/*
 809 * In general, we'll do everything in our power to not incur in any overhead
 810 * for non-memcg users for the kmem functions. Not even a function call, if we
 811 * can avoid it.
 812 *
 813 * Therefore, we'll inline all those functions so that in the best case, we'll
 814 * see that kmemcg is off for everybody and proceed quickly.  If it is on,
 815 * we'll still do most of the flag checking inline. We check a lot of
 816 * conditions, but because they are pretty simple, they are expected to be
 817 * fast.
 818 */
 819int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order,
 820                              struct mem_cgroup *memcg);
 821int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order);
 822void __memcg_kmem_uncharge(struct page *page, int order);
 823
 824/*
 825 * helper for accessing a memcg's index. It will be used as an index in the
 826 * child cache array in kmem_cache, and also to derive its name. This function
 827 * will return -1 when this is not a kmem-limited memcg.
 828 */
 829static inline int memcg_cache_id(struct mem_cgroup *memcg)
 830{
 831        return memcg ? memcg->kmemcg_id : -1;
 832}
 833
 834struct kmem_cache *__memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp);
 835void __memcg_kmem_put_cache(struct kmem_cache *cachep);
 836
 837static inline bool __memcg_kmem_bypass(void)
 838{
 839        if (!memcg_kmem_enabled())
 840                return true;
 841        if (in_interrupt() || (!current->mm) || (current->flags & PF_KTHREAD))
 842                return true;
 843        return false;
 844}
 845
 846/**
 847 * memcg_kmem_charge: charge a kmem page
 848 * @page: page to charge
 849 * @gfp: reclaim mode
 850 * @order: allocation order
 851 *
 852 * Returns 0 on success, an error code on failure.
 853 */
 854static __always_inline int memcg_kmem_charge(struct page *page,
 855                                             gfp_t gfp, int order)
 856{
 857        if (__memcg_kmem_bypass())
 858                return 0;
 859        if (!(gfp & __GFP_ACCOUNT))
 860                return 0;
 861        return __memcg_kmem_charge(page, gfp, order);
 862}
 863
 864/**
 865 * memcg_kmem_uncharge: uncharge a kmem page
 866 * @page: page to uncharge
 867 * @order: allocation order
 868 */
 869static __always_inline void memcg_kmem_uncharge(struct page *page, int order)
 870{
 871        if (memcg_kmem_enabled())
 872                __memcg_kmem_uncharge(page, order);
 873}
 874
 875/**
 876 * memcg_kmem_get_cache: selects the correct per-memcg cache for allocation
 877 * @cachep: the original global kmem cache
 878 *
 879 * All memory allocated from a per-memcg cache is charged to the owner memcg.
 880 */
 881static __always_inline struct kmem_cache *
 882memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
 883{
 884        if (__memcg_kmem_bypass())
 885                return cachep;
 886        return __memcg_kmem_get_cache(cachep, gfp);
 887}
 888
 889static __always_inline void memcg_kmem_put_cache(struct kmem_cache *cachep)
 890{
 891        if (memcg_kmem_enabled())
 892                __memcg_kmem_put_cache(cachep);
 893}
 894
 895/**
 896 * memcg_kmem_update_page_stat - update kmem page state statistics
 897 * @page: the page
 898 * @idx: page state item to account
 899 * @val: number of pages (positive or negative)
 900 */
 901static inline void memcg_kmem_update_page_stat(struct page *page,
 902                                enum mem_cgroup_stat_index idx, int val)
 903{
 904        if (memcg_kmem_enabled() && page->mem_cgroup)
 905                this_cpu_add(page->mem_cgroup->stat->count[idx], val);
 906}
 907
 908#else
 909#define for_each_memcg_cache_index(_idx)        \
 910        for (; NULL; )
 911
 912static inline bool memcg_kmem_enabled(void)
 913{
 914        return false;
 915}
 916
 917static inline int memcg_kmem_charge(struct page *page, gfp_t gfp, int order)
 918{
 919        return 0;
 920}
 921
 922static inline void memcg_kmem_uncharge(struct page *page, int order)
 923{
 924}
 925
 926static inline int memcg_cache_id(struct mem_cgroup *memcg)
 927{
 928        return -1;
 929}
 930
 931static inline void memcg_get_cache_ids(void)
 932{
 933}
 934
 935static inline void memcg_put_cache_ids(void)
 936{
 937}
 938
 939static inline struct kmem_cache *
 940memcg_kmem_get_cache(struct kmem_cache *cachep, gfp_t gfp)
 941{
 942        return cachep;
 943}
 944
 945static inline void memcg_kmem_put_cache(struct kmem_cache *cachep)
 946{
 947}
 948
 949static inline void memcg_kmem_update_page_stat(struct page *page,
 950                                enum mem_cgroup_stat_index idx, int val)
 951{
 952}
 953#endif /* CONFIG_MEMCG && !CONFIG_SLOB */
 954
 955#endif /* _LINUX_MEMCONTROL_H */
 956