All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
To: Christoph Lameter <cl@linux-foundation.org>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Izik Eidus <ieidus@redhat.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	kvm@vger.kernel.org, chrisw@redhat.com, avi@redhat.com,
	izike@qumranet.com
Subject: Re: [PATCH 2/4] Add replace_page(), change the mapping of pte from one page into another
Date: Wed, 12 Nov 2008 17:09:03 -0500	[thread overview]
Message-ID: <1226527744.7560.93.camel@lts-notebook> (raw)
In-Reply-To: <Pine.LNX.4.64.0811121412130.31606@quilx.com>

On Wed, 2008-11-12 at 14:27 -0600, Christoph Lameter wrote:
> On Wed, 12 Nov 2008, Andrea Arcangeli wrote:
> 
> > On Tue, Nov 11, 2008 at 09:10:45PM -0600, Christoph Lameter wrote:
> > > get_user_pages() cannot get to it since the pagetables have already been
> > > modified. If get_user_pages runs then the fault handling will occur
> > > which will block the thread until migration is complete.
> >
> > migrate.c does nothing for ptes pointing to swap entries and
> > do_swap_page won't wait for them either. Assume follow_page in
> 
> If a anonymous page is a swap page then it has a mapping.
> migrate_page_move_mapping() will lock the radix tree and ensure that no
> additional reference (like done by do_swap_page) is established during
> migration.

