diff options
-rw-r--r-- | mm/memory-failure.c | 2 | ||||
-rw-r--r-- | mm/rmap.c | 1 | ||||
-rw-r--r-- | mm/swap_state.c | 6 | ||||
-rw-r--r-- | mm/swapfile.c | 2 |
4 files changed, 11 insertions, 0 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2323a8039a98..6a283cc9317c 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -386,6 +386,8 @@ static void collect_procs_anon(struct page *page, struct list_head *to_kill, | |||
386 | struct task_struct *tsk; | 386 | struct task_struct *tsk; |
387 | struct anon_vma *av; | 387 | struct anon_vma *av; |
388 | 388 | ||
389 | if (unlikely(split_huge_page(page))) | ||
390 | return; | ||
389 | read_lock(&tasklist_lock); | 391 | read_lock(&tasklist_lock); |
390 | av = page_lock_anon_vma(page); | 392 | av = page_lock_anon_vma(page); |
391 | if (av == NULL) /* Not actually mapped anymore */ | 393 | if (av == NULL) /* Not actually mapped anymore */ |
@@ -1400,6 +1400,7 @@ int try_to_unmap(struct page *page, enum ttu_flags flags) | |||
1400 | int ret; | 1400 | int ret; |
1401 | 1401 | ||
1402 | BUG_ON(!PageLocked(page)); | 1402 | BUG_ON(!PageLocked(page)); |
1403 | BUG_ON(PageTransHuge(page)); | ||
1403 | 1404 | ||
1404 | if (unlikely(PageKsm(page))) | 1405 | if (unlikely(PageKsm(page))) |
1405 | ret = try_to_unmap_ksm(page, flags); | 1406 | ret = try_to_unmap_ksm(page, flags); |
diff --git a/mm/swap_state.c b/mm/swap_state.c index e10f5833167f..5c8cfabbc9bc 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -157,6 +157,12 @@ int add_to_swap(struct page *page) | |||
157 | if (!entry.val) | 157 | if (!entry.val) |
158 | return 0; | 158 | return 0; |
159 | 159 | ||
160 | if (unlikely(PageTransHuge(page))) | ||
161 | if (unlikely(split_huge_page(page))) { | ||
162 | swapcache_free(entry, NULL); | ||
163 | return 0; | ||
164 | } | ||
165 | |||
160 | /* | 166 | /* |
161 | * Radix-tree node allocations from PF_MEMALLOC contexts could | 167 | * Radix-tree node allocations from PF_MEMALLOC contexts could |
162 | * completely exhaust the page allocator. __GFP_NOMEMALLOC | 168 | * completely exhaust the page allocator. __GFP_NOMEMALLOC |
diff --git a/mm/swapfile.c b/mm/swapfile.c index b6adcfbf6f48..07a458d72fa8 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -964,6 +964,8 @@ static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud, | |||
964 | pmd = pmd_offset(pud, addr); | 964 | pmd = pmd_offset(pud, addr); |
965 | do { | 965 | do { |
966 | next = pmd_addr_end(addr, end); | 966 | next = pmd_addr_end(addr, end); |
967 | if (unlikely(pmd_trans_huge(*pmd))) | ||
968 | continue; | ||
967 | if (pmd_none_or_clear_bad(pmd)) | 969 | if (pmd_none_or_clear_bad(pmd)) |
968 | continue; | 970 | continue; |
969 | ret = unuse_pte_range(vma, pmd, addr, next, entry, page); | 971 | ret = unuse_pte_range(vma, pmd, addr, next, entry, page); |