diff options
author | Jianguo Wu <wujianguo@huawei.com> | 2012-12-18 17:23:19 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-18 18:02:15 -0500 |
commit | 7179e7bf4592ac5a7b30257a7df6259ee81e51da (patch) | |
tree | a3fb75a87e1a18b153c18aa7e4530d35c768e8b6 /mm/hugetlb_cgroup.c | |
parent | 7d12efaea7e74bf8f4953412514e836313fa32ec (diff) |
mm/hugetlb: create hugetlb cgroup file in hugetlb_init
Build kernel with CONFIG_HUGETLBFS=y,CONFIG_HUGETLB_PAGE=y and
CONFIG_CGROUP_HUGETLB=y, then specify hugepagesz=xx boot option, system
will fail to boot.
This failure is caused by following code path:
setup_hugepagesz
hugetlb_add_hstate
hugetlb_cgroup_file_init
cgroup_add_cftypes
kzalloc <--slab is *not available* yet
For this path, slab is not available yet, so memory allocated will be
failed, and cause WARN_ON() in hugetlb_cgroup_file_init().
So I move hugetlb_cgroup_file_init() into hugetlb_init().
[akpm@linux-foundation.org: tweak coding-style, remove pointless __init on inlined function]
[akpm@linux-foundation.org: fix warning]
Signed-off-by: Jianguo Wu <wujianguo@huawei.com>
Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/hugetlb_cgroup.c')
-rw-r--r-- | mm/hugetlb_cgroup.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c index b5bde7a5c01..9cea7de22ff 100644 --- a/mm/hugetlb_cgroup.c +++ b/mm/hugetlb_cgroup.c | |||
@@ -333,7 +333,7 @@ static char *mem_fmt(char *buf, int size, unsigned long hsize) | |||
333 | return buf; | 333 | return buf; |
334 | } | 334 | } |
335 | 335 | ||
336 | int __init hugetlb_cgroup_file_init(int idx) | 336 | static void __init __hugetlb_cgroup_file_init(int idx) |
337 | { | 337 | { |
338 | char buf[32]; | 338 | char buf[32]; |
339 | struct cftype *cft; | 339 | struct cftype *cft; |
@@ -375,7 +375,22 @@ int __init hugetlb_cgroup_file_init(int idx) | |||
375 | 375 | ||
376 | WARN_ON(cgroup_add_cftypes(&hugetlb_subsys, h->cgroup_files)); | 376 | WARN_ON(cgroup_add_cftypes(&hugetlb_subsys, h->cgroup_files)); |
377 | 377 | ||
378 | 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 | } | ||
379 | } | 394 | } |
380 | 395 | ||
381 | /* | 396 | /* |