Merge tag 'soc-fixes-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-block.git] / include / linux / hugetlb_cgroup.h
CommitLineData
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
20struct hugetlb_cgroup;
e9fe92ae 21struct resv_map;
075a61d0 22struct 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
32enum hugetlb_memory_event {
33 HUGETLB_MAX,
34 HUGETLB_NR_MEMORY_EVENTS,
35};
36
f4776199
MA
37struct hugetlb_cgroup_per_node {
38 /* hugetlb usage in pages over all hstates. */
39 unsigned long usage[HUGE_MAX_HSTATE];
40};
41
e9fe92ae
MA
42struct 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 67static 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 79static 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 84static inline struct hugetlb_cgroup *
f074732d 85hugetlb_cgroup_from_folio_rsvd(struct folio *folio)
1adc4d41 86{
f074732d 87 return __hugetlb_cgroup_from_folio(folio, true);
1adc4d41
MA
88}
89
a098c977 90static 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 102static 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 108static 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
114static inline bool hugetlb_cgroup_disabled(void)
115{
fc5ed1e9 116 return !cgroup_subsys_enabled(hugetlb_cgrp_subsys);
2bc64a20
AK
117}
118
d85aecf2
ML
119static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg)
120{
121 css_put(&h_cg->css);
122}
123
09a26e83
MK
124static 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
131static 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
138extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
139 struct hugetlb_cgroup **ptr);
1adc4d41
MA
140extern int hugetlb_cgroup_charge_cgroup_rsvd(int idx, unsigned long nr_pages,
141 struct hugetlb_cgroup **ptr);
6d76dcf4
AK
142extern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
143 struct hugetlb_cgroup *h_cg,
144 struct page *page);
1adc4d41
MA
145extern void hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages,
146 struct hugetlb_cgroup *h_cg,
147 struct page *page);
d4ab0316
SK
148extern void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages,
149 struct folio *folio);
150extern void hugetlb_cgroup_uncharge_folio_rsvd(int idx, unsigned long nr_pages,
151 struct folio *folio);
1adc4d41 152
6d76dcf4
AK
153extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
154 struct hugetlb_cgroup *h_cg);
1adc4d41
MA
155extern void hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
156 struct hugetlb_cgroup *h_cg);
e9fe92ae
MA
157extern void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
158 unsigned long start,
159 unsigned long end);
1adc4d41 160
075a61d0
MA
161extern 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 166extern void hugetlb_cgroup_file_init(void) __init;
29f39430
SK
167extern void hugetlb_cgroup_migrate(struct folio *old_folio,
168 struct folio *new_folio);
6d76dcf4 169
2bc64a20 170#else
075a61d0
MA
171static 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 178static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio)
1adc4d41
MA
179{
180 return NULL;
181}
182
183static inline struct hugetlb_cgroup *
f074732d 184hugetlb_cgroup_from_folio_rsvd(struct folio *folio)
1adc4d41
MA
185{
186 return NULL;
187}
188
de656ed3 189static inline void set_hugetlb_cgroup(struct folio *folio,
1adc4d41
MA
190 struct hugetlb_cgroup *h_cg)
191{
1adc4d41
MA
192}
193
de656ed3 194static inline void set_hugetlb_cgroup_rsvd(struct folio *folio,
1adc4d41 195 struct hugetlb_cgroup *h_cg)
9dd540e2 196{
9dd540e2
AK
197}
198
2bc64a20
AK
199static inline bool hugetlb_cgroup_disabled(void)
200{
201 return true;
202}
203
d85aecf2
ML
204static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg)
205{
206}
207
09a26e83
MK
208static inline void resv_map_dup_hugetlb_cgroup_uncharge_info(
209 struct resv_map *resv_map)
210{
211}
212
afe041c2
BQM
213static inline void resv_map_put_hugetlb_cgroup_uncharge_info(
214 struct resv_map *resv_map)
215{
216}
217
1adc4d41
MA
218static 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
224static 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
231static 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
237static inline void
1adc4d41
MA
238hugetlb_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
244static inline void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages,
245 struct folio *folio)
1adc4d41
MA
246{
247}
248
d4ab0316 249static inline void hugetlb_cgroup_uncharge_folio_rsvd(int idx,
1adc4d41 250 unsigned long nr_pages,
d4ab0316 251 struct folio *folio)
1adc4d41
MA
252{
253}
254static 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
260static inline void
1adc4d41
MA
261hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
262 struct hugetlb_cgroup *h_cg)
6d76dcf4 263{
6d76dcf4
AK
264}
265
e9fe92ae
MA
266static inline void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
267 unsigned long start,
268 unsigned long end)
269{
270}
271
7179e7bf 272static inline void hugetlb_cgroup_file_init(void)
abb8206c 273{
abb8206c
AK
274}
275
29f39430
SK
276static 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