From: Shawn Bohrer <sbohrer@rgmadvisors.com>
To: Darren Hart <dvhart@linux.intel.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
peterz@infradead.org, eric.dumazet@gmail.com,
david@rgmadvisors.com, linux-kernel@vger.kernel.org,
zvonler@rgmadvisors.com, hughd@google.com, tglx@linutronix.de,
mingo@elte.hu
Subject: Re: [PATCH RFC] futex: Fix regression with read only mappings
Date: Thu, 23 Jun 2011 14:49:49 -0500 [thread overview]
Message-ID: <20110623194949.GA2083@BohrerMBP.rgmadvisors.com> (raw)
In-Reply-To: <4E035B39.1080207@linux.intel.com>
On Thu, Jun 23, 2011 at 08:26:49AM -0700, Darren Hart wrote:
>
>
> On 06/22/2011 07:51 PM, KOSAKI Motohiro wrote:
> > (2011/06/23 5:14), Darren Hart wrote:
> >> Hi Shawn,
> >>
> >> Thanks for taking this up. Would you share your testcases as well?
> >>
> >> On 06/22/2011 12:19 PM, Shawn Bohrer wrote:
> >>> commit 7485d0d3758e8e6491a5c9468114e74dc050785d (futexes: Remove rw
> >>> parameter from get_futex_key()) in 2.6.33 introduced a user-mode
> >>> regression in that it additionally prevented futex operations on a
> >>> region within a read only memory mapped file. For example this breaks
> >>> workloads that have one or more reader processes doing a FUTEX_WAIT on a
> >>> futex within a read only shared mapping, and a writer processes that has
> >>> a writable mapping issuing the FUTEX_WAKE.
> >>>
> >>> This fixes the regression for futex operations that should be valid on
> >>> RO mappings by trying a RO get_user_pages_fast() when the RW
> >>> get_user_pages_fast() fails so as not to slow down the common path of
> >>> writable anonymous maps and bailing when we used the RO path on
> >>> anonymous memory.
> >>>
> >>> Patch based on Peter Zijlstra's initial patch with modifications to only
> >>> allow RO mappings for futex operations that need VERIFY_READ access.
> >>>
> >>> Signed-off-by: Shawn Bohrer <sbohrer@rgmadvisors.com>
> >>> ---
> >>>
> >>> Interestingly this patch also allows doing a FUTEX_WAIT on a RO private
> >>> mapping.
> >>
> >> I don't see any harm in this.
> >
> > Hi
> >
> > I have no objection. However I'd like to explain why I decided to
> > prefer to refuse RO private mappings and used prefault.
> >
> > private mapping semantics is, to write access makes process private pages
> > (ie PageAnon=1).
> >
> > So, this patch introduce following another corner case.
> >
> > Thread-A: call futex(FUTEX_WAIT, memory-region-A).
> > get_futex_key() return inode based key.
> > sleep on the key
> > Thread-B: call mprotect(PROT_READ|PROT_WRITE, memory-region-A)
> > Thread-B: write memory-region-A.
> > COW happen. This process's memory-region-A become related
> > to new COWed private (ie PageAnon=1) page.
> > Thread-B: call futex(FUETX_WAKE, memory-region-A).
> > get_futex_key() return mm based key.
> > IOW, we fail to wake up Thread-A.
> >
> > It's unclear real world issue or not. But I hope everybody realize it.
> > So, Probably it would be great if you add some comments for this issue.
> >
> > 2.6.18 had an another trick. It used vma walk for avoiding this issue.
> > and, unfortunately, it's slow.
>
>
> Let me try and restate, please tell me if I have this correct:
>
> RO file backed private mappings can be converted to a RW mapping between
> FUTEX_WAIT and FUTEX_WAKE, resulting in the use of different keys (as
> the RO mapping finds an inode key and the RW mapping returns an
> anonymous key). The way to fix this is to use the virtual address
> instead of the physical address, like shared futexes, but this has to be
> done all the time as there is no way to know if the RO mapping will be
> changed after a key is looked up, so it would eliminate the gains of the
> private futexes.
>
> A RO private mapping doesn't make a lot of sense to me since at least
> one thread of the process will have to have write permission in order
> for the mechanism to be useful,
<snip>
I agree that a RO private mapping doesn't make a lot of sense, even if
another thread/process has write access to the file. My mmap man page
says:
MAP_PRIVATE
Create a private copy-on-write mapping. Stores
to the region do not affect the original file. It
is unspecified whether changes made to the file
after the mmap() call are visible in the mapped
region.
So apparently it is unspecified whether changes to the underlying file
will even be visible in the mapped region. My quick tests so far
indicate that changes are visible, but it wouldn't surprise me if
there are cases where they are not.
> so the approach taken in the patch (EFAULT on RO anonymous private
> mappings) seems reasonable.
That sounds reasonable but the patch I sent doesn't appear to do this.
The patch I sent returns EFAULT on RO anonymous pages, but as KOSAKI
mentioned above (and from my testing) _write access_ makes the pages
of private mappings anonymous. So if the private mapping is marked
read only it keys off the inode.
I actually don't know of a case where you would have a RO anonymous
page. I tried using mmap with PROT_READ and MAP_ANONYMOUS, but I
believe this simply maps the zero page, and that does cause the
FUTEX_WAIT to hang with my patch. Perhaps you can use mprotect to
mark normal anonymous pages RO? And if you have a RO anonymous page
should FUTEX_WAIT return EFAULT?
I'd say a solution that allows RO shared mappings and rejects
RO private mappings would be ideal, but I currently don't see a way to
tell the difference. You could also argue that users of private
mappings should understand the risks.
--
Shawn
---------------------------------------------------------------
This email, along with any attachments, is confidential. If you
believe you received this message in error, please contact the
sender immediately and delete all copies of the message.
Thank you.
next prev parent reply other threads:[~2011-06-23 19:50 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-06 14:28 Change in functionality of futex() system call David Oliver
2011-06-06 15:23 ` Eric Dumazet
2011-06-06 15:56 ` Shawn Bohrer
2011-06-06 16:11 ` Peter Zijlstra
2011-06-06 16:16 ` Peter Zijlstra
2011-06-06 16:22 ` Eric Dumazet
2011-06-06 16:29 ` Peter Zijlstra
2011-06-06 16:42 ` Eric Dumazet
2011-06-06 17:05 ` Peter Zijlstra
2011-06-06 17:11 ` Eric Dumazet
2011-06-06 17:27 ` Steven Rostedt
2011-06-06 17:56 ` Darren Hart
2011-06-06 18:23 ` Peter Zijlstra
2011-06-06 18:27 ` Eric Dumazet
2011-06-25 0:00 ` Darren Hart
2011-06-27 16:48 ` Shawn Bohrer
2011-06-06 17:53 ` Darren Hart
2011-06-06 18:11 ` Eric Dumazet
2011-06-07 3:13 ` Darren Hart
2011-06-07 3:49 ` Eric Dumazet
2011-06-07 14:44 ` Andy Lutomirski
2011-06-07 15:56 ` Darren Hart
2011-06-07 15:58 ` Eric Dumazet
2011-06-07 18:43 ` Andrew Lutomirski
2011-06-07 19:01 ` Darren Hart
2011-06-07 19:04 ` Andrew Lutomirski
2011-06-07 19:06 ` Eric Dumazet
2011-06-07 19:10 ` David Oliver
2011-06-07 19:19 ` Andrew Lutomirski
2011-06-07 19:33 ` David Oliver
2011-06-07 19:53 ` Andrew Lutomirski
2011-06-07 20:04 ` David Oliver
2011-06-07 20:12 ` Andrew Lutomirski
2011-06-07 22:26 ` Kyle Moffett
2011-06-08 15:20 ` David Oliver
2011-06-08 15:21 ` Andrew Lutomirski
2011-06-08 16:21 ` Darren Hart
2011-06-09 11:37 ` KOSAKI Motohiro
2011-06-09 12:05 ` Peter Zijlstra
2011-06-09 17:58 ` Peter Zijlstra
2011-06-10 3:30 ` KOSAKI Motohiro
2011-06-10 3:26 ` KOSAKI Motohiro
2011-06-07 18:30 ` Joel Becker
2011-06-09 12:05 ` Peter Zijlstra
2011-06-10 12:10 ` KOSAKI Motohiro
2011-06-10 17:29 ` Darren Hart
2011-06-13 2:11 ` KOSAKI Motohiro
2011-06-13 15:50 ` Darren Hart
2011-06-15 18:50 ` Shawn Bohrer
2011-06-15 18:54 ` Darren Hart
2011-06-17 13:40 ` Shawn Bohrer
2011-06-22 19:19 ` [PATCH RFC] futex: Fix regression with read only mappings Shawn Bohrer
2011-06-22 20:14 ` Darren Hart
2011-06-23 2:51 ` KOSAKI Motohiro
2011-06-23 15:26 ` Darren Hart
2011-06-23 19:49 ` Shawn Bohrer [this message]
2011-06-24 15:59 ` [PATCH v2] " Shawn Bohrer
2011-06-25 0:37 ` Darren Hart
2011-06-25 15:10 ` KOSAKI Motohiro
2011-06-27 16:40 ` Shawn Bohrer
2011-06-27 18:15 ` Peter Zijlstra
2011-06-27 20:41 ` Darren Hart
2011-06-27 21:08 ` Shawn Bohrer
2011-06-27 21:39 ` Darren Hart
2011-06-27 22:14 ` Shawn Bohrer
2011-06-27 23:17 ` Darren Hart
2011-06-27 22:22 ` [PATCH v3] " Shawn Bohrer
2011-06-28 10:54 ` Peter Zijlstra
2011-06-28 14:52 ` Darren Hart
2011-06-28 17:38 ` Shawn Bohrer
2011-06-28 20:58 ` Darren Hart
2011-06-28 23:55 ` Darren Hart
2011-06-29 14:56 ` Shawn Bohrer
2011-06-29 15:17 ` [PATCH v4] " Shawn Bohrer
2011-06-29 18:41 ` Darren Hart
2011-06-29 23:38 ` Thomas Gleixner
2011-06-30 4:19 ` Darren Hart
2011-06-30 14:02 ` David C. Oliver
2011-06-30 15:41 ` Darren Hart
2011-06-30 16:21 ` [PATCH v5] " Shawn Bohrer
2011-07-12 15:27 ` Shawn Bohrer
2011-07-25 15:20 ` Shawn Bohrer
2011-07-25 19:28 ` Thomas Gleixner
2011-07-26 19:04 ` [tip:core/urgent] " tip-bot for Shawn Bohrer
2011-06-28 10:50 ` [PATCH v2] " Peter Zijlstra
2011-06-28 14:19 ` Darren Hart
2011-06-28 14:23 ` Peter Zijlstra
2011-06-23 3:58 ` [PATCH RFC] " Shawn Bohrer
2011-06-23 3:23 ` Change in functionality of futex() system call KOSAKI Motohiro
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=20110623194949.GA2083@BohrerMBP.rgmadvisors.com \
--to=sbohrer@rgmadvisors.com \
--cc=david@rgmadvisors.com \
--cc=dvhart@linux.intel.com \
--cc=eric.dumazet@gmail.com \
--cc=hughd@google.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=zvonler@rgmadvisors.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®