Loading mm/huge_memory.c +3 −28 Original line number Diff line number Diff line Loading @@ -1755,8 +1755,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, spinlock_t *ptl; struct mm_struct *mm = vma->vm_mm; unsigned long haddr = address & HPAGE_PMD_MASK; bool was_locked = false; pmd_t _pmd; mmu_notifier_invalidate_range_start(mm, haddr, haddr + HPAGE_PMD_SIZE); ptl = pmd_lock(mm, pmd); Loading @@ -1766,32 +1764,11 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, * pmd against. Otherwise we can end up replacing wrong page. */ VM_BUG_ON(freeze && !page); if (page) { VM_WARN_ON_ONCE(!PageLocked(page)); was_locked = true; if (page != pmd_page(*pmd)) if (page && page != pmd_page(*pmd)) goto out; } repeat: if (pmd_trans_huge(*pmd)) { if (!page) { page = pmd_page(*pmd); if (unlikely(!trylock_page(page))) { get_page(page); _pmd = *pmd; spin_unlock(ptl); lock_page(page); spin_lock(ptl); if (unlikely(!pmd_same(*pmd, _pmd))) { unlock_page(page); put_page(page); page = NULL; goto repeat; } put_page(page); } } if (PageMlocked(page)) clear_page_mlock(page); } else if (!pmd_devmap(*pmd)) Loading @@ -1799,8 +1776,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, __split_huge_pmd_locked(vma, pmd, haddr, freeze); out: spin_unlock(ptl); if (!was_locked && page) unlock_page(page); mmu_notifier_invalidate_range_end(mm, haddr, haddr + HPAGE_PMD_SIZE); } Loading Loading
mm/huge_memory.c +3 −28 Original line number Diff line number Diff line Loading @@ -1755,8 +1755,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, spinlock_t *ptl; struct mm_struct *mm = vma->vm_mm; unsigned long haddr = address & HPAGE_PMD_MASK; bool was_locked = false; pmd_t _pmd; mmu_notifier_invalidate_range_start(mm, haddr, haddr + HPAGE_PMD_SIZE); ptl = pmd_lock(mm, pmd); Loading @@ -1766,32 +1764,11 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, * pmd against. Otherwise we can end up replacing wrong page. */ VM_BUG_ON(freeze && !page); if (page) { VM_WARN_ON_ONCE(!PageLocked(page)); was_locked = true; if (page != pmd_page(*pmd)) if (page && page != pmd_page(*pmd)) goto out; } repeat: if (pmd_trans_huge(*pmd)) { if (!page) { page = pmd_page(*pmd); if (unlikely(!trylock_page(page))) { get_page(page); _pmd = *pmd; spin_unlock(ptl); lock_page(page); spin_lock(ptl); if (unlikely(!pmd_same(*pmd, _pmd))) { unlock_page(page); put_page(page); page = NULL; goto repeat; } put_page(page); } } if (PageMlocked(page)) clear_page_mlock(page); } else if (!pmd_devmap(*pmd)) Loading @@ -1799,8 +1776,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, __split_huge_pmd_locked(vma, pmd, haddr, freeze); out: spin_unlock(ptl); if (!was_locked && page) unlock_page(page); mmu_notifier_invalidate_range_end(mm, haddr, haddr + HPAGE_PMD_SIZE); } Loading