|
@@ -56,17 +56,19 @@ static inline bool hugetlb_cgroup_is_root(struct hugetlb_cgroup *h_cg)
|
|
|
return (h_cg == root_h_cgroup);
|
|
|
}
|
|
|
|
|
|
-static inline struct hugetlb_cgroup *parent_hugetlb_cgroup(struct cgroup *cg)
|
|
|
+static inline struct hugetlb_cgroup *
|
|
|
+parent_hugetlb_cgroup(struct hugetlb_cgroup *h_cg)
|
|
|
{
|
|
|
- if (!cg->parent)
|
|
|
+ struct cgroup *parent = h_cg->css.cgroup->parent;
|
|
|
+
|
|
|
+ if (!parent)
|
|
|
return NULL;
|
|
|
- return hugetlb_cgroup_from_cgroup(cg->parent);
|
|
|
+ return hugetlb_cgroup_from_cgroup(parent);
|
|
|
}
|
|
|
|
|
|
-static inline bool hugetlb_cgroup_have_usage(struct cgroup *cg)
|
|
|
+static inline bool hugetlb_cgroup_have_usage(struct hugetlb_cgroup *h_cg)
|
|
|
{
|
|
|
int idx;
|
|
|
- struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_cgroup(cg);
|
|
|
|
|
|
for (idx = 0; idx < hugetlb_max_hstate; idx++) {
|
|
|
if ((res_counter_read_u64(&h_cg->hugepage[idx], RES_USAGE)) > 0)
|
|
@@ -115,15 +117,14 @@ static void hugetlb_cgroup_css_free(struct cgroup *cgroup)
|
|
|
* page reference and test for page active here. This function
|
|
|
* cannot fail.
|
|
|
*/
|
|
|
-static void hugetlb_cgroup_move_parent(int idx, struct cgroup *cgroup,
|
|
|
+static void hugetlb_cgroup_move_parent(int idx, struct hugetlb_cgroup *h_cg,
|
|
|
struct page *page)
|
|
|
{
|
|
|
int csize;
|
|
|
struct res_counter *counter;
|
|
|
struct res_counter *fail_res;
|
|
|
struct hugetlb_cgroup *page_hcg;
|
|
|
- struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_cgroup(cgroup);
|
|
|
- struct hugetlb_cgroup *parent = parent_hugetlb_cgroup(cgroup);
|
|
|
+ struct hugetlb_cgroup *parent = parent_hugetlb_cgroup(h_cg);
|
|
|
|
|
|
page_hcg = hugetlb_cgroup_from_page(page);
|
|
|
/*
|
|
@@ -155,6 +156,7 @@ out:
|
|
|
*/
|
|
|
static void hugetlb_cgroup_css_offline(struct cgroup *cgroup)
|
|
|
{
|
|
|
+ struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_cgroup(cgroup);
|
|
|
struct hstate *h;
|
|
|
struct page *page;
|
|
|
int idx = 0;
|
|
@@ -163,13 +165,13 @@ static void hugetlb_cgroup_css_offline(struct cgroup *cgroup)
|
|
|
for_each_hstate(h) {
|
|
|
spin_lock(&hugetlb_lock);
|
|
|
list_for_each_entry(page, &h->hugepage_activelist, lru)
|
|
|
- hugetlb_cgroup_move_parent(idx, cgroup, page);
|
|
|
+ hugetlb_cgroup_move_parent(idx, h_cg, page);
|
|
|
|
|
|
spin_unlock(&hugetlb_lock);
|
|
|
idx++;
|
|
|
}
|
|
|
cond_resched();
|
|
|
- } while (hugetlb_cgroup_have_usage(cgroup));
|
|
|
+ } while (hugetlb_cgroup_have_usage(h_cg));
|
|
|
}
|
|
|
|
|
|
int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
|