[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>
This commit is contained in:
Christoph Lameter
2006-02-01 03:05:41 -08:00
committed by Linus Torvalds
parent 7e2ab150d1
commit e965f9630c
10 changed files with 100 additions and 1 deletions

View File

@@ -614,6 +614,15 @@ int putback_lru_pages(struct list_head *l)
return count;
}
/*
* Non migratable page
*/
int fail_migrate_page(struct page *newpage, struct page *page)
{
return -EIO;
}
EXPORT_SYMBOL(fail_migrate_page);
/*
* swapout a single page
* page is locked upon entry, unlocked on exit
@@ -659,6 +668,7 @@ unlock_retry:
retry:
return -EAGAIN;
}
EXPORT_SYMBOL(swap_page);
/*
* Page migration was first developed in the context of the memory hotplug
@@ -674,7 +684,7 @@ retry:
* Remove references for a page and establish the new page with the correct
* basic settings to be able to stop accesses to the page.
*/
static int migrate_page_remove_references(struct page *newpage,
int migrate_page_remove_references(struct page *newpage,
struct page *page, int nr_refs)
{
struct address_space *mapping = page_mapping(page);
@@ -749,6 +759,7 @@ static int migrate_page_remove_references(struct page *newpage,
return 0;
}
EXPORT_SYMBOL(migrate_page_remove_references);
/*
* Copy the page to its new location
@@ -788,6 +799,7 @@ void migrate_page_copy(struct page *newpage, struct page *page)
if (PageWriteback(newpage))
end_page_writeback(newpage);
}
EXPORT_SYMBOL(migrate_page_copy);
/*
* Common logic to directly migrate a single page suitable for
@@ -815,6 +827,7 @@ int migrate_page(struct page *newpage, struct page *page)
remove_from_swap(newpage);
return 0;
}
EXPORT_SYMBOL(migrate_page);
/*
* migrate_pages
@@ -914,6 +927,11 @@ redo:
if (!mapping)
goto unlock_both;
if (mapping->a_ops->migratepage) {
rc = mapping->a_ops->migratepage(newpage, page);
goto unlock_both;
}
/*
* Trigger writeout if page is dirty
*/