From: Hirokazu Takahashi <taka@valinux.co.jp>
To: raybry@sgi.com
Cc: marcelo.tosatti@cyclades.com, ak@suse.de, haveblue@us.ibm.com,
hch@infradead.org, linux-mm@kvack.org, nathans@sgi.com,
raybry@austin.rr.com, lhms-devel@lists.sourceforge.net
Subject: Re: [PATCH 2.6.12-rc3 4/8] mm: manual page migration-rc2 -- add-sys_migrate_pages-rc2.patch
Date: Wed, 11 May 2005 22:26:07 +0900 (JST) [thread overview]
Message-ID: <20050511.222607.98339736.taka@valinux.co.jp> (raw)
In-Reply-To: <20050511.222314.10910241.taka@valinux.co.jp>
Hi Ray,
> > This is the main patch that creates the migrate_pages() system
> > call. Note that in this case, the system call number was more
> > or less arbitrarily assigned at 1279. This number needs to
> > allocated.
> >
> > This patch sits on top of the page migration patches from
> > the Memory Hotplug project. This particular patchset is built
> > on top of:
> >
> > http://www.sr71.net/patches/2.6.12/2.6.12-rc3-mhp1/page_migration/patch-2.6.12-rc3-mhp1-pm.gz
>
> I found there exited a race condition between migrate_vma() and
^^^^^^
existed
> the swap code. The following code may cause Oops if the swap code
> takes the page from the LRU list before calling steal_page_from_lru().
>
> migrate_vma()
> {
> :
> if (PageLRU(page) &&
> steal_page_from_lru(zone, page, &page_list))
> count++;
> else
> BUG();
> :
> }
>
> Ok, I should make steal_page_from_lru() check PageLRU(page) with
> holding zone->lru_lock. Then migrate_vma() can just call
> steal_page_from_lru().
>
> static inline int
> steal_page_from_lru(struct zone *zone, struct page *page)
> {
> int ret = 0;
> spin_lock_irq(&zone->lru_lock);
> if (PageLRU(page))
> ret = __steal_page_from_lru(zone, page);
> spin_unlock_irq(&zone->lru_lock);
> return ret;
> }
>
> migrate_vma()
> {
> :
> if (steal_page_from_lru(zone, page, &page_list)
> count++;
> :
> }
>
>
> BTW, I'm not sure whether it's enough that migrate_vma() can only
> migrate currently mapped pages. This may leave some pages in the
> page-cache if they're not mapped to the process address spaces yet.
>
> Thanks,
> Hirokazu Takahashi.
>
>
> > Index: linux-2.6.12-rc3-mhp1-page-migration-export/mm/mmigrate.c
> > ===================================================================
> > --- linux-2.6.12-rc3-mhp1-page-migration-export.orig/mm/mmigrate.c 2005-05-10 10:22:24.000000000 -0700
> > +++ linux-2.6.12-rc3-mhp1-page-migration-export/mm/mmigrate.c 2005-05-10 10:40:35.000000000 -0700
> > @@ -5,6 +5,9 @@
> > *
> > * Authors: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
> > * Hirokazu Takahashi <taka@valinux.co.jp>
> > + *
> > + * sys_migrate_pages() added by Ray Bryant <raybry@sgi.com>
> > + * Copyright (C) 2005, Silicon Graphics, Inc.
> > */
> >
> > #include <linux/config.h>
> > @@ -21,6 +24,9 @@
> > #include <linux/rmap.h>
> > #include <linux/mmigrate.h>
> > #include <linux/delay.h>
> > +#include <linux/blkdev.h>
> > +#include <linux/nodemask.h>
> > +#include <asm/bitops.h>
> >
> > /*
> > * The concept of memory migration is to replace a target page with
> > @@ -587,6 +593,182 @@ int try_to_migrate_pages(struct list_hea
> > return nr_busy;
> > }
> >
> > +static int
> > +migrate_vma(struct task_struct *task, struct mm_struct *mm,
> > + struct vm_area_struct *vma, short *node_map)
> > +{
> > + struct page *page;
> > + struct zone *zone;
> > + unsigned long vaddr;
> > + int count = 0, nid, pass = 0, nr_busy = 0;
> > + LIST_HEAD(page_list);
> > +
> > + /* can't migrate mlock()'d pages */
> > + if (vma->vm_flags & VM_LOCKED)
> > + return 0;
> > +
> > + /*
> > + * gather all of the pages to be migrated from this vma into page_list
> > + */
> > + spin_lock(&mm->page_table_lock);
> > + for (vaddr = vma->vm_start; vaddr < vma->vm_end; vaddr += PAGE_SIZE) {
> > + page = follow_page(mm, vaddr, 0);
> > + /*
> > + * follow_page has been known to return pages with zero mapcount
> > + * and NULL mapping. Skip those pages as well
> > + */
> > + if (page && page_mapcount(page)) {
> > + nid = page_to_nid(page);
> > + if (node_map[nid] >= 0) {
> > + zone = page_zone(page);
> > + if (PageLRU(page) &&
> > + steal_page_from_lru(zone, page, &page_list))
> > + count++;
> > + else
> > + BUG();
> > + }
> > + }
> > + }
> > + spin_unlock(&mm->page_table_lock);
> > +
> > +retry:
> > +
> > + /* call the page migration code to move the pages */
> > + if (!list_empty(&page_list))
> > + nr_busy = try_to_migrate_pages(&page_list, node_map);
> > +
> > + if (nr_busy > 0) {
> > + pass++;
> > + if (pass > 10)
> > + return -EAGAIN;
> > + /* wait until some I/O completes and try again */
> > + blk_congestion_wait(WRITE, HZ/10);
> > + goto retry;
> > + } else if (nr_busy < 0)
> > + return nr_busy;
> > +
> > + return count;
> > +}
>
>
>
>
>
>
> --
> 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:"aart@kvack.org"> aart@kvack.org </a>
>
--
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:"aart@kvack.org"> aart@kvack.org </a>
next prev parent reply other threads:[~2005-05-11 13:26 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-11 4:37 [PATCH 2.6.12-rc3 0/8] mm: manual page migration-rc2 -- overview Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 1/8] mm: manual page migration-rc2 -- xfs-extended-attributes-rc2.patch Ray Bryant
2005-05-11 7:15 ` Christoph Hellwig
2005-05-11 12:10 ` [Lhms-devel] " Ray Bryant
2005-05-11 12:59 ` Andi Kleen
2005-05-11 18:43 ` Ray Bryant
2005-05-11 19:32 ` Andi Kleen
2005-05-11 20:00 ` Christoph Hellwig
2005-05-11 22:04 ` Ray Bryant
2005-05-12 10:45 ` Christoph Hellwig
2005-05-17 4:22 ` Ray Bryant
2005-05-18 6:20 ` Paul Jackson
2005-05-18 14:49 ` Ray Bryant
2005-05-20 22:26 ` Ray Bryant
2005-05-23 17:50 ` Steve Longerbeam
2005-05-24 4:53 ` Ray Bryant
2005-05-24 20:59 ` Christoph Lameter
2005-05-24 21:04 ` Martin J. Bligh
2005-05-25 6:42 ` Ray Bryant
2005-05-28 8:40 ` Christoph Hellwig
2005-05-28 16:12 ` Ray Bryant
2005-05-11 19:50 ` Christoph Hellwig
2005-05-11 21:30 ` Ray Bryant
2005-05-12 9:55 ` Christoph Hellwig
2005-05-12 15:47 ` Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 2/8] mm: manual page migration-rc2 -- xfs-migrate-page-rc2.patch Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 3/8] mm: manual page migration-rc2 -- add-node_map-arg-to-try_to_migrate_pages-rc2.patch Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 4/8] mm: manual page migration-rc2 -- add-sys_migrate_pages-rc2.patch Ray Bryant
2005-05-11 8:24 ` Christoph Hellwig
2005-05-18 19:07 ` Ray Bryant
2005-05-28 9:14 ` Christoph Hellwig
2005-05-28 15:53 ` Ray Bryant
2005-05-11 13:23 ` Hirokazu Takahashi
2005-05-11 13:26 ` Hirokazu Takahashi [this message]
2005-05-11 14:06 ` Ray Bryant
2005-05-12 6:41 ` Hirokazu Takahashi
2005-05-12 16:41 ` Ray Bryant
2005-05-12 23:50 ` Hirokazu Takahashi
2005-05-13 9:59 ` [Lhms-devel] " Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 5/8] mm: manual page migration-rc2 -- sys_migrate_pages-xattr-support-rc2.patch Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 6/8] mm: manual page migration-rc2 -- sys_migrate_pages-mempolicy-migration-rc2.patch Ray Bryant
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 7/8] mm: manual page migration-rc2 -- sys_migrate_pages-cpuset-support-rc2.patch Ray Bryant
2005-05-11 12:37 ` Paul Jackson
2005-05-11 14:20 ` Ray Bryant
2005-05-11 18:55 ` [Lhms-devel] " Paul Jackson
2005-05-11 4:38 ` [PATCH 2.6.12-rc3 8/8] mm: manual page migration-rc2 -- sys_migrate_pages-permissions-check-rc2.patch Ray Bryant
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=20050511.222607.98339736.taka@valinux.co.jp \
--to=taka@valinux.co.jp \
--cc=ak@suse.de \
--cc=haveblue@us.ibm.com \
--cc=hch@infradead.org \
--cc=lhms-devel@lists.sourceforge.net \
--cc=linux-mm@kvack.org \
--cc=marcelo.tosatti@cyclades.com \
--cc=nathans@sgi.com \
--cc=raybry@austin.rr.com \
--cc=raybry@sgi.com \
/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