From: Christoph Lameter <clameter@sgi.com>
To: Andrew Morton <akpm@osdl.org>
Cc: hugh@veritas.com, linux-kernel@vger.kernel.org,
lee.schermerhorn@hp.com, linux-mm@kvack.org, taka@valinux.co.jp,
marcelo.tosatti@cyclades.com, kamezawa.hiroyu@jp.fujitsu.com
Subject: Wait for migrating page after incr of page count under anon_vma lock
Date: Fri, 14 Apr 2006 14:51:04 -0700 (PDT) [thread overview]
Message-ID: <Pine.LNX.4.64.0604141417170.22852@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <20060414125320.72599c7e.akpm@osdl.org>
Another patch that considers the need to prevent the freeing of the page
and the pte while incrementing the page count.
Wait for migrating page after incr of page count under anon_vma lock
This patch replaces the yield() in do_swap_page with a call to
migration_entry_wait() in the migration code.
migration_entry_wait() locks the anonymous vma of the page and then
safely increments page count before waiting for the page to become
unlocked.
Migration entries are only removed while holding the anon_vma lock
(See remove_migration_ptes). Therefore we can be sure that the
migration pte is not modified and the underlying page is not
removed while holding this lock.
Also make is_migration_entry() unlikely and clean up a unnecessary
BUG_ON.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Index: linux-2.6.17-rc1-mm2/mm/memory.c
===================================================================
--- linux-2.6.17-rc1-mm2.orig/mm/memory.c 2006-04-13 16:43:10.000000000 -0700
+++ linux-2.6.17-rc1-mm2/mm/memory.c 2006-04-14 13:57:44.000000000 -0700
@@ -1880,8 +1880,8 @@ static int do_swap_page(struct mm_struct
entry = pte_to_swp_entry(orig_pte);
- if (unlikely(is_migration_entry(entry))) {
- yield();
+ if (is_migration_entry(entry)) {
+ migration_entry_wait(entry, page_table);
goto out;
}
Index: linux-2.6.17-rc1-mm2/include/linux/swapops.h
===================================================================
--- linux-2.6.17-rc1-mm2.orig/include/linux/swapops.h 2006-04-13 16:43:10.000000000 -0700
+++ linux-2.6.17-rc1-mm2/include/linux/swapops.h 2006-04-14 13:57:44.000000000 -0700
@@ -77,7 +77,7 @@ static inline swp_entry_t make_migration
static inline int is_migration_entry(swp_entry_t entry)
{
- return swp_type(entry) == SWP_TYPE_MIGRATION;
+ return unlikely(swp_type(entry) == SWP_TYPE_MIGRATION);
}
static inline struct page *migration_entry_to_page(swp_entry_t entry)
@@ -88,14 +88,16 @@ static inline struct page *migration_ent
* corresponding page is locked
*/
BUG_ON(!PageLocked(p));
- BUG_ON(!is_migration_entry(entry));
return p;
}
+
+extern void migration_entry_wait(swp_entry_t, pte_t *);
#else
#define make_migration_entry(page) swp_entry(0, 0)
#define is_migration_entry(swp) 0
#define migration_entry_to_page(swp) NULL
+static inline void migration_entry_wait(swp_entry_t entry, pte_t *ptep) { }
#endif
Index: linux-2.6.17-rc1-mm2/mm/migrate.c
===================================================================
--- linux-2.6.17-rc1-mm2.orig/mm/migrate.c 2006-04-13 16:44:07.000000000 -0700
+++ linux-2.6.17-rc1-mm2/mm/migrate.c 2006-04-14 14:27:06.000000000 -0700
@@ -174,6 +174,57 @@ out:
}
/*
+ * 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.
+ *
+ * This function is called from do_swap_page().
+ */
+void migration_entry_wait(swp_entry_t entry, pte_t *ptep)
+{
+ struct page *page = migration_entry_to_page(entry);
+ unsigned long mapping = (unsigned long)page->mapping;
+ struct anon_vma *anon_vma;
+ pte_t pte;
+
+ if (!mapping ||
+ (mapping & PAGE_MAPPING_ANON) == 0)
+ return;
+ /*
+ * We hold the mmap_sem lock.
+ */
+ anon_vma = (struct anon_vma *) (mapping - PAGE_MAPPING_ANON);
+
+ /*
+ * The anon_vma lock is also taken while removing the migration
+ * entries. Take the lock here to insure that the migration pte
+ * is not modified while we increment the page count.
+ * This is similar to find_get_page().
+ */
+ spin_lock(&anon_vma->lock);
+ pte = *ptep;
+ if (pte_present(pte) || pte_none(pte) || pte_file(pte)) {
+ spin_unlock(&anon_vma->lock);
+ return;
+ }
+ entry = pte_to_swp_entry(pte);
+ if (!is_migration_entry(entry) ||
+ migration_entry_to_page(entry) != page) {
+ /* Migration entry is gone */
+ spin_unlock(&anon_vma->lock);
+ return;
+ }
+ /* Pages with migration entries must be locked */
+ BUG_ON(!PageLocked(page));
+
+ /* Phew. Finally we can increment the refcount */
+ get_page(page);
+ spin_unlock(&anon_vma->lock);
+ wait_on_page_locked(page);
+ put_page(page);
+}
+
+/*
* Get rid of all migration entries and replace them by
* references to the indicated 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>
next prev parent reply other threads:[~2006-04-14 21:51 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-13 23:54 [PATCH 0/5] Swapless page migration V2: Overview Christoph Lameter
2006-04-13 23:54 ` [PATCH 1/5] Swapless V2: try_to_unmap() - Rename ignrefs to "migration" Christoph Lameter
2006-04-13 23:54 ` [PATCH 2/5] Swapless V2: Add migration swap entries Christoph Lameter
2006-04-14 0:13 ` Andrew Morton
2006-04-14 0:29 ` Christoph Lameter
2006-04-14 0:42 ` Andrew Morton
2006-04-14 0:46 ` Christoph Lameter
2006-04-14 1:01 ` Andrew Morton
2006-04-14 1:17 ` Andrew Morton
2006-04-14 1:31 ` Christoph Lameter
2006-04-14 5:25 ` Andrew Morton
2006-04-14 14:27 ` Lee Schermerhorn
2006-04-14 16:01 ` Christoph Lameter
2006-04-14 1:31 ` Christoph Lameter
2006-04-14 5:29 ` Andrew Morton
2006-04-14 17:28 ` Implement lookup_swap_cache for migration entries Christoph Lameter
2006-04-14 18:31 ` Andrew Morton
2006-04-14 18:48 ` Christoph Lameter
2006-04-14 19:15 ` Andrew Morton
2006-04-14 19:22 ` Christoph Lameter
2006-04-14 19:53 ` Andrew Morton
2006-04-14 20:12 ` Christoph Lameter
2006-04-14 21:51 ` Christoph Lameter [this message]
2006-04-17 23:52 ` migration_entry_wait: Use the pte lock instead of the anon_vma lock Christoph Lameter
2006-04-14 0:36 ` [PATCH 2/5] Swapless V2: Add migration swap entries Christoph Lameter
2006-04-13 23:54 ` [PATCH 3/5] Swapless V2: Make try_to_unmap() create migration entries Christoph Lameter
2006-04-13 23:54 ` [PATCH 4/5] Swapless V2: Rip out swap portion of old migration code Christoph Lameter
2006-04-13 23:54 ` [PATCH 5/5] Swapless V2: Revise main migration logic Christoph Lameter
2006-04-14 1:19 ` KAMEZAWA Hiroyuki
2006-04-14 1:33 ` Christoph Lameter
2006-04-14 1:40 ` KAMEZAWA Hiroyuki
2006-04-14 2:34 ` KAMEZAWA Hiroyuki
2006-04-14 2:44 ` KAMEZAWA Hiroyuki
2006-04-14 17:29 ` Preserve write permissions in migration entries Christoph Lameter
2006-04-14 16:48 ` [PATCH 5/5] Swapless V2: Revise main migration logic Christoph Lameter
2006-04-15 0:06 ` KAMEZAWA Hiroyuki
2006-04-15 17:41 ` Christoph Lameter
2006-04-17 0:18 ` KAMEZAWA Hiroyuki
2006-04-17 17:00 ` Christoph Lameter
2006-04-18 0:04 ` KAMEZAWA Hiroyuki
2006-04-18 0:27 ` Christoph Lameter
2006-04-18 0:42 ` KAMEZAWA Hiroyuki
2006-04-18 1:57 ` Christoph Lameter
2006-04-18 3:00 ` KAMEZAWA Hiroyuki
2006-04-18 3:16 ` Christoph Lameter
2006-04-18 3:32 ` KAMEZAWA Hiroyuki
2006-04-18 6:58 ` Christoph Lameter
2006-04-18 8:05 ` KAMEZAWA Hiroyuki
2006-04-18 8:27 ` Christoph Lameter
2006-04-18 9:08 ` KAMEZAWA Hiroyuki
2006-04-18 16:49 ` Christoph Lameter
2006-04-14 0:08 ` [PATCH 0/5] Swapless page migration V2: Overview Andrew Morton
2006-04-14 0:27 ` Christoph Lameter
2006-04-14 14:14 ` Lee Schermerhorn
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=Pine.LNX.4.64.0604141417170.22852@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-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=marcelo.tosatti@cyclades.com \
--cc=taka@valinux.co.jp \
/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).