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 | |
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')
-rw-r--r-- | mm/hugetlb.c | 11 | ||||
-rw-r--r-- | mm/hugetlb_cgroup.c | 19 |
2 files changed, 18 insertions, 12 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index e5318c7793ae..4f3ea0b1e57c 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -1906,14 +1906,12 @@ static int __init hugetlb_init(void) | |||
1906 | default_hstate.max_huge_pages = default_hstate_max_huge_pages; | 1906 | default_hstate.max_huge_pages = default_hstate_max_huge_pages; |
1907 | 1907 | ||
1908 | hugetlb_init_hstates(); | 1908 | hugetlb_init_hstates(); |
1909 | |||
1910 | gather_bootmem_prealloc(); | 1909 | gather_bootmem_prealloc(); |
1911 | |||
1912 | report_hugepages(); | 1910 | report_hugepages(); |
1913 | 1911 | ||
1914 | hugetlb_sysfs_init(); | 1912 | hugetlb_sysfs_init(); |
1915 | |||
1916 | hugetlb_register_all_nodes(); | 1913 | hugetlb_register_all_nodes(); |
1914 | hugetlb_cgroup_file_init(); | ||
1917 | 1915 | ||
1918 | return 0; | 1916 | return 0; |
1919 | } | 1917 | } |
@@ -1943,13 +1941,6 @@ void __init hugetlb_add_hstate(unsigned order) | |||
1943 | h->next_nid_to_free = first_node(node_states[N_MEMORY]); | 1941 | h->next_nid_to_free = first_node(node_states[N_MEMORY]); |
1944 | snprintf(h->name, HSTATE_NAME_LEN, "hugepages-%lukB", | 1942 | snprintf(h->name, HSTATE_NAME_LEN, "hugepages-%lukB", |
1945 | huge_page_size(h)/1024); | 1943 | huge_page_size(h)/1024); |
1946 | /* | ||
1947 | * Add cgroup control files only if the huge page consists | ||
1948 | * of more than two normal pages. This is because we use | ||
1949 | * page[2].lru.next for storing cgoup details. | ||
1950 | */ | ||
1951 | if (order >= HUGETLB_CGROUP_MIN_ORDER) | ||
1952 | hugetlb_cgroup_file_init(hugetlb_max_hstate - 1); | ||
1953 | 1944 | ||
1954 | parsed_hstate = h; | 1945 | parsed_hstate = h; |
1955 | } | 1946 | } |
diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c index b5bde7a5c017..9cea7de22ffb 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 | /* |