From: Paolo Bonzini <pbonzini@redhat.com>
To: "Fernando Casas Schössow" <casasfernando@outlook.com>,
"Stefan Hajnoczi" <stefanha@gmail.com>
Cc: Natanael Copa <ncopa@alpinelinux.org>,
Richard Henderson <rth@twiddle.net>,
qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error
Date: Fri, 22 Feb 2019 15:55:16 +0100 [thread overview]
Message-ID: <ed1ffe8b-305b-9ae7-aa42-127f657622d7@redhat.com> (raw)
In-Reply-To: <VI1PR0602MB32457D7D0D6C05E83F14FE75A47F0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
On 22/02/19 15:43, Fernando Casas Schössow wrote:
> Hi all,
>
> Indeed I can confirm this issue occurs with the stock, unmodified
> QEMU binary provided with Alpine since at least Alpine 3.6 up to
> 3.9.
>
> Is there any compiler flag I can tweak, add or remove to rebuild qemu
> and try to repro to confirm a possible workaround?
Nope, not yet. However, I can try some experiments if you can provide
some information on how to rebuild an apk.
Paolo
> Thanks.
>
> Fernando
>
> Sent from my iPhone
>
>> On 22 Feb 2019, at 15:04, Stefan Hajnoczi <stefanha@gmail.com> wrote:
>>
>> On Fri, Feb 22, 2019 at 12:57 PM Fernando Casas Schössow
>> <casasfernando@outlook.com> wrote:
>>
>> I have CCed Natanael Copa, qemu package maintainer in Alpine Linux.
>>
>> Fernando: Can you confirm that the bug occurs with an unmodified
>> Alpine Linux qemu binary?
>>
>> Richard: Commit 7db2145a6826b14efceb8dd64bfe6ad8647072eb ("bswap: Add
>> host endian unaligned access functions") introduced the unaligned
>> memory access functions in question here. Please see below for
>> details on the bug - basically QEMU code assumes they are atomic, but
>> that is not guaranteed :(. Any ideas for how to fix this?
>>
>> Natanael: It seems likely that the qemu package in Alpine Linux
>> suffers from a compilation issue resulting in a broken QEMU. It may
>> be necessary to leave the compiler optimization flag alone in APKBUILD
>> to work around this problem.
>>
>> Here are the details. QEMU relies on the compiler turning
>> memcpy(&dst, &src, 2) turning into a load instruction in
>> include/qemu/bswap.h:lduw_he_p() (explanation below):
>>
>> /* Any compiler worth its salt will turn these memcpy into native unaligned
>> operations. Thus we don't need to play games with packed attributes, or
>> inline byte-by-byte stores. */
>>
>> static inline int lduw_he_p(const void *ptr)
>> {
>> uint16_t r;
>> memcpy(&r, ptr, sizeof(r));
>> return r;
>> }
>>
>> Here is the disassembly snippet of virtqueue_pop() from Fedora 29 that
>> shows the load instruction:
>>
>> 398166: 0f b7 42 02 movzwl 0x2(%rdx),%eax
>> 39816a: 66 89 43 32 mov %ax,0x32(%rbx)
>>
>> Here is the instruction sequence in the Alpine Linux binary:
>>
>> 455562: ba 02 00 00 00 mov $0x2,%edx
>> 455567: e8 74 24 f3 ff callq 3879e0 <memcpy@plt>
>> 45556c: 0f b7 44 24 42 movzwl 0x42(%rsp),%eax
>> 455571: 66 41 89 47 32 mov %ax,0x32(%r15)
>>
>> It's calling memcpy instead of using a load instruction.
>>
>> Fernando found that QEMU's virtqueue_pop() function sees bogus values
>> when loading a 16-bit guest RAM location. Paolo figured out that the
>> bogus value can be produced by memcpy() when another thread is
>> updating the 16-bit memory location simultaneously. This is a race
>> condition between one thread loading the 16-bit value and another
>> thread storing it (in this case a guest vcpu thread). Sometimes
>> memcpy() may load one old byte and one new byte, resulting in a bogus
>> value.
>>
>> The symptom that Fernando experienced is a "Virtqueue size exceeded"
>> error message from QEMU and then the virtio-blk or virtio-scsi device
>> stops working. This issue potentially affects other device emulation
>> code in QEMU as well, not just virtio devices.
>>
>> For the time being, I suggest tweaking the APKBUILD so the memcpy() is
>> not generated. Hopefully QEMU can make the code more portable in the
>> future so the compiler always does the expected thing, but this may
>> not be easily possible.
>>
>> Stefan
next prev parent reply other threads:[~2019-02-22 14:58 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-14 21:56 [Qemu-devel] Guest unresponsive after Virtqueue size exceeded error Fernando Casas Schössow
2017-06-16 6:58 ` Ladi Prosek
2017-06-16 10:11 ` Fernando Casas Schössow
2017-06-16 10:25 ` Ladi Prosek
2017-06-19 22:10 ` Fernando Casas Schössow
2017-06-20 5:59 ` Ladi Prosek
2017-06-20 6:30 ` Fernando Casas Schössow
2017-06-20 7:52 ` Ladi Prosek
2017-06-21 12:19 ` Fernando Casas Schössow
2017-06-22 7:43 ` Ladi Prosek
2017-06-23 6:29 ` Fernando Casas Schössow
[not found] ` <1498199343.2815.0@smtp-mail.outlook.com>
2017-06-24 8:34 ` Fernando Casas Schössow
2019-01-31 11:32 ` Fernando Casas Schössow
2019-02-01 5:48 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2019-02-01 8:17 ` Fernando Casas Schössow
2019-02-04 6:06 ` Stefan Hajnoczi
2019-02-04 7:24 ` Fernando Casas Schössow
[not found] ` <AM5PR0602MB32368CB5ADDEC05F42D8BC8FA46D0@AM5PR0602MB3236.eurprd06.prod.outlo ok.com>
2019-02-06 7:15 ` Fernando Casas Schössow
[not found] ` <AM5PR0602MB32368CB5ADDEC05F42D8BC8FA46D0@AM5PR0602MB3236.eurprd06.prod.outlo>
[not found] ` <VI1PR0602MB3245032D51A5DF45AF6E1952A46F0@VI1PR0602MB3245.eurprd06.prod.outlo ok.com>
2019-02-06 16:47 ` Fernando Casas Schössow
2019-02-11 3:17 ` Stefan Hajnoczi
2019-02-11 9:48 ` Fernando Casas Schössow
2019-02-18 7:21 ` Fernando Casas Schössow
[not found] ` <VI1PR0602MB3245424120D151F29884A7E2A4630@VI1PR0602MB3245.eurprd06.prod.outlo ok.com>
2019-02-19 7:26 ` Fernando Casas Schössow
2019-02-20 16:58 ` Stefan Hajnoczi
2019-02-20 17:53 ` Paolo Bonzini
2019-02-20 18:56 ` Fernando Casas Schössow
2019-02-21 11:11 ` Stefan Hajnoczi
2019-02-21 11:33 ` Fernando Casas Schössow
[not found] ` <VI1PR0602MB3245593855B029B427ED544FA47E0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
[not found] ` <CAJSP0QUs9Yz2-k1KyVMwpgx6RwY9cK7qdQRCQ74xmgXJPJR-qw@mail.gmail.com>
[not found] ` <VI1PR0602MB32453A8B5CBC0308C7D18F1DA47E0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
[not found] ` <CAJSP0QVxaW3tezjBN9owJHsxzE9h8_qcaeRr5zHHKxKJOeFnkQ@mail.gmail.com>
[not found] ` <CAJSP0QVXoZJ9MJ0qp4RM_m2fGJ8iFSyJMAU_X7mdiQvpOK59KA@mail.gmail.com>
[not found] ` <VI1PR0602MB324516419266A934FE7759C6A47E0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
[not found] ` <VI1PR0602MB324516419266A934FE7759C6A47E0@VI1PR0602MB3245.eurprd06.prod.outlo>
[not found] ` <VI1PR0602MB32454C17192EFA863E29CC49A47E0@VI1PR0602MB3245.eurprd06.prod.outlo>
[not found] ` <VI1PR0602MB324547F72DA9EDEB1613C888A47E0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
[not found] ` <CAJSP0QUg=cq3tCSLidQ9BR2hxAo3K6gA6LKtpx5Rjb=_6XgJ6Q@mail.gmail.com>
[not found] ` <28e6b4ed-9afd-3a79-6267-86c7385c23ce@redhat.com>
[not found] ` <VI1PR0602MB324578F91F1AF9390D03022FA47F0@VI1PR0602MB3245.eurprd06.prod.outlook.com>
2019-02-22 14:04 ` Stefan Hajnoczi
2019-02-22 14:38 ` Paolo Bonzini
2019-02-22 14:43 ` Fernando Casas Schössow
2019-02-22 14:55 ` Paolo Bonzini [this message]
2019-02-22 15:48 ` Fernando Casas Schössow
2019-02-22 16:37 ` Dr. David Alan Gilbert
2019-02-22 16:39 ` Paolo Bonzini
2019-02-22 16:47 ` Dr. David Alan Gilbert
2019-02-23 11:49 ` Natanael Copa
2019-02-26 13:30 ` Paolo Bonzini
2019-02-28 7:35 ` Fernando Casas Schössow
2019-02-23 15:55 ` Natanael Copa
2019-02-23 16:18 ` Peter Maydell
2019-02-25 10:24 ` Natanael Copa
2019-02-25 10:34 ` Peter Maydell
2019-02-25 12:15 ` Fernando Casas Schössow
2019-02-25 12:21 ` Natanael Copa
2019-02-25 13:06 ` Peter Maydell
2019-02-25 13:25 ` Natanael Copa
2019-02-25 13:32 ` Fernando Casas Schössow
[not found] ` <VI1PR0602MB3245A6B693B23DA2E0E8E500A47A0@VI1PR0602MB3245.eurprd06.prod.outlo ok.com>
2019-02-25 15:41 ` Fernando Casas Schössow
2019-02-28 9:58 ` Peter Maydell
2019-03-07 7:14 ` Fernando Casas Schössow
2019-02-23 16:21 ` Fernando Casas Schössow
2019-02-25 10:30 ` Stefan Hajnoczi
2019-02-25 10:33 ` Stefan Hajnoczi
2019-02-23 16:57 ` Peter Maydell
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=ed1ffe8b-305b-9ae7-aa42-127f657622d7@redhat.com \
--to=pbonzini@redhat.com \
--cc=casasfernando@outlook.com \
--cc=ncopa@alpinelinux.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=stefanha@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;
as well as URLs for NNTP newsgroup(s).