From: Marcelo Tosatti <marcelo.tosatti@cyclades.com>
To: Hirokazu Takahashi <taka@valinux.co.jp>
Cc: linux-mm@kvack.org, iwamoto@valinux.co.jp, haveblue@us.ibm.com,
hugh@veritas.com
Subject: Re: migration cache, updated
Date: Wed, 1 Dec 2004 18:21:02 -0200 [thread overview]
Message-ID: <20041201202101.GB5459@dmt.cyclades> (raw)
In-Reply-To: <20041124.192156.73388074.taka@valinux.co.jp>
On Wed, Nov 24, 2004 at 07:21:56PM +0900, Hirokazu Takahashi wrote:
> Hi Marcelo,
Hi again Hirokazu, finally found sometime to think about this.
> > > Hi Marcelo,
> > >
> > > I've been testing the memory migration code with your patch.
> > > I found problems and I think the attached patch would
> > > fix some of them.
> > >
> > > One of the problems is a race condition between add_to_migration_cache()
> > > and try_to_unmap(). Some pages in the migration cache cannot
> > > be removed with the current implementation. Please suppose
> > > a process space might be removed between them. In this case
> > > no one can remove pages the process had from the migration cache,
> > > because they can be removed only when the pagetables pointed
> > > the pages.
> >
> > I guess I dont fully understand you Hirokazu.
> >
> > unmap_vmas function (called by exit_mmap) calls zap_pte_range,
> > and that does:
> >
> > if (pte_is_migration(pte)) {
> > migration_remove_entry(swp_entry);
> > } else
> > free_swap_and_cache(swp_entry);
> >
> > migration_remove_entry should decrease the IDR counter, and
> > remove the migration cache page on zero reference.
> >
> > Am I missing something?
>
> That's true only if the pte points a migration entry.
> However, the pte may not point it when zap_pte_range() is called
> in some case.
>
> Please suppose the following flow.
> Any process may exit or munmap during memory migration
> before calling set_pte(migration entry). This will
> keep some unreferenced pages in the migration cache.
> No one can remove these pages.
>
> <start page migration> <Process A>
> | |
> | |
> | |
> add_to_migration_cache() |
> insert a page of Process A -----------> |
> in the migration cache. |
> | |
> | zap_pte_range()
> | X <------------ migration_remove_entry()
> | the pte associated with the page doesn't
> | point any migration entries.
OK, I see it, its the "normal" anonymous pte which will be removed at
this point.
> |
> |
> try_to_unmap() -----------------------> X
> migration_duplicate() no pte mapping the page can be found.
> set_pte(migration entry)
> |
> |
> migrate_fn()
> |
> |
> <finish>
> the page still remains in the migration cache.
> the page may be referred by no process.
>
>
> > I assume you are seeing this problems in practice?
>
> Yes, it often happens without the patch.
>
> > Sorry for the delay, been busy with other things.
>
> No problem. Everyone knows you're doing hard work!
>
> > > Therefore, I made pages removed from the migration cache
> > > at the end of generic_migrate_page() if they remain in the cache.
OK, removing migration pages at end of generic_migrate_page() should
avoid the leak - that part of your patch is fine to me!
> > > The another is a fork() related problem. If fork() has occurred
> > > during page migration, the previous work may not go well.
> > > pages may not be removed from the migration cache.
Can you please expand on that one? I assume it works fine because
copy_page_range() duplicates the migration page reference (and the
migration pte), meaning that on exit (zap_pte_range) the migration
pages should be removed through migration_remove_entry().
I dont see the problem - please correct me.
> > > So I made the swapcode ignore pages in the migration cache.
> > > However, as you know this is just a workaround and not a correct
> > > way to fix it.
What this has to do with fork()? I can't understand.
Your patch is correct here also - we can't reclaim migration cache
pages.
+ if (PageMigration(page)) {
+ write_unlock_irq(&mapping->tree_lock);
+ goto keep_locked;
+ }
An enhancement would be to force pagefault of all pte's
mapping to a migration cache page on shrink_list.
similar to rmap.c's try_to_unmap_anon() but intented to create the pte
instead of unmapping it
anon_vma = page_lock_anon_vma(page);
list_for_each_entry(vma, &anon_vma->head, anon_vma_node)
ret = try_to_faultin(page, vma);
And try_to_faultin() calling handle_mm_fault()...
Is that what you mean?
Anyways, does the migration cache survive your stress testing now
with these changes ?
I've coded the beginning of skeleton for the nonblocking version of migrate_onepage().
Can you generate a new migration cache patch on top of linux-2.6.10-rc1-mm2-mhp2
with your fixes ?
Thanks!
--
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:[~2004-12-01 20:21 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-10-25 21:39 Marcelo Tosatti
2004-10-26 1:17 ` Hiroyuki KAMEZAWA
2004-10-26 12:01 ` Marcelo Tosatti
2004-10-26 23:47 ` Hiroyuki KAMEZAWA
2004-10-26 6:37 ` Hirokazu Takahashi
2004-10-26 9:20 ` Marcelo Tosatti
2004-10-26 13:45 ` Hirokazu Takahashi
2004-10-26 11:41 ` Marcelo Tosatti
2004-10-27 13:40 ` Hirokazu Takahashi
2004-10-26 9:15 ` Hirokazu Takahashi
2004-10-26 9:25 ` Marcelo Tosatti
2004-10-26 14:01 ` Hirokazu Takahashi
2004-10-26 12:24 ` Marcelo Tosatti
2004-10-27 7:25 ` IWAMOTO Toshihiro
2004-10-27 16:27 ` Marcelo Tosatti
2004-10-27 13:48 ` Hirokazu Takahashi
2004-10-28 15:19 ` Marcelo Tosatti
2004-10-28 16:05 ` Marcelo Tosatti
2004-10-28 18:51 ` Dave Hansen
2004-10-28 16:26 ` Marcelo Tosatti
2004-10-28 20:24 ` Dave Hansen
2004-11-03 15:21 ` Marcelo Tosatti
2004-11-04 8:01 ` Hirokazu Takahashi
2004-11-05 13:49 ` Hirokazu Takahashi
2004-11-05 15:16 ` Marcelo Tosatti
2004-11-16 4:07 ` Hirokazu Takahashi
2004-11-23 12:14 ` Marcelo Tosatti
2004-11-24 10:21 ` Hirokazu Takahashi
2004-12-01 20:21 ` Marcelo Tosatti [this message]
2004-12-08 13:23 ` Hirokazu Takahashi
2005-01-17 9:59 ` Marcelo Tosatti
2005-01-31 18:33 ` Ray Bryant
2005-01-31 18:44 ` Marcelo Tosatti
2005-02-02 21:28 ` Ray Bryant
2005-02-03 2:59 ` Hirokazu Takahashi
2005-02-03 15:19 ` Ray Bryant
2005-02-04 7:32 ` Hirokazu Takahashi
2005-02-04 16:08 ` Ray Bryant
2005-02-07 12:46 ` Hirokazu Takahashi
2005-02-07 20:54 ` Ray Bryant
2005-02-08 2:17 ` Hirokazu Takahashi
[not found] ` <42083913.9050306@sgi.com>
[not found] ` <20050209.151938.63052333.taka@valinux.co.jp>
2005-02-09 20:48 ` Ray Bryant
2005-02-07 13:16 ` Hirokazu Takahashi
2005-02-03 2:49 ` Hirokazu Takahashi
2005-01-03 19:04 page migration Ray Bryant
2005-01-03 19:37 ` Dave Hansen
2005-01-03 20:15 ` Ray Bryant
2005-01-04 14:42 ` Hirokazu Takahashi
2005-01-04 17:30 ` Ray Bryant
2005-01-04 17:40 ` process " Dave Hansen
2005-01-04 18:26 ` Ray Bryant
2005-01-07 16:57 ` migration cache, updated Ray Bryant
2005-01-10 10:07 ` Marcelo Tosatti
2005-01-03 19:25 Ray Bryant
2005-02-06 2:02 Marcelo Tosatti
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=20041201202101.GB5459@dmt.cyclades \
--to=marcelo.tosatti@cyclades.com \
--cc=haveblue@us.ibm.com \
--cc=hugh@veritas.com \
--cc=iwamoto@valinux.co.jp \
--cc=linux-mm@kvack.org \
--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