aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>2014-06-04 19:05:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-04 19:53:51 -0400
commitc177c81e09e517bbf75b67762cdab1b83aba6976 (patch)
tree569aed2a30badb1ce3e5393de74b43eeeb22e376 /arch
parent7f39dda9d86fb4f4f17af0de170decf125726f8c (diff)
hugetlb: restrict hugepage_migration_support() to x86_64
Currently hugepage migration is available for all archs which support pmd-level hugepage, but testing is done only for x86_64 and there're bugs for other archs. So to avoid breaking such archs, this patch limits the availability strictly to x86_64 until developers of other archs get interested in enabling this feature. Simply disabling hugepage migration on non-x86_64 archs is not enough to fix the reported problem where sys_move_pages() hits the BUG_ON() in follow_page(FOLL_GET), so let's fix this by checking if hugepage migration is supported in vma_migratable(). Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Reported-by: Michael Ellerman <mpe@ellerman.id.au> Tested-by: Michael Ellerman <mpe@ellerman.id.au> Acked-by: Hugh Dickins <hughd@google.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Tony Luck <tony.luck@intel.com> Cc: Russell King <rmk@arm.linux.org.uk> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: James Hogan <james.hogan@imgtec.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: David Miller <davem@davemloft.net> Cc: <stable@vger.kernel.org> [3.12+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mm/hugetlbpage.c5
-rw-r--r--arch/arm64/mm/hugetlbpage.c5
-rw-r--r--arch/ia64/mm/hugetlbpage.c5
-rw-r--r--arch/metag/mm/hugetlbpage.c5
-rw-r--r--arch/mips/mm/hugetlbpage.c5
-rw-r--r--arch/powerpc/mm/hugetlbpage.c10
-rw-r--r--arch/s390/mm/hugetlbpage.c5
-rw-r--r--arch/sh/mm/hugetlbpage.c5
-rw-r--r--arch/sparc/mm/hugetlbpage.c5
-rw-r--r--arch/tile/mm/hugetlbpage.c5
-rw-r--r--arch/x86/Kconfig4
-rw-r--r--arch/x86/mm/hugetlbpage.c10
12 files changed, 4 insertions, 65 deletions
diff --git a/arch/arm/mm/hugetlbpage.c b/arch/arm/mm/hugetlbpage.c
index 54ee6163c181..66781bf34077 100644
--- a/arch/arm/mm/hugetlbpage.c
+++ b/arch/arm/mm/hugetlbpage.c
@@ -56,8 +56,3 @@ int pmd_huge(pmd_t pmd)
56{ 56{
57 return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT); 57 return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT);
58} 58}
59
60int pmd_huge_support(void)
61{
62 return 1;
63}
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
index 31eb959e9aa8..023747bf4dd7 100644
--- a/arch/arm64/mm/hugetlbpage.c
+++ b/arch/arm64/mm/hugetlbpage.c
@@ -58,11 +58,6 @@ int pud_huge(pud_t pud)
58#endif 58#endif
59} 59}
60 60
61int pmd_huge_support(void)
62{
63 return 1;
64}
65
66static __init int setup_hugepagesz(char *opt) 61static __init int setup_hugepagesz(char *opt)
67{ 62{
68 unsigned long ps = memparse(opt, &opt); 63 unsigned long ps = memparse(opt, &opt);
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c
index 68232db98baa..76069c18ee42 100644
--- a/arch/ia64/mm/hugetlbpage.c
+++ b/arch/ia64/mm/hugetlbpage.c
@@ -114,11 +114,6 @@ int pud_huge(pud_t pud)
114 return 0; 114 return 0;
115} 115}
116 116
117int pmd_huge_support(void)
118{
119 return 0;
120}
121
122struct page * 117struct page *
123follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write) 118follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write)
124{ 119{
diff --git a/arch/metag/mm/hugetlbpage.c b/arch/metag/mm/hugetlbpage.c
index 042431509b56..3c52fa6d0f8e 100644
--- a/arch/metag/mm/hugetlbpage.c
+++ b/arch/metag/mm/hugetlbpage.c
@@ -110,11 +110,6 @@ int pud_huge(pud_t pud)
110 return 0; 110 return 0;
111} 111}
112 112
113int pmd_huge_support(void)
114{
115 return 1;
116}
117
118struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 113struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
119 pmd_t *pmd, int write) 114 pmd_t *pmd, int write)
120{ 115{
diff --git a/arch/mips/mm/hugetlbpage.c b/arch/mips/mm/hugetlbpage.c
index 77e0ae036e7c..4ec8ee10d371 100644
--- a/arch/mips/mm/hugetlbpage.c
+++ b/arch/mips/mm/hugetlbpage.c
@@ -84,11 +84,6 @@ int pud_huge(pud_t pud)
84 return (pud_val(pud) & _PAGE_HUGE) != 0; 84 return (pud_val(pud) & _PAGE_HUGE) != 0;
85} 85}
86 86
87int pmd_huge_support(void)
88{
89 return 1;
90}
91
92struct page * 87struct page *
93follow_huge_pmd(struct mm_struct *mm, unsigned long address, 88follow_huge_pmd(struct mm_struct *mm, unsigned long address,
94 pmd_t *pmd, int write) 89 pmd_t *pmd, int write)
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index eb923654ba80..7e70ae968e5f 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -86,11 +86,6 @@ int pgd_huge(pgd_t pgd)
86 */ 86 */
87 return ((pgd_val(pgd) & 0x3) != 0x0); 87 return ((pgd_val(pgd) & 0x3) != 0x0);
88} 88}
89
90int pmd_huge_support(void)
91{
92 return 1;
93}
94#else 89#else
95int pmd_huge(pmd_t pmd) 90int pmd_huge(pmd_t pmd)
96{ 91{
@@ -106,11 +101,6 @@ int pgd_huge(pgd_t pgd)
106{ 101{
107 return 0; 102 return 0;
108} 103}
109
110int pmd_huge_support(void)
111{
112 return 0;
113}
114#endif 104#endif
115 105
116pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) 106pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c
index 0727a55d87d9..0ff66a7e29bb 100644
--- a/arch/s390/mm/hugetlbpage.c
+++ b/arch/s390/mm/hugetlbpage.c
@@ -220,11 +220,6 @@ int pud_huge(pud_t pud)
220 return 0; 220 return 0;
221} 221}
222 222
223int pmd_huge_support(void)
224{
225 return 1;
226}
227
228struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 223struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
229 pmd_t *pmdp, int write) 224 pmd_t *pmdp, int write)
230{ 225{
diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c
index 0d676a41081e..d7762349ea48 100644
--- a/arch/sh/mm/hugetlbpage.c
+++ b/arch/sh/mm/hugetlbpage.c
@@ -83,11 +83,6 @@ int pud_huge(pud_t pud)
83 return 0; 83 return 0;
84} 84}
85 85
86int pmd_huge_support(void)
87{
88 return 0;
89}
90
91struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 86struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
92 pmd_t *pmd, int write) 87 pmd_t *pmd, int write)
93{ 88{
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
index 9bd9ce80bf77..d329537739c6 100644
--- a/arch/sparc/mm/hugetlbpage.c
+++ b/arch/sparc/mm/hugetlbpage.c
@@ -231,11 +231,6 @@ int pud_huge(pud_t pud)
231 return 0; 231 return 0;
232} 232}
233 233
234int pmd_huge_support(void)
235{
236 return 0;
237}
238
239struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 234struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
240 pmd_t *pmd, int write) 235 pmd_t *pmd, int write)
241{ 236{
diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c
index 0cb3bbaa580c..e514899e1100 100644
--- a/arch/tile/mm/hugetlbpage.c
+++ b/arch/tile/mm/hugetlbpage.c
@@ -166,11 +166,6 @@ int pud_huge(pud_t pud)
166 return !!(pud_val(pud) & _PAGE_HUGE_PAGE); 166 return !!(pud_val(pud) & _PAGE_HUGE_PAGE);
167} 167}
168 168
169int pmd_huge_support(void)
170{
171 return 1;
172}
173
174struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 169struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
175 pmd_t *pmd, int write) 170 pmd_t *pmd, int write)
176{ 171{
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 7d5feb5908dd..e41b258ad040 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1873,6 +1873,10 @@ config ARCH_ENABLE_SPLIT_PMD_PTLOCK
1873 def_bool y 1873 def_bool y
1874 depends on X86_64 || X86_PAE 1874 depends on X86_64 || X86_PAE
1875 1875
1876config ARCH_ENABLE_HUGEPAGE_MIGRATION
1877 def_bool y
1878 depends on X86_64 && HUGETLB_PAGE && MIGRATION
1879
1876menu "Power management and ACPI options" 1880menu "Power management and ACPI options"
1877 1881
1878config ARCH_HIBERNATION_HEADER 1882config ARCH_HIBERNATION_HEADER
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c
index 8c9f647ff9e1..8b977ebf9388 100644
--- a/arch/x86/mm/hugetlbpage.c
+++ b/arch/x86/mm/hugetlbpage.c
@@ -58,11 +58,6 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address,
58{ 58{
59 return NULL; 59 return NULL;
60} 60}
61
62int pmd_huge_support(void)
63{
64 return 0;
65}
66#else 61#else
67 62
68struct page * 63struct page *
@@ -80,11 +75,6 @@ int pud_huge(pud_t pud)
80{ 75{
81 return !!(pud_val(pud) & _PAGE_PSE); 76 return !!(pud_val(pud) & _PAGE_PSE);
82} 77}
83
84int pmd_huge_support(void)
85{
86 return 1;
87}
88#endif 78#endif
89 79
90#ifdef CONFIG_HUGETLB_PAGE 80#ifdef CONFIG_HUGETLB_PAGE