+ more-page-migration-use-migration-entries-for-file-pages.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled

     More page migration: use migration entries for file pages

has been added to the -mm tree.  Its filename is

     more-page-migration-use-migration-entries-for-file-pages.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this


From: Christoph Lameter <clameter@xxxxxxx>

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@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 mm/migrate.c |   67 +++++++++++++++++++++++++++++++++++++------------
 mm/rmap.c    |    8 +++++
 2 files changed, 58 insertions(+), 17 deletions(-)

diff -puN mm/migrate.c~more-page-migration-use-migration-entries-for-file-pages mm/migrate.c
--- devel/mm/migrate.c~more-page-migration-use-migration-entries-for-file-pages	2006-04-29 00:21:00.000000000 -0700
+++ devel-akpm/mm/migrate.c	2006-04-29 00:21:00.000000000 -0700
@@ -170,19 +170,44 @@ static void remove_migration_pte(struct 
 	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 @@ static void remove_migration_ptes(struct
 }
 
 /*
+ * 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 @@ static int fallback_migrate_page(struct 
 	 * 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;
 	}
 
 	/*
diff -puN mm/rmap.c~more-page-migration-use-migration-entries-for-file-pages mm/rmap.c
--- devel/mm/rmap.c~more-page-migration-use-migration-entries-for-file-pages	2006-04-29 00:21:00.000000000 -0700
+++ devel-akpm/mm/rmap.c	2006-04-29 00:21:00.000000000 -0700
@@ -607,8 +607,14 @@ static int try_to_unmap_one(struct page 
 		}
 		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);
_

Patches currently in -mm which might be from clameter@xxxxxxx are

origin.patch
page-migration-fix-fallback-behavior-for-dirty-pages.patch
page-migration-make-do_swap_page-redo-the-fault.patch
slab-extract-cache_free_alien-from-__cache_free.patch
migration-remove-unnecessary-pageswapcache-checks.patch
page-migration-cleanup-rename-ignrefs-to-migration.patch
page-migration-cleanup-group-functions.patch
page-migration-cleanup-remove-useless-definitions.patch
page-migration-cleanup-drop-nr_refs-in-remove_references.patch
page-migration-cleanup-extract-try_to_unmap-from-migration-functions.patch
page-migration-cleanup-pass-mapping-to-migration-functions.patch
page-migration-cleanup-move-fallback-handling-into-special-function.patch
swapless-pm-add-r-w-migration-entries.patch
swapless-page-migration-rip-out-swap-based-logic.patch
swapless-page-migration-modify-core-logic.patch
more-page-migration-do-not-inc-dec-rss-counters.patch
more-page-migration-use-migration-entries-for-file-pages.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux