summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonsoo Kim <iamjoonsoo.kim@lge.com>2014-12-12 19:55:52 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-13 15:42:48 -0500
commit031bc5743f158b2d5498294f489e534a31251626 (patch)
tree472c0024f26821a627ec17a2e73a450f450ca4cc
parente30825f1869a75b29a69dc8e0aaaaccc492092cf (diff)
mm/debug-pagealloc: make debug-pagealloc boottime configurable
Now, we have prepared to avoid using debug-pagealloc in boottime. So introduce new kernel-parameter to disable debug-pagealloc in boottime, and makes related functions to be disabled in this case. Only non-intuitive part is change of guard page functions. Because guard page is effective only if debug-pagealloc is enabled, turning off according to debug-pagealloc is reasonable thing to do. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Dave Hansen <dave@sr71.net> Cc: Michal Nazarewicz <mina86@mina86.com> Cc: Jungsoo Son <jungsoo.son@lge.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--Documentation/kernel-parameters.txt9
-rw-r--r--arch/powerpc/mm/hash_utils_64.c2
-rw-r--r--arch/powerpc/mm/pgtable_32.c2
-rw-r--r--arch/s390/mm/pageattr.c2
-rw-r--r--arch/sparc/mm/init_64.c2
-rw-r--r--arch/x86/mm/pageattr.c2
-rw-r--r--include/linux/mm.h17
-rw-r--r--mm/debug-pagealloc.c8
-rw-r--r--mm/page_alloc.c20
9 files changed, 57 insertions, 7 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 24539d1c7d25..6f067954675b 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -829,6 +829,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
829 CONFIG_DEBUG_PAGEALLOC, hence this option will not help 829 CONFIG_DEBUG_PAGEALLOC, hence this option will not help
830 tracking down these problems. 830 tracking down these problems.
831 831
832 debug_pagealloc=
833 [KNL] When CONFIG_DEBUG_PAGEALLOC is set, this
834 parameter enables the feature at boot time. In
835 default, it is disabled. We can avoid allocating huge
836 chunk of memory for debug pagealloc if we don't enable
837 it at boot time and the system will work mostly same
838 with the kernel built without CONFIG_DEBUG_PAGEALLOC.
839 on: enable the feature
840
832 debugpat [X86] Enable PAT debugging 841 debugpat [X86] Enable PAT debugging
833 842
834 decnet.addr= [HW,NET] 843 decnet.addr= [HW,NET]
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index e56a307bc676..2c2022d16059 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -1514,7 +1514,7 @@ static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
1514 mmu_kernel_ssize, 0); 1514 mmu_kernel_ssize, 0);
1515} 1515}
1516 1516
1517void kernel_map_pages(struct page *page, int numpages, int enable) 1517void __kernel_map_pages(struct page *page, int numpages, int enable)
1518{ 1518{
1519 unsigned long flags, vaddr, lmi; 1519 unsigned long flags, vaddr, lmi;
1520 int i; 1520 int i;
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
index d545b1231594..50fad3801f30 100644
--- a/arch/powerpc/mm/pgtable_32.c
+++ b/arch/powerpc/mm/pgtable_32.c
@@ -429,7 +429,7 @@ static int change_page_attr(struct page *page, int numpages, pgprot_t prot)
429} 429}
430 430
431 431
432void kernel_map_pages(struct page *page, int numpages, int enable) 432void __kernel_map_pages(struct page *page, int numpages, int enable)
433{ 433{
434 if (PageHighMem(page)) 434 if (PageHighMem(page))
435 return; 435 return;
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c
index 3fef3b299665..426c9d462d1c 100644
--- a/arch/s390/mm/pageattr.c
+++ b/arch/s390/mm/pageattr.c
@@ -120,7 +120,7 @@ static void ipte_range(pte_t *pte, unsigned long address, int nr)
120 } 120 }
121} 121}
122 122
123void kernel_map_pages(struct page *page, int numpages, int enable) 123void __kernel_map_pages(struct page *page, int numpages, int enable)
124{ 124{
125 unsigned long address; 125 unsigned long address;
126 int nr, i, j; 126 int nr, i, j;
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index 2d91c62f7f5f..3ea267c53320 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -1621,7 +1621,7 @@ static void __init kernel_physical_mapping_init(void)
1621} 1621}
1622 1622
1623#ifdef CONFIG_DEBUG_PAGEALLOC 1623#ifdef CONFIG_DEBUG_PAGEALLOC
1624void kernel_map_pages(struct page *page, int numpages, int enable) 1624void __kernel_map_pages(struct page *page, int numpages, int enable)
1625{ 1625{
1626 unsigned long phys_start = page_to_pfn(page) << PAGE_SHIFT; 1626 unsigned long phys_start = page_to_pfn(page) << PAGE_SHIFT;
1627 unsigned long phys_end = phys_start + (numpages * PAGE_SIZE); 1627 unsigned long phys_end = phys_start + (numpages * PAGE_SIZE);
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index a3a5d46605d2..dfaf2e0f5f8f 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -1817,7 +1817,7 @@ static int __set_pages_np(struct page *page, int numpages)
1817 return __change_page_attr_set_clr(&cpa, 0); 1817 return __change_page_attr_set_clr(&cpa, 0);
1818} 1818}
1819 1819
1820void kernel_map_pages(struct page *page, int numpages, int enable) 1820void __kernel_map_pages(struct page *page, int numpages, int enable)
1821{ 1821{
1822 if (PageHighMem(page)) 1822 if (PageHighMem(page))
1823 return; 1823 return;
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 66560f1a0564..8b8d77a1532f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2061,7 +2061,22 @@ static inline void vm_stat_account(struct mm_struct *mm,
2061#endif /* CONFIG_PROC_FS */ 2061#endif /* CONFIG_PROC_FS */
2062 2062
2063#ifdef CONFIG_DEBUG_PAGEALLOC 2063#ifdef CONFIG_DEBUG_PAGEALLOC
2064extern void kernel_map_pages(struct page *page, int numpages, int enable); 2064extern bool _debug_pagealloc_enabled;
2065extern void __kernel_map_pages(struct page *page, int numpages, int enable);
2066
2067static inline bool debug_pagealloc_enabled(void)
2068{
2069 return _debug_pagealloc_enabled;
2070}
2071
2072static inline void
2073kernel_map_pages(struct page *page, int numpages, int enable)
2074{
2075 if (!debug_pagealloc_enabled())
2076 return;
2077
2078 __kernel_map_pages(page, numpages, enable);
2079}
2065#ifdef CONFIG_HIBERNATION 2080#ifdef CONFIG_HIBERNATION
2066extern bool kernel_page_present(struct page *page); 2081extern bool kernel_page_present(struct page *page);
2067#endif /* CONFIG_HIBERNATION */ 2082#endif /* CONFIG_HIBERNATION */
diff --git a/mm/debug-pagealloc.c b/mm/debug-pagealloc.c
index 0072f2c53331..5bf5906ce13b 100644
--- a/mm/debug-pagealloc.c
+++ b/mm/debug-pagealloc.c
@@ -10,11 +10,17 @@ static bool page_poisoning_enabled __read_mostly;
10 10
11static bool need_page_poisoning(void) 11static bool need_page_poisoning(void)
12{ 12{
13 if (!debug_pagealloc_enabled())
14 return false;
15
13 return true; 16 return true;
14} 17}
15 18
16static void init_page_poisoning(void) 19static void init_page_poisoning(void)
17{ 20{
21 if (!debug_pagealloc_enabled())
22 return;
23
18 page_poisoning_enabled = true; 24 page_poisoning_enabled = true;
19} 25}
20 26
@@ -119,7 +125,7 @@ static void unpoison_pages(struct page *page, int n)
119 unpoison_page(page + i); 125 unpoison_page(page + i);
120} 126}
121 127
122void kernel_map_pages(struct page *page, int numpages, int enable) 128void __kernel_map_pages(struct page *page, int numpages, int enable)
123{ 129{
124 if (!page_poisoning_enabled) 130 if (!page_poisoning_enabled)
125 return; 131 return;
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index e0a39d328ca1..303d38516807 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -425,15 +425,35 @@ static inline void prep_zero_page(struct page *page, unsigned int order,
425 425
426#ifdef CONFIG_DEBUG_PAGEALLOC 426#ifdef CONFIG_DEBUG_PAGEALLOC
427unsigned int _debug_guardpage_minorder; 427unsigned int _debug_guardpage_minorder;
428bool _debug_pagealloc_enabled __read_mostly;
428bool _debug_guardpage_enabled __read_mostly; 429bool _debug_guardpage_enabled __read_mostly;
429 430
431static int __init early_debug_pagealloc(char *buf)
432{
433 if (!buf)
434 return -EINVAL;
435
436 if (strcmp(buf, "on") == 0)
437 _debug_pagealloc_enabled = true;
438
439 return 0;
440}
441early_param("debug_pagealloc", early_debug_pagealloc);
442
430static bool need_debug_guardpage(void) 443static bool need_debug_guardpage(void)
431{ 444{
445 /* If we don't use debug_pagealloc, we don't need guard page */
446 if (!debug_pagealloc_enabled())
447 return false;
448
432 return true; 449 return true;
433} 450}
434 451
435static void init_debug_guardpage(void) 452static void init_debug_guardpage(void)
436{ 453{
454 if (!debug_pagealloc_enabled())
455 return;
456
437 _debug_guardpage_enabled = true; 457 _debug_guardpage_enabled = true;
438} 458}
439 459