diff options
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index 521ef9b6064f..178130880b90 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -1517,7 +1517,7 @@ static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud, | |||
1517 | return 0; | 1517 | return 0; |
1518 | } | 1518 | } |
1519 | 1519 | ||
1520 | static inline int unuse_pud_range(struct vm_area_struct *vma, pgd_t *pgd, | 1520 | static inline int unuse_pud_range(struct vm_area_struct *vma, p4d_t *p4d, |
1521 | unsigned long addr, unsigned long end, | 1521 | unsigned long addr, unsigned long end, |
1522 | swp_entry_t entry, struct page *page) | 1522 | swp_entry_t entry, struct page *page) |
1523 | { | 1523 | { |
@@ -1525,7 +1525,7 @@ static inline int unuse_pud_range(struct vm_area_struct *vma, pgd_t *pgd, | |||
1525 | unsigned long next; | 1525 | unsigned long next; |
1526 | int ret; | 1526 | int ret; |
1527 | 1527 | ||
1528 | pud = pud_offset(pgd, addr); | 1528 | pud = pud_offset(p4d, addr); |
1529 | do { | 1529 | do { |
1530 | next = pud_addr_end(addr, end); | 1530 | next = pud_addr_end(addr, end); |
1531 | if (pud_none_or_clear_bad(pud)) | 1531 | if (pud_none_or_clear_bad(pud)) |
@@ -1537,6 +1537,26 @@ static inline int unuse_pud_range(struct vm_area_struct *vma, pgd_t *pgd, | |||
1537 | return 0; | 1537 | return 0; |
1538 | } | 1538 | } |
1539 | 1539 | ||
1540 | static inline int unuse_p4d_range(struct vm_area_struct *vma, pgd_t *pgd, | ||
1541 | unsigned long addr, unsigned long end, | ||
1542 | swp_entry_t entry, struct page *page) | ||
1543 | { | ||
1544 | p4d_t *p4d; | ||
1545 | unsigned long next; | ||
1546 | int ret; | ||
1547 | |||
1548 | p4d = p4d_offset(pgd, addr); | ||
1549 | do { | ||
1550 | next = p4d_addr_end(addr, end); | ||
1551 | if (p4d_none_or_clear_bad(p4d)) | ||
1552 | continue; | ||
1553 | ret = unuse_pud_range(vma, p4d, addr, next, entry, page); | ||
1554 | if (ret) | ||
1555 | return ret; | ||
1556 | } while (p4d++, addr = next, addr != end); | ||
1557 | return 0; | ||
1558 | } | ||
1559 | |||
1540 | static int unuse_vma(struct vm_area_struct *vma, | 1560 | static int unuse_vma(struct vm_area_struct *vma, |
1541 | swp_entry_t entry, struct page *page) | 1561 | swp_entry_t entry, struct page *page) |
1542 | { | 1562 | { |
@@ -1560,7 +1580,7 @@ static int unuse_vma(struct vm_area_struct *vma, | |||
1560 | next = pgd_addr_end(addr, end); | 1580 | next = pgd_addr_end(addr, end); |
1561 | if (pgd_none_or_clear_bad(pgd)) | 1581 | if (pgd_none_or_clear_bad(pgd)) |
1562 | continue; | 1582 | continue; |
1563 | ret = unuse_pud_range(vma, pgd, addr, next, entry, page); | 1583 | ret = unuse_p4d_range(vma, pgd, addr, next, entry, page); |
1564 | if (ret) | 1584 | if (ret) |
1565 | return ret; | 1585 | return ret; |
1566 | } while (pgd++, addr = next, addr != end); | 1586 | } while (pgd++, addr = next, addr != end); |