linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Johannes Weiner <hannes@cmpxchg.org>
To: Arjan van de Ven <arjan@infradead.org>
Cc: Rik van Riel <riel@redhat.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Wu Fengguang <fengguang.wu@intel.com>,
	linux-kernel@vger.kernel.org, tytso@mit.edu, linux-mm@kvack.org,
	elladan@eskimo.com, npiggin@suse.de, cl@linux-foundation.org,
	minchan.kim@gmail.com
Subject: Re: [PATCH -mm] vmscan: make mapped executable pages the first class  citizen
Date: Mon, 11 May 2009 12:03:49 +0200	[thread overview]
Message-ID: <20090511100349.GA5086@cmpxchg.org> (raw)
In-Reply-To: <20090510142322.690186a4@infradead.org>

On Sun, May 10, 2009 at 02:23:22PM -0700, Arjan van de Ven wrote:
> On Sun, 10 May 2009 16:37:33 -0400
> Rik van Riel <riel@redhat.com> wrote:
> 
> > Alan Cox wrote:
> > > Historically BSD tackled some of this by actually swapping
> > > processes out once pressure got very high 
> > 
> > Our big problem today usually isn't throughput though,
> > but latency - the time it takes to bring a previously
> > inactive application back to life.
> 
> Could we do a chain? E.g. store which page we paged out next (for the
> vma) as part of the first pageout, and then page them just right back
> in? Or even have a (bitmap?) of pages that have been in memory for the
> vma, and on a re-fault, look for other pages "nearby" that used to be
> in but are now out ?

I'm not sure I understand your chaining idea.

As to the virtually-related pages, I hacked up a clustering idea for
swap-out once (and swap-in readahead should then get virtually related
pages grouped together as well) but it didn't work out as expected.

The LRU order is perhaps a better hint for access patterns than the
relationship on a virtual address level, but at the moment we fail to
keep the LRU order intact on swap so bets are off again...

I have only black-box-benchmarked performance numbers and didn't look
too close at it at the time, though.  If somebody wants to play with
it, patch is attached.

	Hannes

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 3b58602..ba11dee 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1020,6 +1020,101 @@ int isolate_lru_page(struct page *page)
 	return ret;
 }
 
