Commit | Line | Data |
---|---|---|
52d4b9ac KH |
1 | #ifndef __LINUX_PAGE_CGROUP_H |
2 | #define __LINUX_PAGE_CGROUP_H | |
3 | ||
6b3ae58e JW |
4 | enum { |
5 | /* flags for mem_cgroup */ | |
6 | PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */ | |
6b3ae58e JW |
7 | PCG_USED, /* this object is in use. */ |
8 | PCG_MIGRATION, /* under page migration */ | |
6b3ae58e JW |
9 | __NR_PCG_FLAGS, |
10 | }; | |
11 | ||
12 | #ifndef __GENERATING_BOUNDS_H | |
13 | #include <generated/bounds.h> | |
14 | ||
52d4b9ac KH |
15 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
16 | #include <linux/bit_spinlock.h> | |
6b3ae58e | 17 | |
52d4b9ac KH |
18 | /* |
19 | * Page Cgroup can be considered as an extended mem_map. | |
20 | * A page_cgroup page is associated with every page descriptor. The | |
21 | * page_cgroup helps us identify information about the cgroup | |
22 | * All page cgroups are allocated at boot or memory hotplug event, | |
23 | * then the page cgroup for pfn always exists. | |
24 | */ | |
25 | struct page_cgroup { | |
26 | unsigned long flags; | |
27 | struct mem_cgroup *mem_cgroup; | |
52d4b9ac KH |
28 | }; |
29 | ||
31168481 | 30 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); |
ca371c0d KH |
31 | |
32 | #ifdef CONFIG_SPARSEMEM | |
33 | static inline void __init page_cgroup_init_flatmem(void) | |
34 | { | |
35 | } | |
36 | extern void __init page_cgroup_init(void); | |
37 | #else | |
38 | void __init page_cgroup_init_flatmem(void); | |
39 | static inline void __init page_cgroup_init(void) | |
40 | { | |
41 | } | |
42 | #endif | |
43 | ||
52d4b9ac | 44 | struct page_cgroup *lookup_page_cgroup(struct page *page); |
6b3ae58e | 45 | struct page *lookup_cgroup_page(struct page_cgroup *pc); |
52d4b9ac KH |
46 | |
47 | #define TESTPCGFLAG(uname, lname) \ | |
48 | static inline int PageCgroup##uname(struct page_cgroup *pc) \ | |
49 | { return test_bit(PCG_##lname, &pc->flags); } | |
50 | ||
51 | #define SETPCGFLAG(uname, lname) \ | |
52 | static inline void SetPageCgroup##uname(struct page_cgroup *pc)\ | |
53 | { set_bit(PCG_##lname, &pc->flags); } | |
54 | ||
55 | #define CLEARPCGFLAG(uname, lname) \ | |
56 | static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \ | |
57 | { clear_bit(PCG_##lname, &pc->flags); } | |
58 | ||
4b3bde4c BS |
59 | #define TESTCLEARPCGFLAG(uname, lname) \ |
60 | static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \ | |
61 | { return test_and_clear_bit(PCG_##lname, &pc->flags); } | |
62 | ||
52d4b9ac KH |
63 | TESTPCGFLAG(Used, USED) |
64 | CLEARPCGFLAG(Used, USED) | |
4b3bde4c BS |
65 | SETPCGFLAG(Used, USED) |
66 | ||
ac39cf8c | 67 | SETPCGFLAG(Migration, MIGRATION) |
68 | CLEARPCGFLAG(Migration, MIGRATION) | |
69 | TESTPCGFLAG(Migration, MIGRATION) | |
70 | ||
52d4b9ac KH |
71 | static inline void lock_page_cgroup(struct page_cgroup *pc) |
72 | { | |
dbd4ea78 KH |
73 | /* |
74 | * Don't take this lock in IRQ context. | |
b2402857 | 75 | * This lock is for pc->mem_cgroup, USED, MIGRATION |
dbd4ea78 | 76 | */ |
52d4b9ac KH |
77 | bit_spin_lock(PCG_LOCK, &pc->flags); |
78 | } | |
79 | ||
52d4b9ac KH |
80 | static inline void unlock_page_cgroup(struct page_cgroup *pc) |
81 | { | |
82 | bit_spin_unlock(PCG_LOCK, &pc->flags); | |
83 | } | |
84 | ||
85 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | |
86 | struct page_cgroup; | |
87 | ||
31168481 | 88 | static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
52d4b9ac KH |
89 | { |
90 | } | |
91 | ||
92 | static inline struct page_cgroup *lookup_page_cgroup(struct page *page) | |
93 | { | |
94 | return NULL; | |
95 | } | |
94b6da5a KH |
96 | |
97 | static inline void page_cgroup_init(void) | |
98 | { | |
99 | } | |
100 | ||
ca371c0d KH |
101 | static inline void __init page_cgroup_init_flatmem(void) |
102 | { | |
103 | } | |
104 | ||
6b3ae58e | 105 | #endif /* CONFIG_CGROUP_MEM_RES_CTLR */ |
27a7faa0 | 106 | |
27a7faa0 | 107 | #include <linux/swap.h> |
97572751 JSR |
108 | |
109 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | |
02491447 DN |
110 | extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, |
111 | unsigned short old, unsigned short new); | |
a3b2d692 | 112 | extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id); |
9fb4b7cc | 113 | extern unsigned short lookup_swap_cgroup_id(swp_entry_t ent); |
27a7faa0 KH |
114 | extern int swap_cgroup_swapon(int type, unsigned long max_pages); |
115 | extern void swap_cgroup_swapoff(int type); | |
116 | #else | |
27a7faa0 KH |
117 | |
118 | static inline | |
a3b2d692 | 119 | unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) |
27a7faa0 | 120 | { |
a3b2d692 | 121 | return 0; |
27a7faa0 KH |
122 | } |
123 | ||
124 | static inline | |
9fb4b7cc | 125 | unsigned short lookup_swap_cgroup_id(swp_entry_t ent) |
27a7faa0 | 126 | { |
a3b2d692 | 127 | return 0; |
27a7faa0 KH |
128 | } |
129 | ||
130 | static inline int | |
131 | swap_cgroup_swapon(int type, unsigned long max_pages) | |
132 | { | |
133 | return 0; | |
134 | } | |
135 | ||
136 | static inline void swap_cgroup_swapoff(int type) | |
137 | { | |
138 | return; | |
139 | } | |
140 | ||
6b3ae58e JW |
141 | #endif /* CONFIG_CGROUP_MEM_RES_CTLR_SWAP */ |
142 | ||
143 | #endif /* !__GENERATING_BOUNDS_H */ | |
144 | ||
145 | #endif /* __LINUX_PAGE_CGROUP_H */ |