From: Jan Kara <jack@suse.cz>
To: Nick Piggin <npiggin@gmail.com>
Cc: Jeff Moyer <jmoyer@redhat.com>,
KOSAKI Motohiro <kosaki.motohiro@gmail.com>,
Jan Kara <jack@suse.cz>, Michael Kerrisk <mtk.manpages@gmail.com>,
LKML <linux-kernel@vger.kernel.org>,
linux-man@vger.kernel.org, linux-mm@kvack.org, mgorman@suse.de,
Andrea Arcangeli <aarcange@redhat.com>,
Woodman <lwoodman@redhat.com>
Subject: Re: [PATCH] Describe race of direct read and fork for unaligned buffers
Date: Wed, 2 May 2012 10:17:05 +0200 [thread overview]
Message-ID: <20120502081705.GB16976@quack.suse.cz> (raw)
In-Reply-To: <CAPa8GCCgLUt1EDAy7-O-mo0qir6Bf5Pi3Va1EsQ3ZW5UU=+37g@mail.gmail.com>
On Wed 02-05-12 01:50:46, Nick Piggin wrote:
> On 2 May 2012 01:38, Jeff Moyer <jmoyer@redhat.com> wrote:
> > KOSAKI Motohiro <kosaki.motohiro@gmail.com> writes:
> >
> >> On Tue, May 1, 2012 at 11:11 AM, Jeff Moyer <jmoyer@redhat.com> wrote:
> >>> KOSAKI Motohiro <kosaki.motohiro@gmail.com> writes:
> >>>
> >>>>> Hello,
> >>>>>
> >>>>> Thank you revisit this. But as far as my remember is correct, this issue is NOT
> >>>>> unaligned access issue. It's just get_user_pages(_fast) vs fork race issue. i.e.
> >>>>> DIRECT_IO w/ multi thread process should not use fork().
> >>>>
> >>>> The problem is, fork (and its COW logic) assume new access makes cow break,
> >>>> But page table protection can't detect a DMA write. Therefore DIO may override
> >>>> shared page data.
> >>>
> >>> Hm, I've only seen this with misaligned or multiple sub-page-sized reads
> >>> in the same page. AFAIR, aligned, page-sized I/O does not get split.
> >>> But, I could be wrong...
> >>
> >> If my remember is correct, the reproducer of past thread is misleading.
> >>
> >> dma_thread.c in
> >> http://lkml.indiana.edu/hypermail/linux/kernel/0903.1/01498.html has
> >> align parameter. But it doesn't only change align. Because of, every
> >> worker thread read 4K (pagesize), then
> >> - when offset is page aligned
> >> -> every page is accessed from only one worker
> >> - when offset is not page aligned
> >> -> every page is accessed from two workers
> >>
> >> But I don't remember why two threads are important things. hmm.. I'm
> >> looking into the code a while.
> >> Please don't 100% trust me.
> >
> > I bet Andrea or Larry would remember the details.
>
> KOSAKI-san is correct, I think.
>
> The race is something like this:
>
> DIO-read
> page = get_user_pages()
> fork()
> COW(page)
> touch(page)
> DMA(page)
> page_cache_release(page);
>
> So whether parent or child touches the page, determines who gets the
> actual DMA target, and who gets the copy.
OK, this is roughly what I understood from original threads as well. So
if our buffer is page aligned and its size is page aligned, you would hit
the corruption only if you do modify the buffer while IO to / from that buffer
is in progress. And that would seem like a really bad programming practice
anyway. So I still believe that having everything page size aligned will
effectively remove the problem although I agree it does not aim at the core
of it.
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-05-02 8:17 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-30 9:30 Jan Kara
2012-04-30 13:41 ` Jeff Moyer
2012-04-30 14:30 ` Mel Gorman
2012-05-01 5:50 ` Michael Kerrisk (man-pages)
2012-05-01 6:49 ` Nick Piggin
2012-05-01 14:31 ` KOSAKI Motohiro
2012-05-01 14:37 ` KOSAKI Motohiro
2012-05-01 15:11 ` Jeff Moyer
2012-05-01 15:34 ` KOSAKI Motohiro
2012-05-01 15:38 ` Jeff Moyer
2012-05-01 15:50 ` Nick Piggin
2012-05-01 23:51 ` Andrea Arcangeli
2012-05-02 8:17 ` Jan Kara [this message]
2012-05-02 9:09 ` Nick Piggin
2012-05-02 9:18 ` Jan Kara
2012-05-02 19:14 ` KOSAKI Motohiro
2012-05-02 19:23 ` Jan Kara
2012-05-02 19:25 ` KOSAKI Motohiro
2012-05-05 11:28 ` Michael Kerrisk (man-pages)
2012-05-05 15:29 ` KOSAKI Motohiro
2012-05-08 23:10 ` Nick Piggin
2012-05-09 5:35 ` Michael Kerrisk (man-pages)
2012-05-09 7:01 ` Nick Piggin
2012-05-09 7:18 ` Michael Kerrisk (man-pages)
2012-05-10 15:00 ` Jan Kara
2012-05-01 16:15 ` KOSAKI Motohiro
2012-05-01 17:56 ` Michael Kerrisk (man-pages)
2012-05-02 0:34 ` Nick Piggin
2012-05-02 3:04 ` Hugh Dickins
2012-05-02 3:10 ` Nick Piggin
2012-05-02 9:20 ` Jan Kara
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=20120502081705.GB16976@quack.suse.cz \
--to=jack@suse.cz \
--cc=aarcange@redhat.com \
--cc=jmoyer@redhat.com \
--cc=kosaki.motohiro@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-man@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lwoodman@redhat.com \
--cc=mgorman@suse.de \
--cc=mtk.manpages@gmail.com \
--cc=npiggin@gmail.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