Commit | Line | Data |
---|---|---|
2bc64a20 AK |
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 | ||
309381fe | 18 | #include <linux/mmdebug.h> |
2bc64a20 AK |
19 | |
20 | struct hugetlb_cgroup; | |
e9fe92ae | 21 | struct resv_map; |
075a61d0 | 22 | struct file_region; |
e9fe92ae | 23 | |
cd39d4e9 | 24 | #ifdef CONFIG_CGROUP_HUGETLB |
9dd540e2 AK |
25 | /* |
26 | * Minimum page order trackable by hugetlb cgroup. | |
dad6a5eb HD |
27 | * At least 3 pages are necessary for all the tracking information. |
28 | * The second tail page contains all of the hugetlb-specific fields. | |
9dd540e2 | 29 | */ |
dad6a5eb | 30 | #define HUGETLB_CGROUP_MIN_ORDER order_base_2(__NR_USED_SUBPAGE) |
2bc64a20 | 31 | |
e9fe92ae MA |
32 | enum hugetlb_memory_event { |
33 | HUGETLB_MAX, | |
34 | HUGETLB_NR_MEMORY_EVENTS, | |
35 | }; | |
36 | ||
f4776199 MA |
37 | struct hugetlb_cgroup_per_node { |
38 | /* hugetlb usage in pages over all hstates. */ | |
39 | unsigned long usage[HUGE_MAX_HSTATE]; | |
40 | }; | |
41 | ||
e9fe92ae MA |
42 | struct hugetlb_cgroup { |
43 | struct cgroup_subsys_state css; | |
44 | ||
45 | /* | |
46 | * the counter to account for hugepages from hugetlb. | |
47 | */ | |
48 | struct page_counter hugepage[HUGE_MAX_HSTATE]; | |
49 | ||
50 | /* | |
51 | * the counter to account for hugepage reservations from hugetlb. | |
52 | */ | |
53 | struct page_counter rsvd_hugepage[HUGE_MAX_HSTATE]; | |
54 | ||
55 | atomic_long_t events[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS]; | |
56 | atomic_long_t events_local[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS]; | |
57 | ||
58 | /* Handle for "hugetlb.events" */ | |
59 | struct cgroup_file events_file[HUGE_MAX_HSTATE]; | |
60 | ||
61 | /* Handle for "hugetlb.events.local" */ | |
62 | struct cgroup_file events_local_file[HUGE_MAX_HSTATE]; | |
f4776199 MA |
63 | |
64 | struct hugetlb_cgroup_per_node *nodeinfo[]; | |
e9fe92ae | 65 | }; |
9dd540e2 | 66 | |
1adc4d41 | 67 | static inline struct hugetlb_cgroup * |
f074732d | 68 | __hugetlb_cgroup_from_folio(struct folio *folio, bool rsvd) |
9dd540e2 | 69 | { |
f074732d SK |
70 | VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio); |
71 | if (folio_order(folio) < HUGETLB_CGROUP_MIN_ORDER) | |
9dd540e2 | 72 | return NULL; |
dad6a5eb HD |
73 | if (rsvd) |
74 | return folio->_hugetlb_cgroup_rsvd; | |
75 | else | |
76 | return folio->_hugetlb_cgroup; | |
1adc4d41 MA |
77 | } |
78 | ||
f074732d | 79 | static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio) |
1adc4d41 | 80 | { |
f074732d | 81 | return __hugetlb_cgroup_from_folio(folio, false); |
9dd540e2 AK |
82 | } |
83 | ||
1adc4d41 | 84 | static inline struct hugetlb_cgroup * |
f074732d | 85 | hugetlb_cgroup_from_folio_rsvd(struct folio *folio) |
1adc4d41 | 86 | { |
f074732d | 87 | return __hugetlb_cgroup_from_folio(folio, true); |
1adc4d41 MA |
88 | } |
89 | ||
a098c977 | 90 | static inline void __set_hugetlb_cgroup(struct folio *folio, |
1adc4d41 | 91 | struct hugetlb_cgroup *h_cg, bool rsvd) |
9dd540e2 | 92 | { |
a098c977 | 93 | VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio); |
a098c977 | 94 | if (folio_order(folio) < HUGETLB_CGROUP_MIN_ORDER) |
736a8ccc | 95 | return; |
1adc4d41 | 96 | if (rsvd) |
dad6a5eb | 97 | folio->_hugetlb_cgroup_rsvd = h_cg; |
1adc4d41 | 98 | else |
dad6a5eb | 99 | folio->_hugetlb_cgroup = h_cg; |
9dd540e2 AK |
100 | } |
101 | ||
de656ed3 | 102 | static inline void set_hugetlb_cgroup(struct folio *folio, |
1adc4d41 MA |
103 | struct hugetlb_cgroup *h_cg) |
104 | { | |
de656ed3 | 105 | __set_hugetlb_cgroup(folio, h_cg, false); |
1adc4d41 MA |
106 | } |
107 | ||
de656ed3 | 108 | static inline void set_hugetlb_cgroup_rsvd(struct folio *folio, |
1adc4d41 MA |
109 | struct hugetlb_cgroup *h_cg) |
110 | { | |
de656ed3 | 111 | __set_hugetlb_cgroup(folio, h_cg, true); |
1adc4d41 MA |
112 | } |
113 | ||
2bc64a20 AK |
114 | static inline bool hugetlb_cgroup_disabled(void) |
115 | { | |
fc5ed1e9 | 116 | return !cgroup_subsys_enabled(hugetlb_cgrp_subsys); |
2bc64a20 AK |
117 | } |
118 | ||
d85aecf2 ML |
119 | static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg) |
120 | { | |
121 | css_put(&h_cg->css); | |
122 | } | |
123 | ||
09a26e83 MK |
124 | static inline void resv_map_dup_hugetlb_cgroup_uncharge_info( |
125 | struct resv_map *resv_map) | |
126 | { | |
127 | if (resv_map->css) | |
128 | css_get(resv_map->css); | |
129 | } | |
130 | ||
afe041c2 BQM |
131 | static inline void resv_map_put_hugetlb_cgroup_uncharge_info( |
132 | struct resv_map *resv_map) | |
133 | { | |
134 | if (resv_map->css) | |
135 | css_put(resv_map->css); | |
136 | } | |
137 | ||
6d76dcf4 AK |
138 | extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages, |
139 | struct hugetlb_cgroup **ptr); | |
1adc4d41 MA |
140 | extern int hugetlb_cgroup_charge_cgroup_rsvd(int idx, unsigned long nr_pages, |
141 | struct hugetlb_cgroup **ptr); | |
6d76dcf4 AK |
142 | extern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages, |
143 | struct hugetlb_cgroup *h_cg, | |
144 | struct page *page); | |
1adc4d41 MA |
145 | extern void hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages, |
146 | struct hugetlb_cgroup *h_cg, | |
147 | struct page *page); | |
d4ab0316 SK |
148 | extern void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages, |
149 | struct folio *folio); | |
150 | extern void hugetlb_cgroup_uncharge_folio_rsvd(int idx, unsigned long nr_pages, | |
151 | struct folio *folio); | |
1adc4d41 | 152 | |
6d76dcf4 AK |
153 | extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages, |
154 | struct hugetlb_cgroup *h_cg); | |
1adc4d41 MA |
155 | extern void hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages, |
156 | struct hugetlb_cgroup *h_cg); | |
e9fe92ae MA |
157 | extern void hugetlb_cgroup_uncharge_counter(struct resv_map *resv, |
158 | unsigned long start, | |
159 | unsigned long end); | |
1adc4d41 | 160 | |
075a61d0 MA |
161 | extern void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv, |
162 | struct file_region *rg, | |
d85aecf2 ML |
163 | unsigned long nr_pages, |
164 | bool region_del); | |
075a61d0 | 165 | |
7179e7bf | 166 | extern void hugetlb_cgroup_file_init(void) __init; |
29f39430 SK |
167 | extern void hugetlb_cgroup_migrate(struct folio *old_folio, |
168 | struct folio *new_folio); | |
6d76dcf4 | 169 | |
2bc64a20 | 170 | #else |
075a61d0 MA |
171 | static inline void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv, |
172 | struct file_region *rg, | |
d85aecf2 ML |
173 | unsigned long nr_pages, |
174 | bool region_del) | |
075a61d0 MA |
175 | { |
176 | } | |
177 | ||
f074732d | 178 | static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio) |
1adc4d41 MA |
179 | { |
180 | return NULL; | |
181 | } | |
182 | ||
183 | static inline struct hugetlb_cgroup * | |
f074732d | 184 | hugetlb_cgroup_from_folio_rsvd(struct folio *folio) |
1adc4d41 MA |
185 | { |
186 | return NULL; | |
187 | } | |
188 | ||
de656ed3 | 189 | static inline void set_hugetlb_cgroup(struct folio *folio, |
1adc4d41 MA |
190 | struct hugetlb_cgroup *h_cg) |
191 | { | |
1adc4d41 MA |
192 | } |
193 | ||
de656ed3 | 194 | static inline void set_hugetlb_cgroup_rsvd(struct folio *folio, |
1adc4d41 | 195 | struct hugetlb_cgroup *h_cg) |
9dd540e2 | 196 | { |
9dd540e2 AK |
197 | } |
198 | ||
2bc64a20 AK |
199 | static inline bool hugetlb_cgroup_disabled(void) |
200 | { | |
201 | return true; | |
202 | } | |
203 | ||
d85aecf2 ML |
204 | static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg) |
205 | { | |
206 | } | |
207 | ||
09a26e83 MK |
208 | static inline void resv_map_dup_hugetlb_cgroup_uncharge_info( |
209 | struct resv_map *resv_map) | |
210 | { | |
211 | } | |
212 | ||
afe041c2 BQM |
213 | static inline void resv_map_put_hugetlb_cgroup_uncharge_info( |
214 | struct resv_map *resv_map) | |
215 | { | |
216 | } | |
217 | ||
1adc4d41 MA |
218 | static inline int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages, |
219 | struct hugetlb_cgroup **ptr) | |
6d76dcf4 AK |
220 | { |
221 | return 0; | |
222 | } | |
223 | ||
1adc4d41 MA |
224 | static inline int hugetlb_cgroup_charge_cgroup_rsvd(int idx, |
225 | unsigned long nr_pages, | |
226 | struct hugetlb_cgroup **ptr) | |
227 | { | |
228 | return 0; | |
229 | } | |
230 | ||
231 | static inline void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages, | |
232 | struct hugetlb_cgroup *h_cg, | |
233 | struct page *page) | |
6d76dcf4 | 234 | { |
6d76dcf4 AK |
235 | } |
236 | ||
237 | static inline void | |
1adc4d41 MA |
238 | hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages, |
239 | struct hugetlb_cgroup *h_cg, | |
240 | struct page *page) | |
241 | { | |
242 | } | |
243 | ||
d4ab0316 SK |
244 | static inline void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages, |
245 | struct folio *folio) | |
1adc4d41 MA |
246 | { |
247 | } | |
248 | ||
d4ab0316 | 249 | static inline void hugetlb_cgroup_uncharge_folio_rsvd(int idx, |
1adc4d41 | 250 | unsigned long nr_pages, |
d4ab0316 | 251 | struct folio *folio) |
1adc4d41 MA |
252 | { |
253 | } | |
254 | static inline void hugetlb_cgroup_uncharge_cgroup(int idx, | |
255 | unsigned long nr_pages, | |
256 | struct hugetlb_cgroup *h_cg) | |
6d76dcf4 | 257 | { |
6d76dcf4 AK |
258 | } |
259 | ||
260 | static inline void | |
1adc4d41 MA |
261 | hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages, |
262 | struct hugetlb_cgroup *h_cg) | |
6d76dcf4 | 263 | { |
6d76dcf4 AK |
264 | } |
265 | ||
e9fe92ae MA |
266 | static inline void hugetlb_cgroup_uncharge_counter(struct resv_map *resv, |
267 | unsigned long start, | |
268 | unsigned long end) | |
269 | { | |
270 | } | |
271 | ||
7179e7bf | 272 | static inline void hugetlb_cgroup_file_init(void) |
abb8206c | 273 | { |
abb8206c AK |
274 | } |
275 | ||
29f39430 SK |
276 | static inline void hugetlb_cgroup_migrate(struct folio *old_folio, |
277 | struct folio *new_folio) | |
8e6ac7fa | 278 | { |
8e6ac7fa AK |
279 | } |
280 | ||
2bc64a20 AK |
281 | #endif /* CONFIG_MEM_RES_CTLR_HUGETLB */ |
282 | #endif |