diff options
author | Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> | 2014-06-04 19:05:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-04 19:53:51 -0400 |
commit | c177c81e09e517bbf75b67762cdab1b83aba6976 (patch) | |
tree | 569aed2a30badb1ce3e5393de74b43eeeb22e376 /arch | |
parent | 7f39dda9d86fb4f4f17af0de170decf125726f8c (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.c | 5 | ||||
-rw-r--r-- | arch/arm64/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/ia64/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/metag/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/mips/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/powerpc/mm/hugetlbpage.c | 10 | ||||
-rw-r--r-- | arch/s390/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/sh/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/sparc/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/tile/mm/hugetlbpage.c | 5 | ||||
-rw-r--r-- | arch/x86/Kconfig | 4 | ||||
-rw-r--r-- | arch/x86/mm/hugetlbpage.c | 10 |
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 | |||
60 | int 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 | ||
61 | int pmd_huge_support(void) | ||
62 | { | ||
63 | return 1; | ||
64 | } | ||
65 | |||
66 | static __init int setup_hugepagesz(char *opt) | 61 | static __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 | ||
117 | int pmd_huge_support(void) | ||
118 | { | ||
119 | return 0; | ||
120 | } | ||
121 | |||
122 | struct page * | 117 | struct page * |
123 | follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write) | 118 | follow_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 | ||
113 | int pmd_huge_support(void) | ||
114 | { | ||
115 | return 1; | ||
116 | } | ||
117 | |||
118 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 113 | struct 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 | ||
87 | int pmd_huge_support(void) | ||
88 | { | ||
89 | return 1; | ||
90 | } | ||
91 | |||
92 | struct page * | 87 | struct page * |
93 | follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 88 | follow_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 | |||
90 | int pmd_huge_support(void) | ||
91 | { | ||
92 | return 1; | ||
93 | } | ||
94 | #else | 89 | #else |
95 | int pmd_huge(pmd_t pmd) | 90 | int 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 | |||
110 | int pmd_huge_support(void) | ||
111 | { | ||
112 | return 0; | ||
113 | } | ||
114 | #endif | 104 | #endif |
115 | 105 | ||
116 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | 106 | pte_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 | ||
223 | int pmd_huge_support(void) | ||
224 | { | ||
225 | return 1; | ||
226 | } | ||
227 | |||
228 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 223 | struct 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 | ||
86 | int pmd_huge_support(void) | ||
87 | { | ||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 86 | struct 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 | ||
234 | int pmd_huge_support(void) | ||
235 | { | ||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 234 | struct 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 | ||
169 | int pmd_huge_support(void) | ||
170 | { | ||
171 | return 1; | ||
172 | } | ||
173 | |||
174 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | 169 | struct 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 | ||
1876 | config ARCH_ENABLE_HUGEPAGE_MIGRATION | ||
1877 | def_bool y | ||
1878 | depends on X86_64 && HUGETLB_PAGE && MIGRATION | ||
1879 | |||
1876 | menu "Power management and ACPI options" | 1880 | menu "Power management and ACPI options" |
1877 | 1881 | ||
1878 | config ARCH_HIBERNATION_HEADER | 1882 | config 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 | |||
62 | int pmd_huge_support(void) | ||
63 | { | ||
64 | return 0; | ||
65 | } | ||
66 | #else | 61 | #else |
67 | 62 | ||
68 | struct page * | 63 | struct 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 | |||
84 | int 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 |