Commit 5b5c7120 authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds

[PATCH] page migration cleanup: drop nr_refs in remove_references()

Drop nr_refs parameter from migrate_page_remove_references()

The nr_refs parameter is not really useful since the number of remaining
references is always

1 for anonymous pages without a mapping
2 for pages with a mapping
3 for pages with a mapping and PagePrivate set.

Remove the early check for the number of references since we are checking
page_mapcount() earlier.  Ultimately only the refcount matters after the
tree_lock has been obtained.
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.coim>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e7340f73
...@@ -168,19 +168,19 @@ retry: ...@@ -168,19 +168,19 @@ retry:
/* /*
* Remove references for a page and establish the new page with the correct * Remove references for a page and establish the new page with the correct
* basic settings to be able to stop accesses to the page. * basic settings to be able to stop accesses to the page.
*
* The number of remaining references must be:
* 1 for anonymous pages without a mapping
* 2 for pages with a mapping
* 3 for pages with a mapping and PagePrivate set.
*/ */
static int migrate_page_remove_references(struct page *newpage, static int migrate_page_remove_references(struct page *newpage,
struct page *page, int nr_refs) struct page *page)
{ {
struct address_space *mapping = page_mapping(page); struct address_space *mapping = page_mapping(page);
struct page **radix_pointer; struct page **radix_pointer;
/* if (!mapping)
* Avoid doing any of the following work if the page count
* indicates that the page is in use or truncate has removed
* the page.
*/
if (!mapping || page_mapcount(page) + nr_refs != page_count(page))
return -EAGAIN; return -EAGAIN;
/* /*
...@@ -218,7 +218,8 @@ static int migrate_page_remove_references(struct page *newpage, ...@@ -218,7 +218,8 @@ static int migrate_page_remove_references(struct page *newpage,
&mapping->page_tree, &mapping->page_tree,
page_index(page)); page_index(page));
if (!page_mapping(page) || page_count(page) != nr_refs || if (!page_mapping(page) ||
page_count(page) != 2 + !!PagePrivate(page) ||
*radix_pointer != page) { *radix_pointer != page) {
write_unlock_irq(&mapping->tree_lock); write_unlock_irq(&mapping->tree_lock);
return -EAGAIN; return -EAGAIN;
...@@ -309,7 +310,7 @@ int migrate_page(struct page *newpage, struct page *page) ...@@ -309,7 +310,7 @@ int migrate_page(struct page *newpage, struct page *page)
BUG_ON(PageWriteback(page)); /* Writeback must be complete */ BUG_ON(PageWriteback(page)); /* Writeback must be complete */
rc = migrate_page_remove_references(newpage, page, 2); rc = migrate_page_remove_references(newpage, page);
if (rc) if (rc)
return rc; return rc;
...@@ -348,7 +349,7 @@ int buffer_migrate_page(struct page *newpage, struct page *page) ...@@ -348,7 +349,7 @@ int buffer_migrate_page(struct page *newpage, struct page *page)
head = page_buffers(page); head = page_buffers(page);
rc = migrate_page_remove_references(newpage, page, 3); rc = migrate_page_remove_references(newpage, page);
if (rc) if (rc)
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment