diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index bccd5a628ea6..33a5dc492810 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1481,8 +1481,18 @@ int move_huge_pmd(struct vm_area_struct *vma, struct vm_area_struct *new_vma, | |||
1481 | pmd = pmdp_get_and_clear(mm, old_addr, old_pmd); | 1481 | pmd = pmdp_get_and_clear(mm, old_addr, old_pmd); |
1482 | VM_BUG_ON(!pmd_none(*new_pmd)); | 1482 | VM_BUG_ON(!pmd_none(*new_pmd)); |
1483 | set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd)); | 1483 | set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd)); |
1484 | if (new_ptl != old_ptl) | 1484 | if (new_ptl != old_ptl) { |
1485 | pgtable_t pgtable; | ||
1486 | |||
1487 | /* | ||
1488 | * Move preallocated PTE page table if new_pmd is on | ||
1489 | * different PMD page table. | ||
1490 | */ | ||
1491 | pgtable = pgtable_trans_huge_withdraw(mm, old_pmd); | ||
1492 | pgtable_trans_huge_deposit(mm, new_pmd, pgtable); | ||
1493 | |||
1485 | spin_unlock(new_ptl); | 1494 | spin_unlock(new_ptl); |
1495 | } | ||
1486 | spin_unlock(old_ptl); | 1496 | spin_unlock(old_ptl); |
1487 | } | 1497 | } |
1488 | out: | 1498 | out: |