Merge branch 'x86/urgent' into x86/mm, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
このコミットが含まれているのは:
31
mm/gup.c
31
mm/gup.c
@@ -234,6 +234,16 @@ static struct page *follow_pmd_mask(struct vm_area_struct *vma,
|
||||
return page;
|
||||
return no_page_table(vma, flags);
|
||||
}
|
||||
retry:
|
||||
if (!pmd_present(*pmd)) {
|
||||
if (likely(!(flags & FOLL_MIGRATION)))
|
||||
return no_page_table(vma, flags);
|
||||
VM_BUG_ON(thp_migration_supported() &&
|
||||
!is_pmd_migration_entry(*pmd));
|
||||
if (is_pmd_migration_entry(*pmd))
|
||||
pmd_migration_entry_wait(mm, pmd);
|
||||
goto retry;
|
||||
}
|
||||
if (pmd_devmap(*pmd)) {
|
||||
ptl = pmd_lock(mm, pmd);
|
||||
page = follow_devmap_pmd(vma, address, pmd, flags);
|
||||
@@ -247,7 +257,15 @@ static struct page *follow_pmd_mask(struct vm_area_struct *vma,
|
||||
if ((flags & FOLL_NUMA) && pmd_protnone(*pmd))
|
||||
return no_page_table(vma, flags);
|
||||
|
||||
retry_locked:
|
||||
ptl = pmd_lock(mm, pmd);
|
||||
if (unlikely(!pmd_present(*pmd))) {
|
||||
spin_unlock(ptl);
|
||||
if (likely(!(flags & FOLL_MIGRATION)))
|
||||
return no_page_table(vma, flags);
|
||||
pmd_migration_entry_wait(mm, pmd);
|
||||
goto retry_locked;
|
||||
}
|
||||
if (unlikely(!pmd_trans_huge(*pmd))) {
|
||||
spin_unlock(ptl);
|
||||
return follow_page_pte(vma, address, pmd, flags);
|
||||
@@ -424,7 +442,7 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address,
|
||||
pud = pud_offset(p4d, address);
|
||||
BUG_ON(pud_none(*pud));
|
||||
pmd = pmd_offset(pud, address);
|
||||
if (pmd_none(*pmd))
|
||||
if (!pmd_present(*pmd))
|
||||
return -EFAULT;
|
||||
VM_BUG_ON(pmd_trans_huge(*pmd));
|
||||
pte = pte_offset_map(pmd, address);
|
||||
@@ -438,6 +456,13 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address,
|
||||
if ((gup_flags & FOLL_DUMP) || !is_zero_pfn(pte_pfn(*pte)))
|
||||
goto unmap;
|
||||
*page = pte_page(*pte);
|
||||
|
||||
/*
|
||||
* This should never happen (a device public page in the gate
|
||||
* area).
|
||||
*/
|
||||
if (is_device_public_page(*page))
|
||||
goto unmap;
|
||||
}
|
||||
get_page(*page);
|
||||
out:
|
||||
@@ -1352,7 +1377,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
|
||||
}
|
||||
#endif /* __HAVE_ARCH_PTE_SPECIAL */
|
||||
|
||||
#ifdef __HAVE_ARCH_PTE_DEVMAP
|
||||
#if defined(__HAVE_ARCH_PTE_DEVMAP) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
|
||||
static int __gup_device_huge(unsigned long pfn, unsigned long addr,
|
||||
unsigned long end, struct page **pages, int *nr)
|
||||
{
|
||||
@@ -1534,7 +1559,7 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
|
||||
pmd_t pmd = READ_ONCE(*pmdp);
|
||||
|
||||
next = pmd_addr_end(addr, end);
|
||||
if (pmd_none(pmd))
|
||||
if (!pmd_present(pmd))
|
||||
return 0;
|
||||
|
||||
if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd))) {
|
||||
|
新しいイシューから参照
ユーザーをブロックする