linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Lameter <clameter@sgi.com>
To: akpm@osdl.org
Cc: Mike Kravetz <kravetz@us.ibm.com>,
	linux-kernel@vger.kernel.org, Dave Hansen <haveblue@us.ibm.com>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	linux-mm@kvack.org, torvalds@osdl.org,
	Christoph Lameter <clameter@sgi.com>,
	Hirokazu Takahashi <taka@valinux.co.jp>,
	Magnus Damm <magnus.damm@gmail.com>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Paul Jackson <pj@sgi.com>,
	Marcelo Tosatti <marcelo.tosatti@cyclades.com>,
	Andi Kleen <ak@suse.de>
Subject: [PATCH 4/8] Direct Migration V2: remove_from_swap() to remove swap ptes
Date: Tue, 8 Nov 2005 13:03:57 -0800 (PST)	[thread overview]
Message-ID: <20051108210347.31330.19192.sendpatchset@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <20051108210246.31330.61756.sendpatchset@schroedinger.engr.sgi.com>

Add remove_from_swap

remove_from_swap() allows the restoration of the pte entries that existed
before page migration occurred for anonymous pages by walking the reverse
maps. This reduces swap use and establishes regular pte's without the need
for page faults.

It may also fix a leak of swap entries that could occur if a page
is freed without locking it first (zap_pte_range?) while migration occurs.

Signed-off-by: Christoph Lameter <clameter@sgi.com>

Index: linux-2.6.14-mm1/include/linux/swap.h
===================================================================
--- linux-2.6.14-mm1.orig/include/linux/swap.h	2005-11-08 10:15:02.000000000 -0800
+++ linux-2.6.14-mm1/include/linux/swap.h	2005-11-08 10:16:58.000000000 -0800
@@ -266,6 +266,7 @@ extern int remove_exclusive_swap_page(st
 struct backing_dev_info;
 
 extern spinlock_t swap_lock;
+extern int unuse_vma(struct vm_area_struct *vma, swp_entry_t entry, struct page *page);
 
 /* linux/mm/thrash.c */
 extern struct mm_struct * swap_token_mm;
Index: linux-2.6.14-mm1/mm/swapfile.c
===================================================================
--- linux-2.6.14-mm1.orig/mm/swapfile.c	2005-11-08 10:15:00.000000000 -0800
+++ linux-2.6.14-mm1/mm/swapfile.c	2005-11-08 10:16:58.000000000 -0800
@@ -477,7 +477,7 @@ static inline int unuse_pud_range(struct
 	return 0;
 }
 
-static int unuse_vma(struct vm_area_struct *vma,
+int unuse_vma(struct vm_area_struct *vma,
 				swp_entry_t entry, struct page *page)
 {
 	pgd_t *pgd;
Index: linux-2.6.14-mm1/mm/rmap.c
===================================================================
--- linux-2.6.14-mm1.orig/mm/rmap.c	2005-11-07 11:48:08.000000000 -0800
+++ linux-2.6.14-mm1/mm/rmap.c	2005-11-08 10:16:58.000000000 -0800
@@ -206,6 +206,25 @@ out:
 }
 
 /*
+ * Remove an anonymous page from swap replacing the swap pte's
+ * through real pte's pointing to valid pages.
+ */
+void remove_from_swap(struct page *page)
+{
+	struct anon_vma *anon_vma;
+	struct vm_area_struct *vma;
+
+	anon_vma = page_lock_anon_vma(page);
+	if (!anon_vma)
+		return;
+	list_for_each_entry(vma, &anon_vma->head, anon_vma_node) {
+		swp_entry_t entry = { .val = page_private(page) };
+
+		unuse_vma(vma, entry, page);
+	}
+}
+
+/*
  * At what user virtual address is page expected in vma?
  */
 static inline unsigned long
Index: linux-2.6.14-mm1/include/linux/rmap.h
===================================================================
--- linux-2.6.14-mm1.orig/include/linux/rmap.h	2005-11-07 11:48:08.000000000 -0800
+++ linux-2.6.14-mm1/include/linux/rmap.h	2005-11-08 10:16:58.000000000 -0800
@@ -91,6 +91,7 @@ static inline void page_dup_rmap(struct 
  */
 int page_referenced(struct page *, int is_locked, int ignore_token);
 int try_to_unmap(struct page *);
+void remove_from_swap(struct page *page);
 
 /*
  * Called from mm/filemap_xip.c to unmap empty zero page
Index: linux-2.6.14-mm1/mm/vmscan.c
===================================================================
--- linux-2.6.14-mm1.orig/mm/vmscan.c	2005-11-08 10:16:53.000000000 -0800
+++ linux-2.6.14-mm1/mm/vmscan.c	2005-11-08 10:16:58.000000000 -0800
@@ -959,12 +959,15 @@ next:
 
 		else if (rc) {
 			/* Permanent failure to migrate the page */
+			remove_from_swap(page);
 			list_move(&page->lru, failed);
 			nr_failed++;
 		}
-		else if (newpage) {
-			/* Successful migration. Return new page to LRU */
-			move_to_lru(newpage);
+		else {
+			if (newpage) {
+				remove_from_swap(newpage);
+				move_to_lru(newpage);
+			}
 			list_move(&page->lru, moved);
 		}
 	}

--
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>

  parent reply	other threads:[~2005-11-08 21:03 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-08 21:02 [PATCH 0/8] Direct Migration V2: Overview Christoph Lameter
2005-11-08 21:03 ` [PATCH 1/8] Direct Migration V2: Swap migration patchset fixes Christoph Lameter
2005-11-08 21:03 ` [PATCH 2/8] Direct Migration V2: PageSwapCache checks Christoph Lameter
2005-11-08 21:03 ` [PATCH 3/8] Direct Migration V2: migrate_pages() extension Christoph Lameter
2005-11-08 21:03 ` Christoph Lameter [this message]
2005-11-08 21:04 ` [PATCH 5/8] Direct Migration V2: upgrade MPOL_MF_MOVE and sys_migrate_pages() Christoph Lameter
2005-11-09  1:35   ` KAMEZAWA Hiroyuki
2005-11-09  3:23     ` Christoph Lameter
2005-11-09  3:59       ` KAMEZAWA Hiroyuki
2005-11-09 16:50         ` Christoph Lameter
2005-11-08 21:04 ` [PATCH 6/8] Direct Migration V2: Avoid writeback / page_migrate() method Christoph Lameter
2005-11-09 11:01   ` Nikita Danilov
2005-11-09 17:07     ` Christoph Lameter
2005-11-09 17:20       ` Nikita Danilov
2005-11-09 19:14         ` Christoph Lameter
2005-11-08 21:04 ` [PATCH 7/8] Direct Migration V2: add_to_swap() with additional gfp_t parameter Christoph Lameter
2005-11-08 21:04 ` [PATCH 8/8] Direct Migration V2: SWAP_REFERENCE for try_to_unmap() Christoph Lameter

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=20051108210347.31330.19192.sendpatchset@schroedinger.engr.sgi.com \
    --to=clameter@sgi.com \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=haveblue@us.ibm.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kravetz@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=magnus.damm@gmail.com \
    --cc=marcelo.tosatti@cyclades.com \
    --cc=nickpiggin@yahoo.com.au \
    --cc=pj@sgi.com \
    --cc=taka@valinux.co.jp \
    --cc=torvalds@osdl.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