From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Anton Nefedov <anton.nefedov@virtuozzo.com>,
Alberto Garcia <berto@igalia.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [RFC 0/3] block/file-posix: Work around XFS bug
Date: Fri, 25 Oct 2019 11:58:46 +0200 [thread overview]
Message-ID: <20191025095849.25283-1-mreitz@redhat.com> (raw)
Hi,
It seems to me that there is a bug in Linux’s XFS kernel driver, as
I’ve explained here:
https://lists.nongnu.org/archive/html/qemu-block/2019-10/msg01429.html
In combination with our commit c8bb23cbdbe32f, this may lead to guest
data corruption when using qcow2 images on XFS with aio=native.
We can’t wait until the XFS kernel driver is fixed, we should work
around the problem ourselves.
This is an RFC for two reasons:
(1) I don’t know whether this is the right way to address the issue,
(2) Ideally, we should detect whether the XFS kernel driver is fixed and
if so stop applying the workaround.
I don’t know how we would go about this, so this series doesn’t do
it. (Hence it’s an RFC.)
(3) Perhaps it’s a bit of a layering violation to let the file-posix
driver access and modify a BdrvTrackedRequest object.
As for how we can address the issue, I see three ways:
(1) The one presented in this series: On XFS with aio=native, we extend
tracked requests for post-EOF fallocate() calls (i.e., write-zero
operations) to reach until infinity (INT64_MAX in practice), mark
them serializing and wait for other conflicting requests.
Advantages:
+ Limits the impact to very specific cases
(And that means it wouldn’t hurt too much to keep this workaround
even when the XFS driver has been fixed)
+ Works around the bug where it happens, namely in file-posix
Disadvantages:
- A bit complex
- A bit of a layering violation (should file-posix have access to
tracked requests?)
(2) Always skip qcow2’s handle_alloc_space() on XFS. The XFS bug only
becomes visible due to that function: I don’t think qcow2 writes
zeroes in any other I/O path, and raw images are fixed in size so
post-EOF writes won’t happen.
Advantages:
+ Maybe simpler, depending on how difficult it is to handle the
layering violation
+ Also fixes the performance problem of handle_alloc_space() being
slow on ppc64+XFS.
Disadvantages:
- Huge layering violation because qcow2 would need to know whether
the image is stored on XFS or not.
- We’d definitely want to skip this workaround when the XFS driver
has been fixed, so we need some method to find out whether it has
(3) Drop handle_alloc_space(), i.e. revert c8bb23cbdbe32f.
To my knowledge I’m the only one who has provided any benchmarks for
this commit, and even then I was a bit skeptical because it performs
well in some cases and bad in others. I concluded that it’s
probably worth it because the “some cases” are more likely to occur.
Now we have this problem of corruption here (granted due to a bug in
the XFS driver), and another report of massively degraded
performance on ppc64
(https://bugzilla.redhat.com/show_bug.cgi?id=1745823 – sorry, a
private BZ; I hate that :-/ The report is about 40 % worse
performance for an in-guest fio write benchmark.)
So I have to ask the question about what the justification for
keeping c8bb23cbdbe32f is. How much does performance increase with
it actually? (On non-(ppc64+XFS) machines, obviously)
Advantages:
+ Trivial
+ No layering violations
+ We wouldn’t need to keep track of whether the kernel bug has been
fixed or not
+ Fixes the ppc64+XFS performance problem
Disadvantages:
- Reverts cluster allocation performance to pre-c8bb23cbdbe32f
levels, whatever that means
So this is the main reason this is an RFC: What should we do? Is (1)
really the best choice?
In any case, I’ve ran the test case I showed in
https://lists.nongnu.org/archive/html/qemu-block/2019-10/msg01282.html
more than ten times with this series applied and the installation
succeeded every time. (Without this series, it fails like every other
time.)
Max Reitz (3):
block: Make wait/mark serialising requests public
block/file-posix: Detect XFS with CONFIG_FALLOCATE
block/file-posix: Let post-EOF fallocate serialize
include/block/block_int.h | 3 +++
block/file-posix.c | 46 +++++++++++++++++++++++++++++++++++++--
block/io.c | 24 ++++++++++----------
3 files changed, 59 insertions(+), 14 deletions(-)
--
2.21.0
next reply other threads:[~2019-10-25 10:09 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 9:58 Max Reitz [this message]
2019-10-25 9:58 ` [RFC 1/3] block: Make wait/mark serialising requests public Max Reitz
2019-10-25 9:58 ` [RFC 2/3] block/file-posix: Detect XFS with CONFIG_FALLOCATE Max Reitz
2019-10-25 10:19 ` Kevin Wolf
2019-10-25 10:22 ` Max Reitz
2019-10-25 10:35 ` Kevin Wolf
2019-10-25 10:41 ` Max Reitz
2019-10-26 17:26 ` Nir Soffer
2019-10-25 9:58 ` [RFC 3/3] block/file-posix: Let post-EOF fallocate serialize Max Reitz
2019-10-26 17:28 ` Nir Soffer
2019-10-25 13:40 ` [RFC 0/3] block/file-posix: Work around XFS bug Vladimir Sementsov-Ogievskiy
2019-10-25 13:56 ` Vladimir Sementsov-Ogievskiy
2019-10-25 14:19 ` Max Reitz
2019-10-25 14:35 ` Kevin Wolf
2019-10-25 14:36 ` Vladimir Sementsov-Ogievskiy
2019-10-27 12:21 ` Stefan Hajnoczi
2019-11-04 14:03 ` Alberto Garcia
2019-11-04 14:25 ` Max Reitz
2019-11-04 15:12 ` Alberto Garcia
2019-11-04 15:14 ` Max Reitz
2019-11-04 15:49 ` Alberto Garcia
2019-11-04 16:07 ` Max Reitz
2019-10-25 13:46 ` Peter Maydell
2019-10-25 14:16 ` Max Reitz
2019-10-25 14:17 ` Peter Maydell
2019-10-25 14:21 ` Max Reitz
2019-10-25 14:56 ` Peter Maydell
2019-10-26 0:14 ` no-reply
2019-10-26 17:37 ` Nir Soffer
2019-10-26 17:52 ` Vladimir Sementsov-Ogievskiy
2019-10-28 8:56 ` Max Reitz
2019-10-27 12:35 ` Stefan Hajnoczi
2019-10-28 9:24 ` Max Reitz
2019-10-28 9:30 ` Max Reitz
2019-10-28 9:56 ` Max Reitz
2019-10-28 10:07 ` Vladimir Sementsov-Ogievskiy
2019-10-28 10:10 ` Max Reitz
2019-10-28 11:19 ` Vladimir Sementsov-Ogievskiy
2019-10-28 11:04 ` Kevin Wolf
2019-10-28 11:25 ` Vladimir Sementsov-Ogievskiy
2019-10-29 8:50 ` Max Reitz
2019-10-29 11:48 ` Vladimir Sementsov-Ogievskiy
2019-10-29 11:55 ` Max Reitz
2019-10-29 12:05 ` Vladimir Sementsov-Ogievskiy
2019-10-29 12:11 ` Max Reitz
2019-10-29 12:19 ` Vladimir Sementsov-Ogievskiy
2019-10-29 12:23 ` Max Reitz
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=20191025095849.25283-1-mreitz@redhat.com \
--to=mreitz@redhat.com \
--cc=anton.nefedov@virtuozzo.com \
--cc=berto@igalia.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.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 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.