diff options
-rw-r--r-- | mm/gup.c | 2 | ||||
-rw-r--r-- | mm/mempolicy.c | 2 | ||||
-rw-r--r-- | mm/mprotect.c | 2 | ||||
-rw-r--r-- | mm/mremap.c | 3 |
4 files changed, 6 insertions, 3 deletions
@@ -279,6 +279,8 @@ struct page *follow_page_mask(struct vm_area_struct *vma, | |||
279 | spin_unlock(ptl); | 279 | spin_unlock(ptl); |
280 | ret = 0; | 280 | ret = 0; |
281 | split_huge_pmd(vma, pmd, address); | 281 | split_huge_pmd(vma, pmd, address); |
282 | if (pmd_trans_unstable(pmd)) | ||
283 | ret = -EBUSY; | ||
282 | } else { | 284 | } else { |
283 | get_page(page); | 285 | get_page(page); |
284 | spin_unlock(ptl); | 286 | spin_unlock(ptl); |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 297d6854f849..fe90e5051012 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -512,6 +512,8 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr, | |||
512 | } | 512 | } |
513 | } | 513 | } |
514 | 514 | ||
515 | if (pmd_trans_unstable(pmd)) | ||
516 | return 0; | ||
515 | retry: | 517 | retry: |
516 | pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); | 518 | pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); |
517 | for (; addr != end; pte++, addr += PAGE_SIZE) { | 519 | for (; addr != end; pte++, addr += PAGE_SIZE) { |
diff --git a/mm/mprotect.c b/mm/mprotect.c index 5019a1ef2848..a4830f0325fe 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c | |||
@@ -163,7 +163,7 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma, | |||
163 | if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd)) { | 163 | if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd)) { |
164 | if (next - addr != HPAGE_PMD_SIZE) { | 164 | if (next - addr != HPAGE_PMD_SIZE) { |
165 | split_huge_pmd(vma, pmd, addr); | 165 | split_huge_pmd(vma, pmd, addr); |
166 | if (pmd_none(*pmd)) | 166 | if (pmd_trans_unstable(pmd)) |
167 | continue; | 167 | continue; |
168 | } else { | 168 | } else { |
169 | int nr_ptes = change_huge_pmd(vma, pmd, addr, | 169 | int nr_ptes = change_huge_pmd(vma, pmd, addr, |
diff --git a/mm/mremap.c b/mm/mremap.c index 1f157adfdaf9..da22ad2a5678 100644 --- a/mm/mremap.c +++ b/mm/mremap.c | |||
@@ -210,9 +210,8 @@ unsigned long move_page_tables(struct vm_area_struct *vma, | |||
210 | } | 210 | } |
211 | } | 211 | } |
212 | split_huge_pmd(vma, old_pmd, old_addr); | 212 | split_huge_pmd(vma, old_pmd, old_addr); |
213 | if (pmd_none(*old_pmd)) | 213 | if (pmd_trans_unstable(old_pmd)) |
214 | continue; | 214 | continue; |
215 | VM_BUG_ON(pmd_trans_huge(*old_pmd)); | ||
216 | } | 215 | } |
217 | if (pte_alloc(new_vma->vm_mm, new_pmd, new_addr)) | 216 | if (pte_alloc(new_vma->vm_mm, new_pmd, new_addr)) |
218 | break; | 217 | break; |