|
@@ -1097,7 +1097,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
|
|
|
* for an example see gup_get_pte in arch/x86/mm/gup.c
|
|
|
*/
|
|
|
pte_t pte = READ_ONCE(*ptep);
|
|
|
- struct page *page;
|
|
|
+ struct page *head, *page;
|
|
|
|
|
|
/*
|
|
|
* Similar to the PMD case below, NUMA hinting must take slow
|
|
@@ -1109,15 +1109,17 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
|
|
|
|
|
|
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
|
|
page = pte_page(pte);
|
|
|
+ head = compound_head(page);
|
|
|
|
|
|
- if (!page_cache_get_speculative(page))
|
|
|
+ if (!page_cache_get_speculative(head))
|
|
|
goto pte_unmap;
|
|
|
|
|
|
if (unlikely(pte_val(pte) != pte_val(*ptep))) {
|
|
|
- put_page(page);
|
|
|
+ put_page(head);
|
|
|
goto pte_unmap;
|
|
|
}
|
|
|
|
|
|
+ VM_BUG_ON_PAGE(compound_head(page) != head, page);
|
|
|
pages[*nr] = page;
|
|
|
(*nr)++;
|
|
|
|