From: Jan Kara <jack@suse.cz>
To: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: Jan Kara <jack@suse.cz>, Daniel Phillips <daniel@phunq.net>,
David Lang <david@lang.hm>, Rik van Riel <riel@redhat.com>,
tux3@tux3.org, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org
Subject: Re: [FYI] tux3: Core changes
Date: Tue, 23 Jun 2015 18:12:47 +0200 [thread overview]
Message-ID: <20150623161247.GP2427@quack.suse.cz> (raw)
In-Reply-To: <87a8vtdqfz.fsf@mail.parknet.co.jp>
On Mon 22-06-15 00:36:00, OGAWA Hirofumi wrote:
> Jan Kara <jack@suse.cz> writes:
> > So there are a few things to have in mind:
> > 1) There is nothing like a "writeable" page. Page is always writeable (at
> > least on x86 architecture). When a page is mapped into some virtual address
> > space (or more of them), this *mapping* can be either writeable or read-only.
> > mkwrite changes the mapping from read-only to writeable but kernel /
> > hardware is free to write to the page regardless of the mapping.
> >
> > 2) When kernel / hardware writes to the page, it first modifies the page
> > and then marks it dirty.
> >
> > So what can happen in this scenario is:
> >
> > 1) You hand kernel a part of a page as a buffer. page_mkwrite() happens,
> > page is dirtied, kernel notes a PFN of the page somewhere internally.
> >
> > 2) Writeback comes and starts writeback for the page.
> >
> > 3) Kernel ships the PFN to the hardware.
> >
> > 4) Userspace comes and wants to write to the page (different part than the
> > HW is instructed to use). page_mkwrite is called, page is forked.
> > Userspace writes to the forked page.
> >
> > 5) HW stores its data in the original page.
> >
> > Userspace never sees data from the HW! Data corrupted where without page
> > forking everything would work just fine.
>
> I'm not sure I'm understanding your pseudocode logic correctly though.
> This logic doesn't seems to be a page forking specific issue. And
> this pseudocode logic seems to be missing the locking and revalidate of
> page.
>
> If you can show more details, it would be helpful to see more, and
> discuss the issue of page forking, or we can think about how to handle
> the corner cases.
>
> Well, before that, why need more details?
>
> For example, replace the page fork at (4) with "truncate", "punch
> hole", or "invalidate page".
>
> Those operations remove the old page from radix tree, so the
> userspace's write creates the new page, and HW still refererences the
> old page. (I.e. situation should be same with page forking, in my
> understand of this pseudocode logic.)
Yes, if userspace truncates the file, the situation we end up with is
basically the same. However for truncate to happen some malicious process
has to come and truncate the file - a failure scenario that is acceptable
for most use cases since it doesn't happen unless someone is actively
trying to screw you. With page forking it is enough for flusher thread
to start writeback for that page to trigger the problem - event that is
basically bound to happen without any other userspace application
interfering.
> IOW, this pseudocode logic seems to be broken without page forking if
> no lock and revalidate. Usually, we prevent unpleasant I/O by
> lock_page or PG_writeback, and an obsolated page is revalidated under
> lock_page.
Well, good luck with converting all the get_user_pages() users in kernel to
use lock_page() or PG_writeback checks to avoid issues with page forking. I
don't think that's really feasible.
> For page forking, we may also be able to prevent similar situation by
> locking, flags, and revalidate. But those details might be different
> with current code, because page states are different.
Sorry, I don't understand what do you mean in this paragraph. Can you
explain it a bit more?
> > Another possible scenario:
> >
> > 1) Userspace app tells kernel to setup a HW buffer in a page.
> >
> > 2) Userspace app fills page with data -> page_mkwrite is called, page is
> > dirtied.
> >
> > 3) Userspace app tells kernel to ship buffer to video HW.
> >
> > 4) Writeback comes and starts writeback for the page
> >
> > 5) Video HW is done with the page. Userspace app fills new set of data into
> > the page -> page_mkwrite is called, page is forked.
> >
> > 6) Userspace app tells kernel to ship buffer to video HW. But HW gets the
> > old data from the original page.
> >
> > Again a data corruption issue where previously things were working fine.
>
> This logic seems to be same as above. Replace the page fork at (5).
> With no revalidate of page, (6) will use the old page.
Yes, the same arguments as above apply...
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
next prev parent reply other threads:[~2015-06-23 16:13 UTC|newest]
Thread overview: 156+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-28 23:13 Tux3 Report: How fast can we fsync? Daniel Phillips
2015-04-29 2:21 ` Mike Galbraith
2015-04-29 6:01 ` Daniel Phillips
2015-04-29 6:20 ` Richard Weinberger
2015-04-29 6:56 ` Daniel Phillips
2015-04-29 6:33 ` Mike Galbraith
2015-04-29 7:23 ` Daniel Phillips
2015-04-29 16:42 ` Mike Galbraith
2015-04-29 19:05 ` xfs: does mkfs.xfs require fancy switches to get decent performance? (was Tux3 Report: How fast can we fsync?) Mike Galbraith
2015-04-29 19:20 ` Austin S Hemmelgarn
2015-04-29 21:12 ` Daniel Phillips
2015-04-30 4:40 ` Mike Galbraith
2015-04-30 0:20 ` Dave Chinner
2015-04-30 3:35 ` Mike Galbraith
2015-04-30 9:00 ` Martin Steigerwald
2015-04-30 14:57 ` Theodore Ts'o
2015-04-30 15:59 ` Daniel Phillips
2015-04-30 17:59 ` Martin Steigerwald
2015-04-30 11:14 ` Daniel Phillips
2015-04-30 12:07 ` Mike Galbraith
2015-04-30 12:58 ` Daniel Phillips
2015-04-30 13:48 ` Mike Galbraith
2015-04-30 14:07 ` Daniel Phillips
2015-04-30 14:28 ` Howard Chu
2015-04-30 15:14 ` Daniel Phillips
2015-04-30 16:00 ` Howard Chu
2015-04-30 18:22 ` Christian Stroetmann
2015-05-11 22:12 ` Pavel Machek
2015-05-11 23:17 ` Theodore Ts'o
2015-05-12 2:34 ` Daniel Phillips
2015-05-12 5:38 ` Dave Chinner
2015-05-12 6:18 ` Daniel Phillips
2015-05-12 18:39 ` David Lang
2015-05-12 20:54 ` Daniel Phillips
2015-05-12 21:30 ` David Lang
2015-05-12 22:27 ` Daniel Phillips
2015-05-12 22:35 ` David Lang
2015-05-12 23:55 ` Theodore Ts'o
2015-05-13 1:26 ` Daniel Phillips
2015-05-13 19:09 ` Martin Steigerwald
2015-05-13 19:37 ` Daniel Phillips
2015-05-13 20:02 ` Jeremy Allison
2015-05-13 20:24 ` Daniel Phillips
2015-05-13 20:25 ` Martin Steigerwald
2015-05-13 20:38 ` Daniel Phillips
2015-05-13 21:10 ` Martin Steigerwald
2015-05-13 0:31 ` Daniel Phillips
2015-05-12 21:30 ` Christian Stroetmann
2015-05-13 7:20 ` Pavel Machek
2015-05-12 9:03 ` Pavel Machek
2015-05-12 11:22 ` Daniel Phillips
2015-05-12 13:26 ` Howard Chu
2015-05-11 23:53 ` Daniel Phillips
2015-05-12 0:12 ` David Lang
2015-05-12 4:36 ` Daniel Phillips
2015-05-12 17:30 ` Christian Stroetmann
2015-05-13 7:25 ` Pavel Machek
2015-05-13 11:31 ` Daniel Phillips
2015-05-13 12:41 ` Daniel Phillips
2015-05-13 13:08 ` Mike Galbraith
2015-05-13 13:15 ` Daniel Phillips
2015-04-30 14:33 ` Mike Galbraith
2015-04-30 15:24 ` Daniel Phillips
2015-04-29 20:40 ` Tux3 Report: How fast can we fsync? Daniel Phillips
2015-04-29 22:06 ` OGAWA Hirofumi
2015-04-30 3:57 ` Mike Galbraith
2015-04-30 3:50 ` Mike Galbraith
2015-04-30 10:59 ` Daniel Phillips
2015-04-30 1:46 ` Dave Chinner
2015-04-30 10:28 ` Daniel Phillips
2015-05-01 15:38 ` Dave Chinner
2015-05-01 23:20 ` Daniel Phillips
2015-05-02 1:07 ` David Lang
2015-05-02 10:26 ` Daniel Phillips
2015-05-02 16:00 ` Christian Stroetmann
2015-05-02 16:30 ` Richard Weinberger
2015-05-02 17:00 ` Christian Stroetmann
2015-05-12 17:41 ` Daniel Phillips
2015-05-12 17:46 ` Tux3 Report: How fast can we fail? Daniel Phillips
2015-05-13 22:07 ` Daniel Phillips
2015-05-26 10:03 ` Pavel Machek
2015-05-27 7:37 ` Mosis Tembo
2015-05-27 14:04 ` Austin S Hemmelgarn
2015-05-27 15:21 ` Mosis Tembo
2015-05-27 15:37 ` Austin S Hemmelgarn
[not found] ` <CAKvzQAtfzyN7yV0m=3jb1QZuaB8EF9VOs=poTpku2hJJ5Ce86w@mail.gmail.com>
2015-05-27 18:28 ` Daniel Phillips
2015-05-27 21:39 ` Pavel Machek
2015-05-27 22:46 ` Daniel Phillips
2015-05-28 12:55 ` Austin S Hemmelgarn
2015-05-14 7:37 ` [WIP] tux3: Optimized fsync Daniel Phillips
2015-05-14 8:26 ` [FYI] tux3: Core changes Daniel Phillips
2015-05-14 12:59 ` Rik van Riel
2015-05-15 0:06 ` Daniel Phillips
2015-05-15 3:06 ` Rik van Riel
2015-05-15 8:09 ` Mel Gorman
2015-05-15 9:54 ` Daniel Phillips
2015-05-15 11:00 ` Mel Gorman
2015-05-16 22:38 ` David Lang
2015-05-18 12:57 ` Mel Gorman
2015-05-15 9:38 ` Daniel Phillips
2015-05-27 7:41 ` Pavel Machek
2015-05-27 18:09 ` Daniel Phillips
2015-05-27 21:37 ` Pavel Machek
2015-05-27 22:33 ` Daniel Phillips
2015-05-15 8:05 ` Mel Gorman
2015-05-17 13:26 ` Boaz Harrosh
2015-05-18 2:20 ` Rik van Riel
2015-05-18 7:58 ` Boaz Harrosh
2015-05-19 4:46 ` Daniel Phillips
2015-05-21 19:43 ` [WIP][PATCH] tux3: preliminatry nospace handling Daniel Phillips
2015-05-19 14:00 ` [FYI] tux3: Core changes Jan Kara
2015-05-19 19:18 ` Daniel Phillips
2015-05-19 20:33 ` David Lang
2015-05-20 14:44 ` Jan Kara
2015-05-20 16:22 ` Daniel Phillips
2015-05-20 18:01 ` David Lang
2015-05-20 19:53 ` Rik van Riel
2015-05-20 22:51 ` Daniel Phillips
2015-05-21 3:24 ` Daniel Phillips
2015-05-21 3:51 ` David Lang
2015-05-21 19:53 ` Daniel Phillips
2015-05-26 4:25 ` Rik van Riel
2015-05-26 4:30 ` Daniel Phillips
2015-05-26 6:04 ` David Lang
2015-05-26 6:11 ` Daniel Phillips
2015-05-26 6:13 ` David Lang
2015-05-26 8:09 ` Daniel Phillips
2015-05-26 10:13 ` Pavel Machek
2015-05-26 7:09 ` Jan Kara
2015-05-26 8:08 ` Daniel Phillips
2015-05-26 9:00 ` Jan Kara
2015-05-26 20:22 ` Daniel Phillips
2015-05-26 21:36 ` Rik van Riel
2015-05-26 21:49 ` Daniel Phillips
2015-05-27 8:41 ` Jan Kara
2015-06-21 15:36 ` OGAWA Hirofumi
2015-06-23 16:12 ` Jan Kara [this message]
2015-07-05 12:54 ` OGAWA Hirofumi
2015-07-09 16:05 ` Jan Kara
2015-07-31 4:44 ` OGAWA Hirofumi
[not found] ` <CAGDaZ_oa7BY=70-7CGKoCFqnXbQjYVZ5pCurXh+FaGyKSv2Feg@mail.gmail.com>
2015-07-31 17:27 ` Daniel Phillips
2015-07-31 18:29 ` David Lang
2015-07-31 18:43 ` Daniel Phillips
2015-07-31 22:12 ` Daniel Phillips
2015-07-31 22:27 ` David Lang
2015-08-01 0:00 ` Daniel Phillips
2015-08-01 0:16 ` Daniel Phillips
2015-08-03 13:07 ` Jan Kara
2015-08-18 16:39 ` Rik van Riel
2015-08-03 13:42 ` Jan Kara
2015-08-09 13:42 ` OGAWA Hirofumi
2015-08-10 12:45 ` Jan Kara
2015-08-16 19:42 ` OGAWA Hirofumi
2015-05-26 10:22 ` Sergey Senozhatsky
2015-05-26 12:33 ` Jan Kara
2015-05-26 19:18 ` Daniel Phillips
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=20150623161247.GP2427@quack.suse.cz \
--to=jack@suse.cz \
--cc=daniel@phunq.net \
--cc=david@lang.hm \
--cc=hirofumi@mail.parknet.co.jp \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=riel@redhat.com \
--cc=tux3@tux3.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome