12bc64a20SAneesh Kumar K.V /*
22bc64a20SAneesh Kumar K.V  * Copyright IBM Corporation, 2012
32bc64a20SAneesh Kumar K.V  * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
42bc64a20SAneesh Kumar K.V  *
52bc64a20SAneesh Kumar K.V  * This program is free software; you can redistribute it and/or modify it
62bc64a20SAneesh Kumar K.V  * under the terms of version 2.1 of the GNU Lesser General Public License
72bc64a20SAneesh Kumar K.V  * as published by the Free Software Foundation.
82bc64a20SAneesh Kumar K.V  *
92bc64a20SAneesh Kumar K.V  * This program is distributed in the hope that it would be useful, but
102bc64a20SAneesh Kumar K.V  * WITHOUT ANY WARRANTY; without even the implied warranty of
112bc64a20SAneesh Kumar K.V  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
122bc64a20SAneesh Kumar K.V  *
132bc64a20SAneesh Kumar K.V  */
142bc64a20SAneesh Kumar K.V 
152bc64a20SAneesh Kumar K.V #ifndef _LINUX_HUGETLB_CGROUP_H
162bc64a20SAneesh Kumar K.V #define _LINUX_HUGETLB_CGROUP_H
172bc64a20SAneesh Kumar K.V 
18309381feSSasha Levin #include <linux/mmdebug.h>
192bc64a20SAneesh Kumar K.V 
202bc64a20SAneesh Kumar K.V struct hugetlb_cgroup;
21e9fe92aeSMina Almasry struct resv_map;
22075a61d0SMina Almasry struct file_region;
23e9fe92aeSMina Almasry 
24cd39d4e9SMuchun Song #ifdef CONFIG_CGROUP_HUGETLB
259dd540e2SAneesh Kumar K.V /*
269dd540e2SAneesh Kumar K.V  * Minimum page order trackable by hugetlb cgroup.
27dad6a5ebSHugh Dickins  * At least 3 pages are necessary for all the tracking information.
28dad6a5ebSHugh Dickins  * The second tail page contains all of the hugetlb-specific fields.
299dd540e2SAneesh Kumar K.V  */
30dad6a5ebSHugh Dickins #define HUGETLB_CGROUP_MIN_ORDER order_base_2(__NR_USED_SUBPAGE)
312bc64a20SAneesh Kumar K.V 
32e9fe92aeSMina Almasry enum hugetlb_memory_event {
33e9fe92aeSMina Almasry 	HUGETLB_MAX,
34e9fe92aeSMina Almasry 	HUGETLB_NR_MEMORY_EVENTS,
35e9fe92aeSMina Almasry };
36e9fe92aeSMina Almasry 
37f4776199SMina Almasry struct hugetlb_cgroup_per_node {
38f4776199SMina Almasry 	/* hugetlb usage in pages over all hstates. */
39f4776199SMina Almasry 	unsigned long usage[HUGE_MAX_HSTATE];
40f4776199SMina Almasry };
41f4776199SMina Almasry 
42e9fe92aeSMina Almasry struct hugetlb_cgroup {
43e9fe92aeSMina Almasry 	struct cgroup_subsys_state css;
44e9fe92aeSMina Almasry 
45e9fe92aeSMina Almasry 	/*
46e9fe92aeSMina Almasry 	 * the counter to account for hugepages from hugetlb.
47e9fe92aeSMina Almasry 	 */
48e9fe92aeSMina Almasry 	struct page_counter hugepage[HUGE_MAX_HSTATE];
49e9fe92aeSMina Almasry 
50e9fe92aeSMina Almasry 	/*
51e9fe92aeSMina Almasry 	 * the counter to account for hugepage reservations from hugetlb.
52e9fe92aeSMina Almasry 	 */
53e9fe92aeSMina Almasry 	struct page_counter rsvd_hugepage[HUGE_MAX_HSTATE];
54e9fe92aeSMina Almasry 
55e9fe92aeSMina Almasry 	atomic_long_t events[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
56e9fe92aeSMina Almasry 	atomic_long_t events_local[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
57e9fe92aeSMina Almasry 
58e9fe92aeSMina Almasry 	/* Handle for "hugetlb.events" */
59e9fe92aeSMina Almasry 	struct cgroup_file events_file[HUGE_MAX_HSTATE];
60e9fe92aeSMina Almasry 
61e9fe92aeSMina Almasry 	/* Handle for "hugetlb.events.local" */
62e9fe92aeSMina Almasry 	struct cgroup_file events_local_file[HUGE_MAX_HSTATE];
63f4776199SMina Almasry 
64f4776199SMina Almasry 	struct hugetlb_cgroup_per_node *nodeinfo[];
65e9fe92aeSMina Almasry };
669dd540e2SAneesh Kumar K.V 
671adc4d41SMina Almasry static inline struct hugetlb_cgroup *
__hugetlb_cgroup_from_folio(struct folio * folio,bool rsvd)68f074732dSSidhartha Kumar __hugetlb_cgroup_from_folio(struct folio *folio, bool rsvd)
699dd540e2SAneesh Kumar K.V {
70f074732dSSidhartha Kumar 	VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio);
71f074732dSSidhartha Kumar 	if (folio_order(folio) < HUGETLB_CGROUP_MIN_ORDER)
729dd540e2SAneesh Kumar K.V 		return NULL;
73dad6a5ebSHugh Dickins 	if (rsvd)
74dad6a5ebSHugh Dickins 		return folio->_hugetlb_cgroup_rsvd;
75dad6a5ebSHugh Dickins 	else
76dad6a5ebSHugh Dickins 		return folio->_hugetlb_cgroup;
77f074732dSSidhartha Kumar }
78f074732dSSidhartha Kumar 
hugetlb_cgroup_from_folio(struct folio * folio)79f074732dSSidhartha Kumar static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio)
801adc4d41SMina Almasry {
81f074732dSSidhartha Kumar 	return __hugetlb_cgroup_from_folio(folio, false);
821adc4d41SMina Almasry }
831adc4d41SMina Almasry 
841adc4d41SMina Almasry static inline struct hugetlb_cgroup *
hugetlb_cgroup_from_folio_rsvd(struct folio * folio)85f074732dSSidhartha Kumar hugetlb_cgroup_from_folio_rsvd(struct folio *folio)
861adc4d41SMina Almasry {
87f074732dSSidhartha Kumar 	return __hugetlb_cgroup_from_folio(folio, true);
881adc4d41SMina Almasry }
891adc4d41SMina Almasry 
__set_hugetlb_cgroup(struct folio * folio,struct hugetlb_cgroup * h_cg,bool rsvd)90a098c977SSidhartha Kumar static inline void __set_hugetlb_cgroup(struct folio *folio,
911adc4d41SMina Almasry 				       struct hugetlb_cgroup *h_cg, bool rsvd)
929dd540e2SAneesh Kumar K.V {
93a098c977SSidhartha Kumar 	VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio);
94a098c977SSidhartha Kumar 	if (folio_order(folio) < HUGETLB_CGROUP_MIN_ORDER)
95736a8cccSMiaohe Lin 		return;
961adc4d41SMina Almasry 	if (rsvd)
97dad6a5ebSHugh Dickins 		folio->_hugetlb_cgroup_rsvd = h_cg;
981adc4d41SMina Almasry 	else
99dad6a5ebSHugh Dickins 		folio->_hugetlb_cgroup = h_cg;
1009dd540e2SAneesh Kumar K.V }
1019dd540e2SAneesh Kumar K.V 
set_hugetlb_cgroup(struct folio * folio,struct hugetlb_cgroup * h_cg)102de656ed3SSidhartha Kumar static inline void set_hugetlb_cgroup(struct folio *folio,
1031adc4d41SMina Almasry 				     struct hugetlb_cgroup *h_cg)
1041adc4d41SMina Almasry {
105de656ed3SSidhartha Kumar 	__set_hugetlb_cgroup(folio, h_cg, false);
1061adc4d41SMina Almasry }
1071adc4d41SMina Almasry 
set_hugetlb_cgroup_rsvd(struct folio * folio,struct hugetlb_cgroup * h_cg)108de656ed3SSidhartha Kumar static inline void set_hugetlb_cgroup_rsvd(struct folio *folio,
1091adc4d41SMina Almasry 					  struct hugetlb_cgroup *h_cg)
1101adc4d41SMina Almasry {
111de656ed3SSidhartha Kumar 	__set_hugetlb_cgroup(folio, h_cg, true);
1121adc4d41SMina Almasry }
1131adc4d41SMina Almasry 
hugetlb_cgroup_disabled(void)1142bc64a20SAneesh Kumar K.V static inline bool hugetlb_cgroup_disabled(void)
1152bc64a20SAneesh Kumar K.V {
116fc5ed1e9STejun Heo 	return !cgroup_subsys_enabled(hugetlb_cgrp_subsys);
1172bc64a20SAneesh Kumar K.V }
1182bc64a20SAneesh Kumar K.V 
hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup * h_cg)119d85aecf2SMiaohe Lin static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg)
120d85aecf2SMiaohe Lin {
121d85aecf2SMiaohe Lin 	css_put(&h_cg->css);
122d85aecf2SMiaohe Lin }
123d85aecf2SMiaohe Lin 
resv_map_dup_hugetlb_cgroup_uncharge_info(struct resv_map * resv_map)12409a26e83SMike Kravetz static inline void resv_map_dup_hugetlb_cgroup_uncharge_info(
12509a26e83SMike Kravetz 						struct resv_map *resv_map)
12609a26e83SMike Kravetz {
12709a26e83SMike Kravetz 	if (resv_map->css)
12809a26e83SMike Kravetz 		css_get(resv_map->css);
12909a26e83SMike Kravetz }
13009a26e83SMike Kravetz 
resv_map_put_hugetlb_cgroup_uncharge_info(struct resv_map * resv_map)131afe041c2SBui Quang Minh static inline void resv_map_put_hugetlb_cgroup_uncharge_info(
132afe041c2SBui Quang Minh 						struct resv_map *resv_map)
133afe041c2SBui Quang Minh {
134afe041c2SBui Quang Minh 	if (resv_map->css)
135afe041c2SBui Quang Minh 		css_put(resv_map->css);
136afe041c2SBui Quang Minh }
137afe041c2SBui Quang Minh 
1386d76dcf4SAneesh Kumar K.V extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
1396d76dcf4SAneesh Kumar K.V 					struct hugetlb_cgroup **ptr);
1401adc4d41SMina Almasry extern int hugetlb_cgroup_charge_cgroup_rsvd(int idx, unsigned long nr_pages,
1411adc4d41SMina Almasry 					     struct hugetlb_cgroup **ptr);
1426d76dcf4SAneesh Kumar K.V extern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
1436d76dcf4SAneesh Kumar K.V 					 struct hugetlb_cgroup *h_cg,
144*ff7d853bSSidhartha Kumar 					 struct folio *folio);
1451adc4d41SMina Almasry extern void hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages,
1461adc4d41SMina Almasry 					      struct hugetlb_cgroup *h_cg,
147*ff7d853bSSidhartha Kumar 					      struct folio *folio);
148d4ab0316SSidhartha Kumar extern void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages,
149d4ab0316SSidhartha Kumar 					 struct folio *folio);
150d4ab0316SSidhartha Kumar extern void hugetlb_cgroup_uncharge_folio_rsvd(int idx, unsigned long nr_pages,
151d4ab0316SSidhartha Kumar 					      struct folio *folio);
1521adc4d41SMina Almasry 
1536d76dcf4SAneesh Kumar K.V extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
1546d76dcf4SAneesh Kumar K.V 					   struct hugetlb_cgroup *h_cg);
1551adc4d41SMina Almasry extern void hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
1561adc4d41SMina Almasry 						struct hugetlb_cgroup *h_cg);
157e9fe92aeSMina Almasry extern void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
158e9fe92aeSMina Almasry 					    unsigned long start,
159e9fe92aeSMina Almasry 					    unsigned long end);
1601adc4d41SMina Almasry 
161075a61d0SMina Almasry extern void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv,
162075a61d0SMina Almasry 						struct file_region *rg,
163d85aecf2SMiaohe Lin 						unsigned long nr_pages,
164d85aecf2SMiaohe Lin 						bool region_del);
165075a61d0SMina Almasry 
1667179e7bfSJianguo Wu extern void hugetlb_cgroup_file_init(void) __init;
16729f39430SSidhartha Kumar extern void hugetlb_cgroup_migrate(struct folio *old_folio,
16829f39430SSidhartha Kumar 				   struct folio *new_folio);
1696d76dcf4SAneesh Kumar K.V 
1702bc64a20SAneesh Kumar K.V #else
hugetlb_cgroup_uncharge_file_region(struct resv_map * resv,struct file_region * rg,unsigned long nr_pages,bool region_del)171075a61d0SMina Almasry static inline void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv,
172075a61d0SMina Almasry 						       struct file_region *rg,
173d85aecf2SMiaohe Lin 						       unsigned long nr_pages,
174d85aecf2SMiaohe Lin 						       bool region_del)
175075a61d0SMina Almasry {
176075a61d0SMina Almasry }
177075a61d0SMina Almasry 
hugetlb_cgroup_from_folio(struct folio * folio)178f074732dSSidhartha Kumar static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio)
1799dd540e2SAneesh Kumar K.V {
1809dd540e2SAneesh Kumar K.V 	return NULL;
1819dd540e2SAneesh Kumar K.V }
1829dd540e2SAneesh Kumar K.V 
1831adc4d41SMina Almasry static inline struct hugetlb_cgroup *
hugetlb_cgroup_from_folio_rsvd(struct folio * folio)184f074732dSSidhartha Kumar hugetlb_cgroup_from_folio_rsvd(struct folio *folio)
1851adc4d41SMina Almasry {
1861adc4d41SMina Almasry 	return NULL;
1871adc4d41SMina Almasry }
1881adc4d41SMina Almasry 
set_hugetlb_cgroup(struct folio * folio,struct hugetlb_cgroup * h_cg)189de656ed3SSidhartha Kumar static inline void set_hugetlb_cgroup(struct folio *folio,
1901adc4d41SMina Almasry 				     struct hugetlb_cgroup *h_cg)
1911adc4d41SMina Almasry {
1921adc4d41SMina Almasry }
1931adc4d41SMina Almasry 
set_hugetlb_cgroup_rsvd(struct folio * folio,struct hugetlb_cgroup * h_cg)194de656ed3SSidhartha Kumar static inline void set_hugetlb_cgroup_rsvd(struct folio *folio,
1951adc4d41SMina Almasry 					  struct hugetlb_cgroup *h_cg)
1969dd540e2SAneesh Kumar K.V {
1979dd540e2SAneesh Kumar K.V }
1989dd540e2SAneesh Kumar K.V 
hugetlb_cgroup_disabled(void)1992bc64a20SAneesh Kumar K.V static inline bool hugetlb_cgroup_disabled(void)
2002bc64a20SAneesh Kumar K.V {
2012bc64a20SAneesh Kumar K.V 	return true;
2022bc64a20SAneesh Kumar K.V }
2032bc64a20SAneesh Kumar K.V 
hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup * h_cg)204d85aecf2SMiaohe Lin static inline void hugetlb_cgroup_put_rsvd_cgroup(struct hugetlb_cgroup *h_cg)
205d85aecf2SMiaohe Lin {
206d85aecf2SMiaohe Lin }
207d85aecf2SMiaohe Lin 
resv_map_dup_hugetlb_cgroup_uncharge_info(struct resv_map * resv_map)20809a26e83SMike Kravetz static inline void resv_map_dup_hugetlb_cgroup_uncharge_info(
20909a26e83SMike Kravetz 						struct resv_map *resv_map)
21009a26e83SMike Kravetz {
21109a26e83SMike Kravetz }
21209a26e83SMike Kravetz 
resv_map_put_hugetlb_cgroup_uncharge_info(struct resv_map * resv_map)213afe041c2SBui Quang Minh static inline void resv_map_put_hugetlb_cgroup_uncharge_info(
214afe041c2SBui Quang Minh 						struct resv_map *resv_map)
215afe041c2SBui Quang Minh {
216afe041c2SBui Quang Minh }
217afe041c2SBui Quang Minh 
hugetlb_cgroup_charge_cgroup(int idx,unsigned long nr_pages,struct hugetlb_cgroup ** ptr)2181adc4d41SMina Almasry static inline int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
2196d76dcf4SAneesh Kumar K.V 					       struct hugetlb_cgroup **ptr)
2206d76dcf4SAneesh Kumar K.V {
2216d76dcf4SAneesh Kumar K.V 	return 0;
2226d76dcf4SAneesh Kumar K.V }
2236d76dcf4SAneesh Kumar K.V 
hugetlb_cgroup_charge_cgroup_rsvd(int idx,unsigned long nr_pages,struct hugetlb_cgroup ** ptr)2241adc4d41SMina Almasry static inline int hugetlb_cgroup_charge_cgroup_rsvd(int idx,
2251adc4d41SMina Almasry 						    unsigned long nr_pages,
2261adc4d41SMina Almasry 						    struct hugetlb_cgroup **ptr)
2271adc4d41SMina Almasry {
2281adc4d41SMina Almasry 	return 0;
2291adc4d41SMina Almasry }
2301adc4d41SMina Almasry 
hugetlb_cgroup_commit_charge(int idx,unsigned long nr_pages,struct hugetlb_cgroup * h_cg,struct folio * folio)2311adc4d41SMina Almasry static inline void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
2326d76dcf4SAneesh Kumar K.V 						struct hugetlb_cgroup *h_cg,
233*ff7d853bSSidhartha Kumar 						struct folio *folio)
2346d76dcf4SAneesh Kumar K.V {
2356d76dcf4SAneesh Kumar K.V }
2366d76dcf4SAneesh Kumar K.V 
2376d76dcf4SAneesh Kumar K.V static inline void
hugetlb_cgroup_commit_charge_rsvd(int idx,unsigned long nr_pages,struct hugetlb_cgroup * h_cg,struct folio * folio)2381adc4d41SMina Almasry hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages,
2391adc4d41SMina Almasry 				  struct hugetlb_cgroup *h_cg,
240*ff7d853bSSidhartha Kumar 				  struct folio *folio)
2411adc4d41SMina Almasry {
2421adc4d41SMina Almasry }
2431adc4d41SMina Almasry 
hugetlb_cgroup_uncharge_folio(int idx,unsigned long nr_pages,struct folio * folio)244d4ab0316SSidhartha Kumar static inline void hugetlb_cgroup_uncharge_folio(int idx, unsigned long nr_pages,
245d4ab0316SSidhartha Kumar 						struct folio *folio)
2461adc4d41SMina Almasry {
2471adc4d41SMina Almasry }
2481adc4d41SMina Almasry 
hugetlb_cgroup_uncharge_folio_rsvd(int idx,unsigned long nr_pages,struct folio * folio)249d4ab0316SSidhartha Kumar static inline void hugetlb_cgroup_uncharge_folio_rsvd(int idx,
2501adc4d41SMina Almasry 						     unsigned long nr_pages,
251d4ab0316SSidhartha Kumar 						     struct folio *folio)
2521adc4d41SMina Almasry {
2531adc4d41SMina Almasry }
hugetlb_cgroup_uncharge_cgroup(int idx,unsigned long nr_pages,struct hugetlb_cgroup * h_cg)2541adc4d41SMina Almasry static inline void hugetlb_cgroup_uncharge_cgroup(int idx,
2551adc4d41SMina Almasry 						  unsigned long nr_pages,
2561adc4d41SMina Almasry 						  struct hugetlb_cgroup *h_cg)
2576d76dcf4SAneesh Kumar K.V {
2586d76dcf4SAneesh Kumar K.V }
2596d76dcf4SAneesh Kumar K.V 
2606d76dcf4SAneesh Kumar K.V static inline void
hugetlb_cgroup_uncharge_cgroup_rsvd(int idx,unsigned long nr_pages,struct hugetlb_cgroup * h_cg)2611adc4d41SMina Almasry hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
2626d76dcf4SAneesh Kumar K.V 				    struct hugetlb_cgroup *h_cg)
2636d76dcf4SAneesh Kumar K.V {
2646d76dcf4SAneesh Kumar K.V }
2656d76dcf4SAneesh Kumar K.V 
hugetlb_cgroup_uncharge_counter(struct resv_map * resv,unsigned long start,unsigned long end)266e9fe92aeSMina Almasry static inline void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
267e9fe92aeSMina Almasry 						   unsigned long start,
268e9fe92aeSMina Almasry 						   unsigned long end)
269e9fe92aeSMina Almasry {
270e9fe92aeSMina Almasry }
271e9fe92aeSMina Almasry 
hugetlb_cgroup_file_init(void)2727179e7bfSJianguo Wu static inline void hugetlb_cgroup_file_init(void)
273abb8206cSAneesh Kumar K.V {
274abb8206cSAneesh Kumar K.V }
275abb8206cSAneesh Kumar K.V 
hugetlb_cgroup_migrate(struct folio * old_folio,struct folio * new_folio)27629f39430SSidhartha Kumar static inline void hugetlb_cgroup_migrate(struct folio *old_folio,
27729f39430SSidhartha Kumar 					  struct folio *new_folio)
2788e6ac7faSAneesh Kumar K.V {
2798e6ac7faSAneesh Kumar K.V }
2808e6ac7faSAneesh Kumar K.V 
2812bc64a20SAneesh Kumar K.V #endif  /* CONFIG_MEM_RES_CTLR_HUGETLB */
2822bc64a20SAneesh Kumar K.V #endif
283