diff options
Diffstat (limited to 'mm/hugetlb_cgroup.c')
-rw-r--r-- | mm/hugetlb_cgroup.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c index a3f358fb8a0c..9cea7de22ffb 100644 --- a/mm/hugetlb_cgroup.c +++ b/mm/hugetlb_cgroup.c | |||
@@ -77,7 +77,7 @@ static inline bool hugetlb_cgroup_have_usage(struct cgroup *cg) | |||
77 | return false; | 77 | return false; |
78 | } | 78 | } |
79 | 79 | ||
80 | static struct cgroup_subsys_state *hugetlb_cgroup_create(struct cgroup *cgroup) | 80 | static struct cgroup_subsys_state *hugetlb_cgroup_css_alloc(struct cgroup *cgroup) |
81 | { | 81 | { |
82 | int idx; | 82 | int idx; |
83 | struct cgroup *parent_cgroup; | 83 | struct cgroup *parent_cgroup; |
@@ -101,7 +101,7 @@ static struct cgroup_subsys_state *hugetlb_cgroup_create(struct cgroup *cgroup) | |||
101 | return &h_cgroup->css; | 101 | return &h_cgroup->css; |
102 | } | 102 | } |
103 | 103 | ||
104 | static void hugetlb_cgroup_destroy(struct cgroup *cgroup) | 104 | static void hugetlb_cgroup_css_free(struct cgroup *cgroup) |
105 | { | 105 | { |
106 | struct hugetlb_cgroup *h_cgroup; | 106 | struct hugetlb_cgroup *h_cgroup; |
107 | 107 | ||
@@ -155,18 +155,13 @@ out: | |||
155 | * Force the hugetlb cgroup to empty the hugetlb resources by moving them to | 155 | * Force the hugetlb cgroup to empty the hugetlb resources by moving them to |
156 | * the parent cgroup. | 156 | * the parent cgroup. |
157 | */ | 157 | */ |
158 | static int hugetlb_cgroup_pre_destroy(struct cgroup *cgroup) | 158 | static void hugetlb_cgroup_css_offline(struct cgroup *cgroup) |
159 | { | 159 | { |
160 | struct hstate *h; | 160 | struct hstate *h; |
161 | struct page *page; | 161 | struct page *page; |
162 | int ret = 0, idx = 0; | 162 | int idx = 0; |
163 | 163 | ||
164 | do { | 164 | do { |
165 | if (cgroup_task_count(cgroup) || | ||
166 | !list_empty(&cgroup->children)) { | ||
167 | ret = -EBUSY; | ||
168 | goto out; | ||
169 | } | ||
170 | for_each_hstate(h) { | 165 | for_each_hstate(h) { |
171 | spin_lock(&hugetlb_lock); | 166 | spin_lock(&hugetlb_lock); |
172 | list_for_each_entry(page, &h->hugepage_activelist, lru) | 167 | list_for_each_entry(page, &h->hugepage_activelist, lru) |
@@ -177,8 +172,6 @@ static int hugetlb_cgroup_pre_destroy(struct cgroup *cgroup) | |||
177 | } | 172 | } |
178 | cond_resched(); | 173 | cond_resched(); |
179 | } while (hugetlb_cgroup_have_usage(cgroup)); | 174 | } while (hugetlb_cgroup_have_usage(cgroup)); |
180 | out: | ||
181 | return ret; | ||
182 | } | 175 | } |
183 | 176 | ||
184 | int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages, | 177 | int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages, |
@@ -340,7 +333,7 @@ static char *mem_fmt(char *buf, int size, unsigned long hsize) | |||
340 | return buf; | 333 | return buf; |
341 | } | 334 | } |
342 | 335 | ||
343 | int __init hugetlb_cgroup_file_init(int idx) | 336 | static void __init __hugetlb_cgroup_file_init(int idx) |
344 | { | 337 | { |
345 | char buf[32]; | 338 | char buf[32]; |
346 | struct cftype *cft; | 339 | struct cftype *cft; |
@@ -382,7 +375,22 @@ int __init hugetlb_cgroup_file_init(int idx) | |||
382 | 375 | ||
383 | WARN_ON(cgroup_add_cftypes(&hugetlb_subsys, h->cgroup_files)); | 376 | WARN_ON(cgroup_add_cftypes(&hugetlb_subsys, h->cgroup_files)); |
384 | 377 | ||
385 | return 0; | 378 | return; |
379 | } | ||
380 | |||
381 | void __init hugetlb_cgroup_file_init(void) | ||
382 | { | ||
383 | struct hstate *h; | ||
384 | |||
385 | for_each_hstate(h) { | ||
386 | /* | ||
387 | * Add cgroup control files only if the huge page consists | ||
388 | * of more than two normal pages. This is because we use | ||
389 | * page[2].lru.next for storing cgroup details. | ||
390 | */ | ||
391 | if (huge_page_order(h) >= HUGETLB_CGROUP_MIN_ORDER) | ||
392 | __hugetlb_cgroup_file_init(hstate_index(h)); | ||
393 | } | ||
386 | } | 394 | } |
387 | 395 | ||
388 | /* | 396 | /* |
@@ -411,8 +419,8 @@ void hugetlb_cgroup_migrate(struct page *oldhpage, struct page *newhpage) | |||
411 | 419 | ||
412 | struct cgroup_subsys hugetlb_subsys = { | 420 | struct cgroup_subsys hugetlb_subsys = { |
413 | .name = "hugetlb", | 421 | .name = "hugetlb", |
414 | .create = hugetlb_cgroup_create, | 422 | .css_alloc = hugetlb_cgroup_css_alloc, |
415 | .pre_destroy = hugetlb_cgroup_pre_destroy, | 423 | .css_offline = hugetlb_cgroup_css_offline, |
416 | .destroy = hugetlb_cgroup_destroy, | 424 | .css_free = hugetlb_cgroup_css_free, |
417 | .subsys_id = hugetlb_subsys_id, | 425 | .subsys_id = hugetlb_subsys_id, |
418 | }; | 426 | }; |