From: Christoph Lameter <clameter@sgi.com>
To: akpm@osdl.org
Cc: linux-mm@kvack.org,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Lee Schermerhorn <lee.schermerhorn@hp.com>,
Christoph Lameter <clameter@sgi.com>,
Hugh Dickins <hugh@veritas.com>
Subject: {PATCH 2/2} More PM: use migration entries for file pages
Date: Fri, 28 Apr 2006 20:23:48 -0700 (PDT) [thread overview]
Message-ID: <20060429032348.4999.11717.sendpatchset@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <20060429032246.4999.21714.sendpatchset@schroedinger.engr.sgi.com>
more page migration: Use migration entries for file backed pages
This implements the use of migration entries to preserve ptes of
file backed pages during migration. Processes can therefore
be migrated back and forth without loosing their connection to
pagecache pages.
Note that we implement the migration entries only for linear
mappings. Nonlinear mappings still require the unmapping of the ptes
for migration.
And another writepage() ugliness shows up. writepage() can drop
the page lock. Therefore we have to remove migration ptes
before calling writepages() in order to avoid having migration entries
point to unlocked pages.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Index: linux-2.6.17-rc3/mm/migrate.c
===================================================================
--- linux-2.6.17-rc3.orig/mm/migrate.c 2006-04-28 19:37:31.941975877 -0700
+++ linux-2.6.17-rc3/mm/migrate.c 2006-04-28 19:44:13.640685963 -0700
@@ -170,19 +170,44 @@
if (is_write_migration_entry(entry))
pte = pte_mkwrite(pte);
set_pte_at(mm, addr, ptep, pte);
- page_add_anon_rmap(new, vma, addr);
+
+ if (PageAnon(new))
+ page_add_anon_rmap(new, vma, addr);
+ else
+ page_add_file_rmap(new);
+
out:
pte_unmap_unlock(pte, ptl);
}
/*
- * Get rid of all migration entries and replace them by
- * references to the indicated page.
- *
+ * Note that remove_file_migration_ptes will only work on regular mappings
+ * specialized other mappings will simply be unmapped and do not use
+ * migration entries.
+ */
+static void remove_file_migration_ptes(struct page *old, struct page *new)
+{
+ struct vm_area_struct *vma;
+ struct address_space *mapping = page_mapping(new);
+ struct prio_tree_iter iter;
+ pgoff_t pgoff = new->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
+
+ if (!mapping)
+ return;
+
+ spin_lock(&mapping->i_mmap_lock);
+
+ vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff)
+ remove_migration_pte(vma, page_address_in_vma(new, vma), old, new);
+
+ spin_unlock(&mapping->i_mmap_lock);
+}
+
+/*
* Must hold mmap_sem lock on at least one of the vmas containing
* the page so that the anon_vma cannot vanish.
*/
-static void remove_migration_ptes(struct page *old, struct page *new)
+static void remove_anon_migration_ptes(struct page *old, struct page *new)
{
struct anon_vma *anon_vma;
struct vm_area_struct *vma;
@@ -207,6 +232,18 @@
}
/*
+ * Get rid of all migration entries and replace them by
+ * references to the indicated page.
+ */
+static void remove_migration_ptes(struct page *old, struct page *new)
+{
+ if (PageAnon(new))
+ remove_anon_migration_ptes(old, new);
+ else
+ remove_file_migration_ptes(old, new);
+}
+
+/*
* Something used the pte of a page under migration. We need to
* get to the page and wait until migration is finished.
* When we return from this function the fault will be retried.
@@ -438,20 +475,18 @@
* pages so try to write out any dirty pages first.
*/
if (PageDirty(page)) {
- switch (pageout(page, mapping)) {
- case PAGE_KEEP:
- case PAGE_ACTIVATE:
- return -EAGAIN;
+ /*
+ * Remove the migration entries because pageout() may
+ * unlock which may result in migration entries pointing
+ * to unlocked pages.
+ */
+ remove_migration_ptes(page, page);
- case PAGE_SUCCESS:
- /* Relock since we lost the lock */
+ if (pageout(page, mapping) == PAGE_SUCCESS)
+ /* unlocked. Relock */
lock_page(page);
- /* Must retry since page state may have changed */
- return -EAGAIN;
- case PAGE_CLEAN:
- ; /* try to migrate the page below */
- }
+ return -EAGAIN;
}
/*
Index: linux-2.6.17-rc3/mm/rmap.c
===================================================================
--- linux-2.6.17-rc3.orig/mm/rmap.c 2006-04-28 19:37:31.941975877 -0700
+++ linux-2.6.17-rc3/mm/rmap.c 2006-04-28 19:41:02.442586074 -0700
@@ -607,8 +607,14 @@
}
set_pte_at(mm, address, pte, swp_entry_to_pte(entry));
BUG_ON(pte_file(*pte));
- } else
+ } else if (!migration)
dec_mm_counter(mm, file_rss);
+ else {
+ /* Establish migration entry for a file page */
+ swp_entry_t entry;
+ entry = make_migration_entry(page, pte_write(pteval));
+ set_pte_at(mm, address, pte, swp_entry_to_pte(entry));
+ }
page_remove_rmap(page);
page_cache_release(page);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
prev parent reply other threads:[~2006-04-29 3:23 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-29 3:22 Page Migration patchsets overview Christoph Lameter
2006-04-29 3:22 ` [PATCH 1/7] PM cleanup: Rename "ignrefs" to "migration" Christoph Lameter
2006-04-29 3:22 ` [PATCH 2/7] PM cleanup: Group functions Christoph Lameter
2006-04-29 3:23 ` [PATCH 3/7] PM cleanup: Remove useless definitions Christoph Lameter
2006-04-29 3:23 ` [PATCH 4/7] PM cleanup: Drop nr_refs in remove_references() Christoph Lameter
2006-05-01 16:09 ` Lee Schermerhorn
2006-05-01 16:15 ` Christoph Lameter
2006-05-01 17:51 ` Lee Schermerhorn
2006-05-01 18:04 ` Christoph Lameter
2006-05-01 18:34 ` Lee Schermerhorn
2006-05-01 18:53 ` Christoph Lameter
2006-04-29 3:23 ` [PATCH 5/7] PM cleanup: Extract try_to_unmap from migration functions Christoph Lameter
2006-04-29 3:23 ` [PATCH 6/7] PM cleanup: Pass "mapping" to " Christoph Lameter
2006-04-29 3:23 ` [PATCH 7/7] PM cleanup: Move fallback handling into special function Christoph Lameter
2006-04-29 3:23 ` [PATCH 1/3] Swapless PM: add R/W migration entries Christoph Lameter
2006-04-29 3:23 ` [PATCH 2/3] Swapless PM: Rip out swap based logic Christoph Lameter
2006-04-29 3:23 ` [PATCH 3/3] Swapless PM: Modify core logic Christoph Lameter
2006-04-29 3:23 ` {PATCH 1/2} More PM: do not inc/dec rss counters Christoph Lameter
2006-04-29 3:23 ` Christoph Lameter [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060429032348.4999.11717.sendpatchset@schroedinger.engr.sgi.com \
--to=clameter@sgi.com \
--cc=akpm@osdl.org \
--cc=hugh@veritas.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=lee.schermerhorn@hp.com \
--cc=linux-mm@kvack.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).