From: Hugh Dickins <hugh@veritas.com>
To: Zachary Amsden <zach@vmware.com>
Cc: David Rientjes <rientjes@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org
Subject: Re: [patch -mm] i386: use pte_update_defer in ptep_test_and_clear_{dirty,young}
Date: Fri, 13 Apr 2007 21:24:55 +0100 (BST) [thread overview]
Message-ID: <Pine.LNX.4.64.0704132108430.14740@blonde.wat.veritas.com> (raw)
In-Reply-To: <461FD9BF.90609@vmware.com>
On Fri, 13 Apr 2007, Zachary Amsden wrote:
> Hugh Dickins wrote:
> > Zach, while looking at your recent patches, I ran across the comment
> > on pte_update_defer, and where it was being used, and now think that
> > David's patch is actually incorrect. Previously pte_update_defer
> > was being used where a flush_tlb_page followed immediately after
> > within the same macro; with David's patch, mm's clear_refs_pte_range
> > is calling ptep_test_and_clear_young (including pte_update_defer) on
> > several ptes, then unlocking the page table, and later flushing TLB.
> > That's exactly wrong for pte_update_defer, isn't it?
> >
>
> Ok, disregard most of my last e-mail.
Phew! That's a lot quicker than digesting it ;)
But thanks for going to so much trouble.
> It is fine to decouple the flush from
> the update, as long as they stay close enough that you can reason they happen
> together. I guess I hadn't seen the other parts of the patch which release
> the page table spinlock in between the two, and somehow missed it again when
> responding to the above as I got too excited explaining why the decoupling is
> ok. It is not ok to release the spinlock when using shadow page tables on
> SMP. There are some rather complex races that can result. Here's one case:
>
> CPU-0 CPU-1
> ----------------------- ---------------------------
> test_and_clear_dirty(x)
> spin_unlock(ptl)
> write address mapped by X
> (harware updates dirty bit)
> spin_lock(ptl)
> set_pte_wrprotect(x)
> flush
> flush
>
> Now, the write protected pte which maps a dirty page gets broken in two ways;
> it is unclear if dirty bit or entiry PTE from CPU-0 is deferred until flush,
> so either write protected PTE for modified page loses the dirty bit (BAD!), or
> write protected PTE loses both dirty and write protect bits (VERY BAD!).
>
> To prevent this, we need a flush before dropping the spinlock. If that gets
> too complicated, we can drop the defer logic and just use pte_update instead,
> which notifies the hypervisor immediately of the mapping change.
David (clear_refs_pte_range) is only using ptep_test_and_clear_young,
though he did change the ptep_test_and_clear_dirty definition to be
consistent with it. old/young is never so serious as clean/dirty, so
it may be that there's very little problem with what's in there now;
it just becomes a shame if the wrong decision gets made too often e.g.
if the misflushing is such that his clear_youngs never really take
effect. I simply cannot tell whether or not that's the case myself.
But once the pte_update_defers get moved away from their flush_tlb_pages,
as is the case now, it feels like we're on thin ice.
Actually, I don't really get pte_update_defer at all: I can understand
wanting to defer a call down, but it appears to be a call down to say
we're deferring the shadow update? Why not just do it with pte_update?
I'd be happier without it until this could be restructured more safely
(but my incomprehension is not necessarily the best guiding principle).
Hugh
next prev parent reply other threads:[~2007-04-13 20:24 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-26 6:37 David Rientjes
2007-03-26 9:08 ` Andrew Morton
2007-03-26 20:24 ` Zachary Amsden
2007-04-13 17:54 ` Hugh Dickins
2007-04-13 19:05 ` Zachary Amsden
2007-04-13 19:27 ` Zachary Amsden
2007-04-13 20:24 ` Hugh Dickins [this message]
2007-04-13 20:59 ` Zachary Amsden
2007-04-16 17:59 ` Hugh Dickins
2007-04-16 18:51 ` David Rientjes
2007-04-16 19:04 ` Hugh Dickins
2007-04-16 19:20 ` David Rientjes
2007-04-16 22:08 ` Zachary Amsden
2007-04-16 22:00 ` Zachary Amsden
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=Pine.LNX.4.64.0704132108430.14740@blonde.wat.veritas.com \
--to=hugh@veritas.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rientjes@google.com \
--cc=zach@vmware.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
all inboxes | Powered by JetHome®