diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 64635f5278ff..b4b1feba6472 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1536,16 +1536,23 @@ pmd_t *page_check_address_pmd(struct page *page, | |||
1536 | enum page_check_address_pmd_flag flag, | 1536 | enum page_check_address_pmd_flag flag, |
1537 | spinlock_t **ptl) | 1537 | spinlock_t **ptl) |
1538 | { | 1538 | { |
1539 | pgd_t *pgd; | ||
1540 | pud_t *pud; | ||
1539 | pmd_t *pmd; | 1541 | pmd_t *pmd; |
1540 | 1542 | ||
1541 | if (address & ~HPAGE_PMD_MASK) | 1543 | if (address & ~HPAGE_PMD_MASK) |
1542 | return NULL; | 1544 | return NULL; |
1543 | 1545 | ||
1544 | pmd = mm_find_pmd(mm, address); | 1546 | pgd = pgd_offset(mm, address); |
1545 | if (!pmd) | 1547 | if (!pgd_present(*pgd)) |
1546 | return NULL; | 1548 | return NULL; |
1549 | pud = pud_offset(pgd, address); | ||
1550 | if (!pud_present(*pud)) | ||
1551 | return NULL; | ||
1552 | pmd = pmd_offset(pud, address); | ||
1553 | |||
1547 | *ptl = pmd_lock(mm, pmd); | 1554 | *ptl = pmd_lock(mm, pmd); |
1548 | if (pmd_none(*pmd)) | 1555 | if (!pmd_present(*pmd)) |
1549 | goto unlock; | 1556 | goto unlock; |
1550 | if (pmd_page(*pmd) != page) | 1557 | if (pmd_page(*pmd) != page) |
1551 | goto unlock; | 1558 | goto unlock; |