12bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V/*
22bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * Copyright IBM Corporation, 2012
32bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
42bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V *
52bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * This program is free software; you can redistribute it and/or modify it
62bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * under the terms of version 2.1 of the GNU Lesser General Public License
72bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * as published by the Free Software Foundation.
82bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V *
92bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * This program is distributed in the hope that it would be useful, but
102bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * WITHOUT ANY WARRANTY; without even the implied warranty of
112bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
122bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V *
132bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V */
142bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
152bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#ifndef _LINUX_HUGETLB_CGROUP_H
162bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#define _LINUX_HUGETLB_CGROUP_H
172bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
18309381feaee564281c3d9e90fbca8963bb7428adSasha Levin#include <linux/mmdebug.h>
192bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#include <linux/res_counter.h>
202bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
212bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.Vstruct hugetlb_cgroup;
229dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V/*
239dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V * Minimum page order trackable by hugetlb cgroup.
249dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V * At least 3 pages are necessary for all the tracking information.
259dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V */
269dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V#define HUGETLB_CGROUP_MIN_ORDER	2
272bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
282bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#ifdef CONFIG_CGROUP_HUGETLB
299dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
309dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vstatic inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
319dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V{
32309381feaee564281c3d9e90fbca8963bb7428adSasha Levin	VM_BUG_ON_PAGE(!PageHuge(page), page);
339dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
349dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
359dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V		return NULL;
369dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	return (struct hugetlb_cgroup *)page[2].lru.next;
379dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V}
389dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
399dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vstatic inline
409dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vint set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
419dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V{
42309381feaee564281c3d9e90fbca8963bb7428adSasha Levin	VM_BUG_ON_PAGE(!PageHuge(page), page);
439dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
449dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
459dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V		return -1;
469dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	page[2].lru.next = (void *)h_cg;
479dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	return 0;
489dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V}
499dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
502bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.Vstatic inline bool hugetlb_cgroup_disabled(void)
512bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V{
52073219e995b4a3f8cf1ce8228b7ef440b6994ac0Tejun Heo	if (hugetlb_cgrp_subsys.disabled)
532bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V		return true;
542bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V	return false;
552bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V}
562bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
576d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vextern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
586d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V					struct hugetlb_cgroup **ptr);
596d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vextern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
606d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V					 struct hugetlb_cgroup *h_cg,
616d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V					 struct page *page);
626d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vextern void hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages,
636d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V					 struct page *page);
646d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vextern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
656d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V					   struct hugetlb_cgroup *h_cg);
667179e7bf4592ac5a7b30257a7df6259ee81e51daJianguo Wuextern void hugetlb_cgroup_file_init(void) __init;
678e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.Vextern void hugetlb_cgroup_migrate(struct page *oldhpage,
688e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V				   struct page *newhpage);
696d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V
702bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#else
719dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vstatic inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
729dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V{
739dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	return NULL;
749dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V}
759dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
769dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vstatic inline
779dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.Vint set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
789dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V{
799dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V	return 0;
809dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V}
819dd540e23111d8884773ab942a736f3aba4040d4Aneesh Kumar K.V
822bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.Vstatic inline bool hugetlb_cgroup_disabled(void)
832bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V{
842bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V	return true;
852bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V}
862bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V
876d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vstatic inline int
886d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vhugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
896d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V			     struct hugetlb_cgroup **ptr)
906d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V{
916d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V	return 0;
926d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V}
936d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V
946d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vstatic inline void
956d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vhugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
966d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V			     struct hugetlb_cgroup *h_cg,
976d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V			     struct page *page)
986d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V{
996d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V	return;
1006d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V}
1016d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V
1026d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vstatic inline void
1036d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vhugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages, struct page *page)
1046d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V{
1056d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V	return;
1066d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V}
1076d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V
1086d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vstatic inline void
1096d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.Vhugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
1106d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V			       struct hugetlb_cgroup *h_cg)
1116d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V{
1126d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V	return;
1136d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V}
1146d76dcf40405144a448040a350fd214ddc243d5eAneesh Kumar K.V
1157179e7bf4592ac5a7b30257a7df6259ee81e51daJianguo Wustatic inline void hugetlb_cgroup_file_init(void)
116abb8206cb07734d0b7bf033c715995d6371a94c3Aneesh Kumar K.V{
117abb8206cb07734d0b7bf033c715995d6371a94c3Aneesh Kumar K.V}
118abb8206cb07734d0b7bf033c715995d6371a94c3Aneesh Kumar K.V
1198e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.Vstatic inline void hugetlb_cgroup_migrate(struct page *oldhpage,
1208e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V					  struct page *newhpage)
1218e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V{
1228e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V	return;
1238e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V}
1248e6ac7fab374816de9a8b0a8fbb02ef761a30ff4Aneesh Kumar K.V
1252bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#endif  /* CONFIG_MEM_RES_CTLR_HUGETLB */
1262bc64a2046975410505bb119bba32705892b9255Aneesh Kumar K.V#endif
127