So, it's Nick's reference freezing you asked about in response to my
mail that prevents do_swap_page() from getting another reference on the
page in the swap cache just after migrate_page_move_mapping() checks the
ref count and replaces the slot with new swap pte.  Radix tree lock just
prevents other threads from modifying the slot, right?  [Hmmm, looks
like we need to update the reference to "write lock" in the comments on
the 'deref_slot() and _replace_slot() definitions in radix-tree.h.]  

Therefore, do_swap_page() will either get the old page and raise the ref
before migration check, or it will [possibly loop in find_get_page() and
then] get the new page.

Migration will bail out, for this pass anyway, in the former case.  In
the second case, do_swap_page() will wait on the new page lock until
migration completes, deferring any direct IO. 

Or am I still missing something?

> 
> > However it's not exactly the same bug as the one in fork, I was
> > talking about before, it's also not o_direct specific. Still
> 
> So far I have seen wild ideas not bugs.

Maybe not so wild, given the complexity of these interactions... 

Later,
Lee



WARNING: multiple messages have this Message-ID (diff)
From: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
To: Christoph Lameter <cl@linux-foundation.org>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Izik Eidus <ieidus@redhat.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	kvm@vger.kernel.org, chrisw@redhat.com, avi@redhat.com,
	izike@qumranet.com
Subject: Re: [PATCH 2/4] Add replace_page(), change the mapping of pte from one page into another
Date: Wed, 12 Nov 2008 17:09:03 -0500	[thread overview]
Message-ID: <1226527744.7560.93.camel@lts-notebook> (raw)
In-Reply-To: <Pine.LNX.4.64.0811121412130.31606@quilx.com>

On Wed, 2008-11-12 at 14:27 -0600, Christoph Lameter wrote:
> On Wed, 12 Nov 2008, Andrea Arcangeli wrote:
> 
> > On Tue, Nov 11, 2008 at 09:10:45PM -0600, Christoph Lameter wrote:
> > > get_user_pages() cannot get to it since the pagetables have already been
> > > modified. If get_user_pages runs then the fault handling will occur
> > > which will block the thread until migration is complete.
> >
> > migrate.c does nothing for ptes pointing to swap entries and
> > do_swap_page won't wait for them either. Assume follow_page in
> 
> If a anonymous page is a swap page then it has a mapping.
> migrate_page_move_mapping() will lock the radix tree and ensure that no
> additional reference (like done by do_swap_page) is established during
> migration.

So, it's Nick's reference freezing you asked about in response to my
mail that prevents do_swap_page() from getting another reference on the
page in the swap cache just after migrate_page_move_mapping() checks the
ref count and replaces the slot with new swap pte.  Radix tree lock just
prevents other threads from modifying the slot, right?  [Hmmm, looks
like we need to update the reference to "write lock" in the comments on
the 'deref_slot() and _replace_slot() definitions in radix-tree.h.]  

Therefore, do_swap_page() will either get the old page and raise the ref
before migration check, or it will [possibly loop in find_get_page() and
then] get the new page.

Migration will bail out, for this pass anyway, in the former case.  In
the second case, do_swap_page() will wait on the new page lock until
migration completes, deferring any direct IO. 

Or am I still missing something?

> 
> > However it's not exactly the same bug as the one in fork, I was
> > talking about before, it's also not o_direct specific. Still
> 
> So far I have seen wild ideas not bugs.

Maybe not so wild, given the complexity of these interactions... 

Later,
Lee


--
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:[~2008-11-12 22:09 UTC|newest]

Thread overview: 139+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-11 13:21 [PATCH 0/4] ksm - dynamic page sharing driver for linux Izik Eidus
2008-11-11 13:21 ` Izik Eidus
2008-11-11 13:21 ` [PATCH 1/4] rmap: add page_wrprotect() function, Izik Eidus
2008-11-11 13:21   ` Izik Eidus, Izik Eidus
2008-11-11 13:21   ` [PATCH 2/4] Add replace_page(), change the mapping of pte from one page into another Izik Eidus
2008-11-11 13:21     ` Izik Eidus, Izik Eidus
2008-11-11 13:21     ` [PATCH 3/4] add ksm kernel shared memory driver Izik Eidus
2008-11-11 13:21       ` Izik Eidus, Izik Eidus
2008-11-11 13:21       ` [PATCH 4/4] MMU_NOTIFIRES: add set_pte_at_notify() Izik Eidus
2008-11-11 13:21         ` Izik Eidus, Izik Eidus
2008-11-11 20:38       ` [PATCH 3/4] add ksm kernel shared memory driver Andrew Morton
2008-11-11 20:38         ` Andrew Morton
2008-11-11 22:03         ` Andrea Arcangeli
2008-11-11 22:03           ` Andrea Arcangeli
2008-11-11 22:03       ` Jonathan Corbet
2008-11-11 22:03         ` Jonathan Corbet
2008-11-11 22:17         ` Izik Eidus
2008-11-11 22:17           ` Izik Eidus
2008-11-11 22:25           ` Jonathan Corbet
2008-11-11 22:25             ` Jonathan Corbet
2008-11-11 22:31             ` Izik Eidus
2008-11-11 22:31               ` Izik Eidus
2008-11-11 22:30           ` Jonathan Corbet
2008-11-11 22:30             ` Jonathan Corbet
2008-11-11 22:38             ` Izik Eidus
2008-11-11 22:38               ` Izik Eidus
2008-11-11 23:02             ` Izik Eidus
2008-11-11 23:02               ` Izik Eidus
2008-11-11 23:03             ` Andrea Arcangeli
2008-11-11 23:03               ` Andrea Arcangeli
2008-11-11 22:49           ` Avi Kivity
2008-11-11 22:49             ` Avi Kivity
2008-11-11 22:40         ` Valdis.Kletnieks
2008-11-13  6:13           ` Eric Rannaud
2008-11-13  6:13             ` Eric Rannaud
2008-11-11 22:43         ` Avi Kivity
2008-11-11 22:43           ` Avi Kivity
2008-11-11 19:45     ` [PATCH 2/4] Add replace_page(), change the mapping of pte from one page into another Andrew Morton
2008-11-11 19:45       ` Andrew Morton
2008-11-11 20:57       ` Izik Eidus
2008-11-11 20:57         ` Izik Eidus
2008-11-11 21:21         ` Christoph Lameter
2008-11-11 21:21           ` Christoph Lameter
2008-11-11 21:23           ` Izik Eidus
2008-11-11 21:23             ` Izik Eidus
2008-11-11 21:31             ` Christoph Lameter
2008-11-11 21:31               ` Christoph Lameter
2008-11-11 21:37               ` Izik Eidus
2008-11-11 21:37                 ` Izik Eidus
2008-11-11 22:24               ` Andrea Arcangeli
2008-11-11 22:24                 ` Andrea Arcangeli
2008-11-12  2:19                 ` KAMEZAWA Hiroyuki
2008-11-12  2:19                   ` KAMEZAWA Hiroyuki
2008-11-12 10:05                   ` Avi Kivity
2008-11-12 10:05                     ` Avi Kivity
2008-11-12 11:11                     ` Izik Eidus
2008-11-12 11:11                       ` Izik Eidus
2008-11-13  6:11                       ` KAMEZAWA Hiroyuki
2008-11-13  6:11                         ` KAMEZAWA Hiroyuki
2008-11-13 10:38                         ` Izik Eidus
2008-11-13 10:38                           ` Izik Eidus
2008-11-13 11:32                           ` KAMEZAWA Hiroyuki
2008-11-13 11:32                             ` KAMEZAWA Hiroyuki
2008-11-11 21:35           ` Andrea Arcangeli
2008-11-11 21:35             ` Andrea Arcangeli
2008-11-11 21:06       ` Andrea Arcangeli
2008-11-11 21:06         ` Andrea Arcangeli
2008-11-11 21:26         ` Christoph Lameter
2008-11-11 21:26           ` Christoph Lameter
2008-11-11 21:39           ` Avi Kivity
2008-11-11 21:39             ` Avi Kivity
2008-11-11 21:47             ` Christoph Lameter
2008-11-11 21:47               ` Christoph Lameter
2008-11-11 21:55               ` Izik Eidus
2008-11-11 21:55                 ` Izik Eidus
2008-11-11 22:36               ` Avi Kivity
2008-11-11 22:36                 ` Avi Kivity
2008-11-11 22:17           ` Andrea Arcangeli
2008-11-11 22:17             ` Andrea Arcangeli
2008-11-11 22:30             ` Christoph Lameter
2008-11-11 22:30               ` Christoph Lameter
2008-11-11 23:17               ` Andrea Arcangeli
2008-11-11 23:17                 ` Andrea Arcangeli
2008-11-11 23:25                 ` Andrea Arcangeli
2008-11-11 23:25                   ` Andrea Arcangeli
2008-11-12  0:27                 ` Christoph Lameter
2008-11-12  0:27                   ` Christoph Lameter
2008-11-12  2:27                   ` Andrea Arcangeli
2008-11-12  2:27                     ` Andrea Arcangeli
2008-11-12  3:10                     ` Christoph Lameter
2008-11-12  3:10                       ` Christoph Lameter
2008-11-12 17:32                       ` Andrea Arcangeli
2008-11-12 17:32                         ` Andrea Arcangeli
2008-11-12 20:08                         ` Lee Schermerhorn
2008-11-12 20:08                           ` Lee Schermerhorn
2008-11-12 20:31                           ` Christoph Lameter
2008-11-12 20:31                             ` Christoph Lameter
2008-11-12 20:27                         ` Christoph Lameter
2008-11-12 20:27                           ` Christoph Lameter
2008-11-12 22:09                           ` Lee Schermerhorn [this message]
2008-11-12 22:09                             ` Lee Schermerhorn
2008-11-13  2:00                             ` Andrea Arcangeli
2008-11-13  2:00                               ` Andrea Arcangeli
2008-11-13  2:31                               ` Andrea Arcangeli
2008-11-13  2:31                                 ` Andrea Arcangeli
2008-11-13  4:02                                 ` Nick Piggin
2008-11-13  4:02                                   ` Nick Piggin
2008-11-11 19:39   ` [PATCH 1/4] rmap: add page_wrprotect() function, Andrew Morton
2008-11-11 19:39     ` Andrew Morton
2008-11-11 20:38     ` Andrea Arcangeli
2008-11-11 20:38       ` Andrea Arcangeli
2008-11-11 21:01       ` Andrew Morton
2008-11-11 21:01         ` Andrew Morton
2008-11-11 21:17         ` Andrea Arcangeli
2008-11-11 21:17           ` Andrea Arcangeli
2008-11-11 18:30 ` [PATCH 0/4] ksm - dynamic page sharing driver for linux Andrew Morton
2008-11-11 18:30   ` Andrew Morton
2008-11-11 18:48   ` Avi Kivity
2008-11-11 18:48     ` Avi Kivity
2008-11-11 19:08     ` Izik Eidus
2008-11-11 19:08       ` Izik Eidus
2008-11-11 19:11     ` Andrew Morton
2008-11-11 19:11       ` Andrew Morton
2008-11-11 19:18       ` Izik Eidus
2008-11-11 19:18         ` Izik Eidus
2008-11-11 19:32         ` Andrew Morton
2008-11-11 19:32           ` Andrew Morton
2008-11-11 19:52           ` Izik Eidus
2008-11-11 19:52             ` Izik Eidus
2008-11-11 20:08             ` Izik Eidus
2008-11-11 20:08               ` Izik Eidus
2008-11-11 19:29       ` Avi Kivity
2008-11-11 19:29         ` Avi Kivity
2008-11-11 19:55       ` Andrea Arcangeli
2008-11-11 19:55         ` Andrea Arcangeli
2008-11-11 19:07   ` Izik Eidus
2008-11-11 19:07     ` Izik Eidus
2008-11-11 19:20     ` Andrew Morton
2008-11-11 19:20       ` Andrew Morton

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=1226527744.7560.93.camel@lts-notebook \
    --to=lee.schermerhorn@hp.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=avi@redhat.com \
    --cc=chrisw@redhat.com \
    --cc=cl@linux-foundation.org \
    --cc=ieidus@redhat.com \
    --cc=izike@qumranet.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.