linux/include/linux/hugetlb_cgroup.h
<<
>>
Prefs
   1/*
   2 * Copyright IBM Corporation, 2012
   3 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2.1 of the GNU Lesser General Public License
   7 * as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful, but
  10 * WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12 *
  13 */
  14
  15#ifndef _LINUX_HUGETLB_CGROUP_H
  16#define _LINUX_HUGETLB_CGROUP_H
  17
  18#include <linux/mmdebug.h>
  19
  20struct hugetlb_cgroup;
  21/*
  22 * Minimum page order trackable by hugetlb cgroup.
  23 * At least 3 pages are necessary for all the tracking information.
  24 */
  25#define HUGETLB_CGROUP_MIN_ORDER        2
  26
  27#ifdef CONFIG_CGROUP_HUGETLB
  28
  29static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
  30{
  31        VM_BUG_ON_PAGE(!PageHuge(page), page);
  32
  33        if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
  34                return NULL;
  35        return (struct hugetlb_cgroup *)page[2].lru.next;
  36}
  37
  38static inline
  39int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
  40{
  41        VM_BUG_ON_PAGE(!PageHuge(page), page);
  42
  43        if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
  44                return -1;
  45        page[2].lru.next = (void *)h_cg;
  46        return 0;
  47}
  48
  49static inline bool hugetlb_cgroup_disabled(void)
  50{
  51        if (hugetlb_subsys.disabled)
  52                return true;
  53        return false;
  54}
  55
  56extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
  57                                        struct hugetlb_cgroup **ptr);
  58extern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
  59                                         struct hugetlb_cgroup *h_cg,
  60                                         struct page *page);
  61extern void hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages,
  62                                         struct page *page);
  63extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
  64                                           struct hugetlb_cgroup *h_cg);
  65extern void hugetlb_cgroup_file_init(void) __init;
  66extern void hugetlb_cgroup_migrate(struct page *oldhpage,
  67                                   struct page *newhpage);
  68
  69#else
  70static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
  71{
  72        return NULL;
  73}
  74
  75static inline
  76int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
  77{
  78        return 0;
  79}
  80
  81static inline bool hugetlb_cgroup_disabled(void)
  82{
  83        return true;
  84}
  85
  86static inline int
  87hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
  88                             struct hugetlb_cgroup **ptr)
  89{
  90        return 0;
  91}
  92
  93static inline void
  94hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
  95                             struct hugetlb_cgroup *h_cg,
  96                             struct page *page)
  97{
  98        return;
  99}
 100
 101static inline void
 102hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages, struct page *page)
 103{
 104        return;
 105}
 106
 107static inline void
 108hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
 109                               struct hugetlb_cgroup *h_cg)
 110{
 111        return;
 112}
 113
 114static inline void hugetlb_cgroup_file_init(void)
 115{
 116}
 117
 118static inline void hugetlb_cgroup_migrate(struct page *oldhpage,
 119                                          struct page *newhpage)
 120{
 121        return;
 122}
 123
 124#endif  /* CONFIG_MEM_RES_CTLR_HUGETLB */
 125#endif
 126