diff options
-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 | ||||
-rw-r--r-- | include/linux/hugetlb.h | 13 | ||||
-rw-r--r-- | include/linux/mempolicy.h | 6 | ||||
-rw-r--r-- | mm/Kconfig | 3 |
15 files changed, 18 insertions, 73 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 |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index b65166de1d9d..d0bad1a8b0bd 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -392,15 +392,13 @@ static inline pgoff_t basepage_index(struct page *page) | |||
392 | 392 | ||
393 | extern void dissolve_free_huge_pages(unsigned long start_pfn, | 393 | extern void dissolve_free_huge_pages(unsigned long start_pfn, |
394 | unsigned long end_pfn); | 394 | unsigned long end_pfn); |
395 | int pmd_huge_support(void); | ||
396 | /* | ||
397 | * Currently hugepage migration is enabled only for pmd-based hugepage. | ||
398 | * This function will be updated when hugepage migration is more widely | ||
399 | * supported. | ||
400 | */ | ||
401 | static inline int hugepage_migration_support(struct hstate *h) | 395 | static inline int hugepage_migration_support(struct hstate *h) |
402 | { | 396 | { |
403 | return pmd_huge_support() && (huge_page_shift(h) == PMD_SHIFT); | 397 | #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION |
398 | return huge_page_shift(h) == PMD_SHIFT; | ||
399 | #else | ||
400 | return 0; | ||
401 | #endif | ||
404 | } | 402 | } |
405 | 403 | ||
406 | static inline spinlock_t *huge_pte_lockptr(struct hstate *h, | 404 | static inline spinlock_t *huge_pte_lockptr(struct hstate *h, |
@@ -450,7 +448,6 @@ static inline pgoff_t basepage_index(struct page *page) | |||
450 | return page->index; | 448 | return page->index; |
451 | } | 449 | } |
452 | #define dissolve_free_huge_pages(s, e) do {} while (0) | 450 | #define dissolve_free_huge_pages(s, e) do {} while (0) |
453 | #define pmd_huge_support() 0 | ||
454 | #define hugepage_migration_support(h) 0 | 451 | #define hugepage_migration_support(h) 0 |
455 | 452 | ||
456 | static inline spinlock_t *huge_pte_lockptr(struct hstate *h, | 453 | static inline spinlock_t *huge_pte_lockptr(struct hstate *h, |
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 3c1b968da0ca..f230a978e6ba 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
@@ -175,6 +175,12 @@ static inline int vma_migratable(struct vm_area_struct *vma) | |||
175 | { | 175 | { |
176 | if (vma->vm_flags & (VM_IO | VM_PFNMAP)) | 176 | if (vma->vm_flags & (VM_IO | VM_PFNMAP)) |
177 | return 0; | 177 | return 0; |
178 | |||
179 | #ifndef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION | ||
180 | if (vma->vm_flags & VM_HUGETLB) | ||
181 | return 0; | ||
182 | #endif | ||
183 | |||
178 | /* | 184 | /* |
179 | * Migration allocates pages in the highest zone. If we cannot | 185 | * Migration allocates pages in the highest zone. If we cannot |
180 | * do so then migration (at least from node to node) is not | 186 | * do so then migration (at least from node to node) is not |
diff --git a/mm/Kconfig b/mm/Kconfig index 28cec518f4d4..75ac479cbacd 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
@@ -267,6 +267,9 @@ config MIGRATION | |||
267 | pages as migration can relocate pages to satisfy a huge page | 267 | pages as migration can relocate pages to satisfy a huge page |
268 | allocation instead of reclaiming. | 268 | allocation instead of reclaiming. |
269 | 269 | ||
270 | config ARCH_ENABLE_HUGEPAGE_MIGRATION | ||
271 | boolean | ||
272 | |||
270 | config PHYS_ADDR_T_64BIT | 273 | config PHYS_ADDR_T_64BIT |
271 | def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT | 274 | def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT |
272 | 275 | ||