aboutsummaryrefslogtreecommitdiffstats
path: root/mm/rmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/rmap.c')
-rw-r--r--mm/rmap.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/mm/rmap.c b/mm/rmap.c
index 5a79bf585e27..f8f10ad5d359 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -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 */
1709static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, 1709static 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
1732static int rmap_walk_file(struct page *page, int (*rmap_one)(struct page *, 1731static 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
1758int rmap_walk(struct page *page, int (*rmap_one)(struct page *, 1756int 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