aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-02-01 06:05:41 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-01 11:53:17 -0500
commite965f9630c651fa4249039fd4b80c9392d07a856 (patch)
tree1353dd536d0ee549c30e462086624c21788ee9d2 /mm/vmscan.c
parent7e2ab150d1b3b286a4c864c60a549b2601777b63 (diff)
[PATCH] Direct Migration V9: Avoid writeback / page_migrate() method
Migrate a page with buffers without requiring writeback This introduces a new address space operation migratepage() that may be used by a filesystem to implement its own version of page migration. A version is provided that migrates buffers attached to pages. Some filesystems (ext2, ext3, xfs) are modified to utilize this feature. The swapper address space operation are modified so that a regular migrate_page() will occur for anonymous pages without writeback (migrate_pages forces every anonymous page to have a swap entry). Signed-off-by: Mike Kravetz <kravetz@us.ibm.com> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 5e98b86feb74..5a610804cd06 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -615,6 +615,15 @@ int putback_lru_pages(struct list_head *l)
615} 615}
616 616
617/* 617/*
618 * Non migratable page
619 */
620int fail_migrate_page(struct page *newpage, struct page *page)
621{
622 return -EIO;
623}
624EXPORT_SYMBOL(fail_migrate_page);
625
626/*
618 * swapout a single page 627 * swapout a single page
619 * page is locked upon entry, unlocked on exit 628 * page is locked upon entry, unlocked on exit
620 */ 629 */
@@ -659,6 +668,7 @@ unlock_retry:
659retry: 668retry:
660 return -EAGAIN; 669 return -EAGAIN;
661} 670}
671EXPORT_SYMBOL(swap_page);
662 672
663/* 673/*
664 * Page migration was first developed in the context of the memory hotplug 674 * Page migration was first developed in the context of the memory hotplug
@@ -674,7 +684,7 @@ retry:
674 * Remove references for a page and establish the new page with the correct 684 * Remove references for a page and establish the new page with the correct
675 * basic settings to be able to stop accesses to the page. 685 * basic settings to be able to stop accesses to the page.
676 */ 686 */
677static int migrate_page_remove_references(struct page *newpage, 687int migrate_page_remove_references(struct page *newpage,
678 struct page *page, int nr_refs) 688 struct page *page, int nr_refs)
679{ 689{
680 struct address_space *mapping = page_mapping(page); 690 struct address_space *mapping = page_mapping(page);
@@ -749,6 +759,7 @@ static int migrate_page_remove_references(struct page *newpage,
749 759
750 return 0; 760 return 0;
751} 761}
762EXPORT_SYMBOL(migrate_page_remove_references);
752 763
753/* 764/*
754 * Copy the page to its new location 765 * Copy the page to its new location
@@ -788,6 +799,7 @@ void migrate_page_copy(struct page *newpage, struct page *page)
788 if (PageWriteback(newpage)) 799 if (PageWriteback(newpage))
789 end_page_writeback(newpage); 800 end_page_writeback(newpage);
790} 801}
802EXPORT_SYMBOL(migrate_page_copy);
791 803
792/* 804/*
793 * Common logic to directly migrate a single page suitable for 805 * Common logic to directly migrate a single page suitable for
@@ -815,6 +827,7 @@ int migrate_page(struct page *newpage, struct page *page)
815 remove_from_swap(newpage); 827 remove_from_swap(newpage);
816 return 0; 828 return 0;
817} 829}
830EXPORT_SYMBOL(migrate_page);
818 831
819/* 832/*
820 * migrate_pages 833 * migrate_pages
@@ -914,6 +927,11 @@ redo:
914 if (!mapping) 927 if (!mapping)
915 goto unlock_both; 928 goto unlock_both;
916 929
930 if (mapping->a_ops->migratepage) {
931 rc = mapping->a_ops->migratepage(newpage, page);
932 goto unlock_both;
933 }
934
917 /* 935 /*
918 * Trigger writeout if page is dirty 936 * Trigger writeout if page is dirty
919 */ 937 */