+static unsigned long cluster_inactive_anon_vma(struct vm_area_struct *vma,
+					struct page *page,
+					unsigned long *scanned,
+					struct list_head *cluster)
+{
+	pte_t *pte;
+	spinlock_t *ptl;
+	unsigned long va, area, start, end, nr_taken = 0, nr_scanned = 0;
+
+	va = page_address_in_vma(page, vma);
+	if (va == -EFAULT)
+		return 0;
+
+	pte = page_check_address(page, vma->vm_mm, va, &ptl, 0);
+	if (!pte)
+		return 0;
+	pte_unmap_unlock(pte, ptl);
+
+	area = page_cluster << PAGE_SHIFT;
+	start = va - area;
+	if (start < vma->vm_start)
+		start = vma->vm_start;
+	end = va + area;
+	if (end > vma->vm_end)
+		end = vma->vm_end;
+
+	for (va = start; va < end; va += PAGE_SIZE, nr_scanned++) {
+		pgd_t *pgd;
+		pud_t *pud;
+		pmd_t *pmd;
+		struct zone *zone;
+		struct page *cursor;
+
+		pgd = pgd_offset(vma->vm_mm, va);
+		if (!pgd_present(*pgd))
+			continue;
+		pud = pud_offset(pgd, va);
+		if (!pud_present(*pud))
+			continue;
+		pmd = pmd_offset(pud, va);
+		if (!pmd_present(*pmd))
+			continue;
+		pte = pte_offset_map_lock(vma->vm_mm, pmd, va, &ptl);
+		if (!pte_present(*pte)) {
+			pte_unmap_unlock(pte, ptl);
+			continue;
+		}
+		cursor = vm_normal_page(vma, va, *pte);
+		pte_unmap_unlock(pte, ptl);
+
+		if (!cursor || cursor == page)
+			continue;
+
+		zone = page_zone(cursor);
+		if (zone != page_zone(page))
+			continue;
+
+		spin_lock_irq(&zone->lru_lock);
+		if (!__isolate_lru_page(cursor, ISOLATE_INACTIVE, 0)) {
+			list_move_tail(&cursor->lru, cluster);
+			nr_taken++;
+		}
+		spin_unlock_irq(&zone->lru_lock);
+	}
+	*scanned += nr_scanned;
+	return nr_taken;
+}
+
+static unsigned long cluster_inactive_anon(struct list_head *list,
+					unsigned long *scanned)
+{
+	LIST_HEAD(cluster);
+	unsigned long nr_taken = 0, nr_scanned = 0;
+
+	while (!list_empty(list)) {
+		struct page *page;
+		struct anon_vma *anon_vma;
+		struct vm_area_struct *vma;
+
+		page = list_entry(list->next, struct page, lru);
+		list_move(&page->lru, &cluster);
+
+		anon_vma = page_lock_anon_vma(page);
+		if (!anon_vma)
+			continue;
+		list_for_each_entry(vma, &anon_vma->head, anon_vma_node)
+			nr_taken += cluster_inactive_anon_vma(vma, page,
+							&nr_scanned, &cluster);
+		page_unlock_anon_vma(anon_vma);
+	}
+	list_replace(&cluster, list);
+	*scanned += nr_scanned;
+	return nr_taken;
+}
+
 /*
  * shrink_inactive_list() is a helper for shrink_zone().  It returns the number
  * of reclaimed pages
@@ -1061,6 +1156,11 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
 		nr_taken = sc->isolate_pages(sc->swap_cluster_max,
 			     &page_list, &nr_scan, sc->order, mode,
 				zone, sc->mem_cgroup, 0, file);
+		if (!file && mode == ISOLATE_INACTIVE) {
+			spin_unlock_irq(&zone->lru_lock);
+			nr_taken += cluster_inactive_anon(&page_list, &nr_scan);
+			spin_lock_irq(&zone->lru_lock);
+		}
 		nr_active = clear_active_flags(&page_list, count);
 		__count_vm_events(PGDEACTIVATE, nr_active);
 

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

  reply	other threads:[~2009-05-11 10:06 UTC|newest]

Thread overview: 168+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090428044426.GA5035@eskimo.com>
2009-04-28  5:35 ` Swappiness vs. mmap() and interactive response KOSAKI Motohiro
2009-04-28  6:36   ` Elladan
2009-04-28  6:52     ` KOSAKI Motohiro
2009-04-28  7:26       ` Elladan
2009-04-28  7:44         ` KOSAKI Motohiro
2009-04-28  7:48   ` Peter Zijlstra
2009-04-28  7:58     ` Balbir Singh
2009-04-28  8:11       ` Peter Zijlstra
2009-04-28  8:23         ` KAMEZAWA Hiroyuki
2009-04-28  8:25         ` Balbir Singh
2009-04-28  8:03     ` KOSAKI Motohiro
2009-04-28  9:09     ` Wu Fengguang
2009-04-28  9:26       ` Wu Fengguang
2009-04-28 12:08       ` Theodore Tso
2009-04-29  5:51         ` KOSAKI Motohiro
2009-04-29  6:34           ` Andrew Morton
2009-04-29  7:47             ` KOSAKI Motohiro
2009-04-30  4:14             ` Elladan
2009-04-30  4:43               ` Andrew Morton
2009-04-30  4:55                 ` KOSAKI Motohiro
2009-04-30  4:55                 ` Elladan
2009-04-29  7:48           ` KOSAKI Motohiro
2009-04-30 11:59           ` KOSAKI Motohiro
2009-04-30 13:46             ` Elladan
2009-05-06 11:04             ` KOSAKI Motohiro
2009-04-28 15:28   ` Rik van Riel
2009-04-28 23:29 ` [PATCH] vmscan: evict use-once pages first Rik van Riel
2009-04-29  3:36   ` Elladan
2009-04-29 17:06     ` Christoph Hellwig
2009-04-29  6:42   ` Peter Zijlstra
2009-04-29 13:30     ` Rik van Riel
2009-04-29 15:47     ` [PATCH] vmscan: evict use-once pages first (v2) Rik van Riel
2009-04-29 16:07       ` KOSAKI Motohiro
2009-04-29 16:18         ` Rik van Riel
2009-04-29 17:14         ` [PATCH] vmscan: evict use-once pages first (v3) Rik van Riel
2009-04-30  0:39           ` KOSAKI Motohiro
2009-04-30  8:10           ` Johannes Weiner
2009-05-01 22:32           ` Andrew Morton
2009-05-01 23:05             ` Rik van Riel
2009-05-01 23:25               ` Andrew Morton
2009-05-03  1:28                 ` Wu Fengguang
2009-05-03  1:15           ` Wu Fengguang
2009-05-03  1:33             ` Rik van Riel
2009-05-03  1:46               ` Wu Fengguang
2009-04-29 16:10       ` [PATCH] vmscan: evict use-once pages first (v2) Peter Zijlstra
2009-04-30  7:20       ` Elladan
2009-04-30 13:08         ` Rik van Riel
2009-04-30 14:00           ` Elladan
2009-05-01  0:45         ` Andrew Morton
2009-05-01  0:59           ` Rik van Riel
2009-05-01  1:13             ` Andrew Morton
2009-05-01  1:50               ` Rik van Riel
2009-05-01  2:54                 ` Andrew Morton
2009-05-01 14:05                   ` Rik van Riel
2009-05-01 18:04                     ` Ray Lee
2009-05-01 19:34                       ` Rik van Riel
2009-05-01 19:44                         ` Ray Lee
2009-05-01 20:08                           ` Rik van Riel
2009-05-01 20:17                         ` Elladan
2009-05-01 19:35                     ` Andrew Morton
2009-05-01 20:05                       ` Rik van Riel
2009-05-01 20:45                         ` Andrew Morton
2009-05-01 21:46                           ` Rik van Riel
2009-05-03  3:15                       ` Wu Fengguang
2009-05-03  3:24                         ` Rik van Riel
2009-05-03  3:43                           ` Wu Fengguang
2009-05-04 10:23                         ` Peter Zijlstra
2009-05-07 12:11                           ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-07 13:39                             ` Christoph Lameter
2009-05-07 14:15                               ` Peter Zijlstra
2009-05-07 14:18                                 ` Christoph Lameter
2009-05-07 14:38                                   ` Peter Zijlstra
2009-05-07 15:36                                     ` Christoph Lameter
2009-05-07 15:59                                       ` Rik van Riel
2009-05-07 15:06                                   ` Rik van Riel
2009-05-07 16:00                                   ` Lee Schermerhorn
2009-05-07 16:32                                     ` Christoph Lameter
2009-05-07 17:11                                       ` Rik van Riel
2009-05-08  3:40                                         ` Elladan
2009-05-08 16:04                                           ` Rik van Riel
2009-05-09  4:04                                             ` Elladan
2009-05-08 17:18                                           ` Christoph Lameter
2009-05-09 10:20                                             ` KOSAKI Motohiro
2009-05-08 17:37                                           ` Alan Cox
2009-05-07 15:10                             ` Johannes Weiner
2009-05-07 15:17                               ` Peter Zijlstra
2009-05-07 15:21                                 ` Rik van Riel
2009-05-08  3:30                                 ` Wu Fengguang
2009-05-08  4:17                                 ` [RFC][PATCH] vmscan: report vm_flags in page_referenced() Wu Fengguang
2009-05-08 12:09                                   ` Minchan Kim
2009-05-08 12:15                                     ` Wu Fengguang
2009-05-08 14:01                                       ` Minchan Kim
2009-05-09  6:56                                         ` Wu Fengguang
2009-05-10 23:45                                           ` Minchan Kim
2009-05-17 11:25                                             ` Wu Fengguang
2009-05-07 20:44                               ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Andrew Morton
2009-05-08  8:16                                 ` Wu Fengguang
2009-05-08  8:28                                   ` Wu Fengguang
2009-05-08 19:58                                   ` Andrew Morton
2009-05-08 22:00                                     ` Alan Cox
2009-05-08 22:15                                       ` Andrew Morton
2009-05-08 22:53                                         ` Elladan
2009-05-08 22:20                                       ` Rik van Riel
2009-05-10  8:59                                       ` KOSAKI Motohiro
2009-05-10  9:07                                         ` Peter Zijlstra
2009-05-10  9:35                                           ` Wu Fengguang
2009-05-10 10:06                                             ` KOSAKI Motohiro
2009-05-10  9:36                                           ` KOSAKI Motohiro
2009-05-10 13:45                                             ` Alan Cox
2009-05-10 13:56                                               ` KOSAKI Motohiro
2009-05-10 14:51                                               ` Rik van Riel
2009-05-10 14:59                                                 ` KOSAKI Motohiro
2009-05-10 20:13                                                 ` Alan Cox
2009-05-10 20:37                                                   ` Rik van Riel
2009-05-10 21:23                                                     ` Arjan van de Ven
2009-05-11 10:03                                                       ` Johannes Weiner [this message]
2009-05-10 21:29                                                     ` Alan Cox
2009-05-10  9:20                                         ` Wu Fengguang
2009-05-10  9:29                                           ` KOSAKI Motohiro
2009-05-10 10:03                                             ` Wu Fengguang
2009-05-10 10:15                                               ` KOSAKI Motohiro
2009-05-10 11:21                                                 ` Wu Fengguang
2009-05-10 11:39                                                   ` KOSAKI Motohiro
2009-05-10 11:44                                                     ` Wu Fengguang
2009-05-10 12:19                                                       ` Peter Zijlstra
2009-05-10 12:39                                                         ` KOSAKI Motohiro
2009-05-10 13:17                                                           ` Peter Zijlstra
2009-05-12  2:50                                     ` Wu Fengguang
2009-05-12  4:35                                       ` Wu Fengguang
2009-05-12 13:20                                       ` Rik van Riel
2009-05-16  9:26                                         ` Wu Fengguang
2009-05-12  2:51                                     ` [PATCH -mm] vmscan: report vm_flags in page_referenced() Wu Fengguang
2009-05-12  6:23                                       ` Peter Zijlstra
2009-05-12  6:44                                         ` Minchan Kim
2009-05-12 11:44                                           ` Wu Fengguang
2009-05-12  2:52                                     ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-12  3:00                                       ` KOSAKI Motohiro
2009-05-12 20:54                                         ` [PATCH -mm] vmscan: protect a fraction of file backed mapped pages from reclaim Christoph Lameter
2009-05-12 17:06                                           ` Rik van Riel
2009-05-12 21:20                                             ` Christoph Lameter
2009-05-12 17:39                                               ` Rik van Riel
2009-05-12 22:02                                                 ` Christoph Lameter
2009-05-12 20:17                                                   ` Rik van Riel
2009-05-12 20:26                                                     ` Christoph Lameter
2009-05-13  0:45                                           ` KOSAKI Motohiro
2009-05-14 20:14                                             ` Christoph Lameter
2009-05-14 23:28                                               ` KOSAKI Motohiro
2009-05-14 23:42                                                 ` Rik van Riel
2009-05-15 18:09                                                 ` Christoph Lameter
2009-05-16  8:54                                               ` Wu Fengguang
2009-05-12  8:17                                       ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Minchan Kim
2009-05-12  2:53                                     ` [PATCH -mm] vmscan: merge duplicate code in shrink_active_list() Wu Fengguang
2009-05-12  2:58                                       ` KOSAKI Motohiro
2009-05-12  3:03                                         ` Wu Fengguang
2009-05-12  7:26                                       ` Minchan Kim
2009-05-12 11:48                                         ` Wu Fengguang
2009-05-12 11:57                                           ` Minchan Kim
2009-05-12 13:32                                           ` Rik van Riel
2009-05-16  9:30                                             ` Wu Fengguang
2009-05-08  3:02                               ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-08  7:30                                 ` Minchan Kim
2009-05-08  8:09                                   ` Wu Fengguang
2009-05-08  9:34                                     ` Minchan Kim
2009-05-08 14:25                                       ` Christoph Lameter
2009-05-08 14:34                                         ` Rik van Riel
2009-05-08 17:41                                         ` KOSAKI Motohiro
2009-05-04  8:04                       ` [PATCH] vmscan: evict use-once pages first (v2) Peter Zijlstra
2009-05-01  3:09           ` Elladan

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=20090511100349.GA5086@cmpxchg.org \
    --to=hannes@cmpxchg.org \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=arjan@infradead.org \
    --cc=cl@linux-foundation.org \
    --cc=elladan@eskimo.com \
    --cc=fengguang.wu@intel.com \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=minchan.kim@gmail.com \
    --cc=npiggin@suse.de \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=tytso@mit.edu \
    /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).