blob: 5c831f1eca798d06e35c02c32e29353cc511d74e [file] [log] [blame]
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -07001#ifndef __LINUX_PAGE_CGROUP_H
2#define __LINUX_PAGE_CGROUP_H
3
Johannes Weiner6b3ae582011-03-23 16:42:30 -07004enum {
5 /* flags for mem_cgroup */
Johannes Weiner0a31bc92014-08-08 14:19:22 -07006 PCG_USED = 0x01, /* This page is charged to a memcg */
7 PCG_MEM = 0x02, /* This page holds a memory charge */
8 PCG_MEMSW = 0x04, /* This page holds a memory+swap charge */
Johannes Weiner6b3ae582011-03-23 16:42:30 -07009};
10
Vladimir Davydov434584f2014-08-08 14:19:26 -070011struct pglist_data;
12
Andrew Mortonc255a452012-07-31 16:43:02 -070013#ifdef CONFIG_MEMCG
Vladimir Davydov434584f2014-08-08 14:19:26 -070014struct mem_cgroup;
Johannes Weiner6b3ae582011-03-23 16:42:30 -070015
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070016/*
17 * Page Cgroup can be considered as an extended mem_map.
18 * A page_cgroup page is associated with every page descriptor. The
19 * page_cgroup helps us identify information about the cgroup
20 * All page cgroups are allocated at boot or memory hotplug event,
21 * then the page cgroup for pfn always exists.
22 */
23struct page_cgroup {
24 unsigned long flags;
25 struct mem_cgroup *mem_cgroup;
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070026};
27
Vladimir Davydov434584f2014-08-08 14:19:26 -070028extern void pgdat_page_cgroup_init(struct pglist_data *pgdat);
KAMEZAWA Hiroyukica371c02009-06-12 10:33:53 +030029
30#ifdef CONFIG_SPARSEMEM
Vladimir Davydov434584f2014-08-08 14:19:26 -070031static inline void page_cgroup_init_flatmem(void)
KAMEZAWA Hiroyukica371c02009-06-12 10:33:53 +030032{
33}
Vladimir Davydov434584f2014-08-08 14:19:26 -070034extern void page_cgroup_init(void);
KAMEZAWA Hiroyukica371c02009-06-12 10:33:53 +030035#else
Vladimir Davydov434584f2014-08-08 14:19:26 -070036extern void page_cgroup_init_flatmem(void);
37static inline void page_cgroup_init(void)
KAMEZAWA Hiroyukica371c02009-06-12 10:33:53 +030038{
39}
40#endif
41
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070042struct page_cgroup *lookup_page_cgroup(struct page *page);
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070043
Johannes Weiner0a31bc92014-08-08 14:19:22 -070044static inline int PageCgroupUsed(struct page_cgroup *pc)
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070045{
Johannes Weiner0a31bc92014-08-08 14:19:22 -070046 return !!(pc->flags & PCG_USED);
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070047}
Vladimir Davydov434584f2014-08-08 14:19:26 -070048#else /* !CONFIG_MEMCG */
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070049struct page_cgroup;
50
Vladimir Davydov434584f2014-08-08 14:19:26 -070051static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat)
KAMEZAWA Hiroyuki52d4b9a2008-10-18 20:28:16 -070052{
53}
54
55static inline struct page_cgroup *lookup_page_cgroup(struct page *page)
56{
57 return NULL;
58}
KAMEZAWA Hiroyuki94b6da52008-10-22 14:15:05 -070059
60static inline void page_cgroup_init(void)
61{
62}
63
Vladimir Davydov434584f2014-08-08 14:19:26 -070064static inline void page_cgroup_init_flatmem(void)
KAMEZAWA Hiroyukica371c02009-06-12 10:33:53 +030065{
66}
Andrew Mortonc255a452012-07-31 16:43:02 -070067#endif /* CONFIG_MEMCG */
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080068
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080069#include <linux/swap.h>
Jaswinder Singh Rajput97572752009-09-20 16:20:44 +053070
Andrew Mortonc255a452012-07-31 16:43:02 -070071#ifdef CONFIG_MEMCG_SWAP
Daisuke Nishimura02491442010-03-10 15:22:17 -080072extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent,
73 unsigned short old, unsigned short new);
KAMEZAWA Hiroyukia3b2d692009-04-02 16:57:45 -070074extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id);
Bob Liu9fb4b7c2012-01-12 17:18:48 -080075extern unsigned short lookup_swap_cgroup_id(swp_entry_t ent);
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080076extern int swap_cgroup_swapon(int type, unsigned long max_pages);
77extern void swap_cgroup_swapoff(int type);
78#else
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080079
80static inline
KAMEZAWA Hiroyukia3b2d692009-04-02 16:57:45 -070081unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id)
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080082{
KAMEZAWA Hiroyukia3b2d692009-04-02 16:57:45 -070083 return 0;
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080084}
85
86static inline
Bob Liu9fb4b7c2012-01-12 17:18:48 -080087unsigned short lookup_swap_cgroup_id(swp_entry_t ent)
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080088{
KAMEZAWA Hiroyukia3b2d692009-04-02 16:57:45 -070089 return 0;
KAMEZAWA Hiroyuki27a7faa2009-01-07 18:07:58 -080090}
91
92static inline int
93swap_cgroup_swapon(int type, unsigned long max_pages)
94{
95 return 0;
96}
97
98static inline void swap_cgroup_swapoff(int type)
99{
100 return;
101}
102
Andrew Mortonc255a452012-07-31 16:43:02 -0700103#endif /* CONFIG_MEMCG_SWAP */
Johannes Weiner6b3ae582011-03-23 16:42:30 -0700104
Johannes Weiner6b3ae582011-03-23 16:42:30 -0700105#endif /* __LINUX_PAGE_CGROUP_H */