diff options
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 19 |
1 files changed, 8 insertions, 11 deletions
@@ -1706,8 +1706,7 @@ static struct anon_vma *rmap_walk_anon_lock(struct page *page) | |||
1706 | * rmap_walk() and its helpers rmap_walk_anon() and rmap_walk_file(): | 1706 | * rmap_walk() and its helpers rmap_walk_anon() and rmap_walk_file(): |
1707 | * Called by migrate.c to remove migration ptes, but might be used more later. | 1707 | * Called by migrate.c to remove migration ptes, but might be used more later. |
1708 | */ | 1708 | */ |
1709 | static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, | 1709 | static int rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc) |
1710 | struct vm_area_struct *, unsigned long, void *), void *arg) | ||
1711 | { | 1710 | { |
1712 | struct anon_vma *anon_vma; | 1711 | struct anon_vma *anon_vma; |
1713 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 1712 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
@@ -1721,7 +1720,7 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, | |||
1721 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { | 1720 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { |
1722 | struct vm_area_struct *vma = avc->vma; | 1721 | struct vm_area_struct *vma = avc->vma; |
1723 | unsigned long address = vma_address(page, vma); | 1722 | unsigned long address = vma_address(page, vma); |
1724 | ret = rmap_one(page, vma, address, arg); | 1723 | ret = rwc->rmap_one(page, vma, address, rwc->arg); |
1725 | if (ret != SWAP_AGAIN) | 1724 | if (ret != SWAP_AGAIN) |
1726 | break; | 1725 | break; |
1727 | } | 1726 | } |
@@ -1729,8 +1728,7 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, | |||
1729 | return ret; | 1728 | return ret; |
1730 | } | 1729 | } |
1731 | 1730 | ||
1732 | static int rmap_walk_file(struct page *page, int (*rmap_one)(struct page *, | 1731 | static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) |
1733 | struct vm_area_struct *, unsigned long, void *), void *arg) | ||
1734 | { | 1732 | { |
1735 | struct address_space *mapping = page->mapping; | 1733 | struct address_space *mapping = page->mapping; |
1736 | pgoff_t pgoff = page->index << compound_order(page); | 1734 | pgoff_t pgoff = page->index << compound_order(page); |
@@ -1742,7 +1740,7 @@ static int rmap_walk_file(struct page *page, int (*rmap_one)(struct page *, | |||
1742 | mutex_lock(&mapping->i_mmap_mutex); | 1740 | mutex_lock(&mapping->i_mmap_mutex); |
1743 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { | 1741 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
1744 | unsigned long address = vma_address(page, vma); | 1742 | unsigned long address = vma_address(page, vma); |
1745 | ret = rmap_one(page, vma, address, arg); | 1743 | ret = rwc->rmap_one(page, vma, address, rwc->arg); |
1746 | if (ret != SWAP_AGAIN) | 1744 | if (ret != SWAP_AGAIN) |
1747 | break; | 1745 | break; |
1748 | } | 1746 | } |
@@ -1755,17 +1753,16 @@ static int rmap_walk_file(struct page *page, int (*rmap_one)(struct page *, | |||
1755 | return ret; | 1753 | return ret; |
1756 | } | 1754 | } |
1757 | 1755 | ||
1758 | int rmap_walk(struct page *page, int (*rmap_one)(struct page *, | 1756 | int rmap_walk(struct page *page, struct rmap_walk_control *rwc) |
1759 | struct vm_area_struct *, unsigned long, void *), void *arg) | ||
1760 | { | 1757 | { |
1761 | VM_BUG_ON(!PageLocked(page)); | 1758 | VM_BUG_ON(!PageLocked(page)); |
1762 | 1759 | ||
1763 | if (unlikely(PageKsm(page))) | 1760 | if (unlikely(PageKsm(page))) |
1764 | return rmap_walk_ksm(page, rmap_one, arg); | 1761 | return rmap_walk_ksm(page, rwc); |
1765 | else if (PageAnon(page)) | 1762 | else if (PageAnon(page)) |
1766 | return rmap_walk_anon(page, rmap_one, arg); | 1763 | return rmap_walk_anon(page, rwc); |
1767 | else | 1764 | else |
1768 | return rmap_walk_file(page, rmap_one, arg); | 1765 | return rmap_walk_file(page, rwc); |
1769 | } | 1766 | } |
1770 | #endif /* CONFIG_MIGRATION */ | 1767 | #endif /* CONFIG_MIGRATION */ |
1771 | 1768 | ||