From: Andrea Arcangeli <aarcange@redhat.com>
To: Hugh Dickins <hughd@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Greg KH <greg@kroah.com>,
Andrew Morton <akpm@linux-foundation.org>,
Rik van Riel <riel@redhat.com>,
linux-mm@kvack.org
Subject: Re: [PATCH] fix swapin race condition
Date: Sat, 18 Sep 2010 15:19:07 +0200 [thread overview]
Message-ID: <20100918131907.GI18596@random.random> (raw)
In-Reply-To: <alpine.LSU.2.00.1009161905190.2517@tigran.mtv.corp.google.com>
On Thu, Sep 16, 2010 at 07:31:57PM -0700, Hugh Dickins wrote:
> Indeed yes: I was being lazy, hoping to get you to do my thinking
> for me (in my defence, and in your praise, I have to say that that
> is usually much the quickest strategy :-) Thank you for the time
> you've spent on it, when I should have tried harder.
>
> Here's what I think can happen: you may shame me by shooting it down
> immediately, but go ahead!
Can't shoot it. This definitely helped. My previous scenario only
involved threads, so I was only thinking at threads...
> I've cast it in terms of reuse_swap_page(), but I expect it could be
> reformulated to rely on try_to_free_swap() instead, or swapoff+swapon.
It's actually better to formulate in reuse_swap_page terms as it
doesn't require swapoff to trigger.
> A, in do_swap_page(): does page1 = lookup_swap_cache(swap1)
> and comes through the lock_page(page1).
>
> B, a racing thread of same process, also faults into do_swap_page():
> does page1 = lookup_swap_cache(swap1) and now waits in lock_page(page1),
> but for whatever reason is unlucky not to get the lock any time soon.
>
> A carries on through do_swap_page(), a write fault, but cannot reuse
> the swap page1 (another reference to swap1). Unlocks the page1 (but B
> doesn't get it yet), does COW in do_wp_page(), page2 now in that pte.
>
> C, perhaps the parent of A+B, comes in and write faults the same swap
> page1 into its mm, reuse_swap_page() succeeds this time, swap1 is freed.
The key is C mm is different from the A/B mm. If C was sharing the
same mm (as in the scenario I was thinking of with threads)
reuse_swap_cache couldn't run in C because the pte_same check would
fail.
> kswapd comes in after some time (B still unlucky) and swaps out some
> pages from A+B and C: it allocates the original swap1 to page2 in A+B,
> and some other swap2 to the original page1 now in C. But does not
> immediately free page1 (actually it couldn't: B holds a reference),
> leaving it in swap cache for now.
>
> B at last gets the lock on page1, hooray! Is PageSwapCache(page1)?
> Yes. Is pte_same(*page_table, orig_pte)? Yes, because page2 has
> now been given the swap1 which page1 used to have. So B proceeds
> to insert page1 into A+B's page_table, though its content now
> belongs to C, quite different from what A wrote there.
>
> B ought to have checked that page1's swap was still swap1.
I suggest adding the explanation to the patch comment.
Thanks!
Andrea
--
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>
next prev parent reply other threads:[~2010-09-18 13:19 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-03 15:39 [PATCH] fix swapin race condition Andrea Arcangeli
2010-09-03 20:02 ` Andrew Morton
2010-09-04 12:29 ` Andrea Arcangeli
2010-09-03 23:57 ` Rik van Riel
2010-09-06 2:35 ` Hugh Dickins
2010-09-15 23:02 ` Hugh Dickins
2010-09-15 23:42 ` Andrea Arcangeli
2010-09-16 0:10 ` Hugh Dickins
2010-09-16 21:03 ` Andrea Arcangeli
2010-09-16 21:08 ` Andrea Arcangeli
2010-09-17 2:31 ` Hugh Dickins
2010-09-18 13:19 ` Andrea Arcangeli [this message]
2010-09-20 2:35 ` Hugh Dickins
2010-09-20 2:40 ` [PATCH] mm: further " Hugh Dickins
2010-09-20 2:40 ` Hugh Dickins
2010-09-20 3:09 ` Rik van Riel
2010-09-20 3:09 ` Rik van Riel
-- strict thread matches above, loose matches on Subject: below --
2010-07-09 0:23 [PATCH] " Andrea Arcangeli
2010-07-09 20:32 ` Hugh Dickins
2010-07-09 21:19 ` Hugh Dickins
2010-07-09 22:02 ` Rik van Riel
2010-07-13 1:08 ` Andrea Arcangeli
2010-07-13 21:30 ` Hugh Dickins
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=20100918131907.GI18596@random.random \
--to=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=greg@kroah.com \
--cc=hughd@google.com \
--cc=linux-mm@kvack.org \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.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.