[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size ex
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error |
Date: |
Mon, 25 Feb 2019 10:30:44 +0000 |
On Sat, Feb 23, 2019 at 3:55 PM Natanael Copa <address@hidden> wrote:
> On Fri, 22 Feb 2019 14:04:20 +0000
> Stefan Hajnoczi <address@hidden> wrote:
> > On Fri, Feb 22, 2019 at 12:57 PM Fernando Casas Schössow
> > <address@hidden> wrote:
> I tried to find this section. How do you get the assembly listing of
> relevant secion? I tried to do "disas virtio_pop" from
> `gdb /usr/bin/qemu-system-x86_64` from the binary in alpine edge. I
> could find 2 memcpy but none of them look like a 16 bit operation after:
>
> 0x00000000004551f1 <+353>: mov 0x10(%rsp),%rdi
> 0x00000000004551f6 <+358>: mov $0x10,%edx
> 0x00000000004551fb <+363>: callq 0x3879e0 <address@hidden>
> 0x0000000000455200 <+368>: movzwl 0x5c(%rsp),%eax
> 0x0000000000455205 <+373>: test $0x4,%al
> 0x0000000000455207 <+375>: je 0x4552aa <virtqueue_pop+538>
>
> ....
>
> 0x0000000000455291 <+513>: mov 0x10(%rsp),%rdi
> 0x0000000000455296 <+518>: mov $0x10,%edx
> 0x000000000045529b <+523>: callq 0x3879e0 <address@hidden>
> 0x00000000004552a0 <+528>: mov %rbp,0x20(%rsp)
> 0x00000000004552a5 <+533>: movzwl 0x5c(%rsp),%eax
> 0x00000000004552aa <+538>: lea 0x20e0(%rsp),%rdi
> 0x00000000004552b2 <+546>: xor %r11d,%r11d
> 0x00000000004552b5 <+549>: mov %r15,0x38(%rsp)
Here is the beginning of the function:
0000000000455090 <virtqueue_pop@@Base>:
455090: 41 57 push %r15
455092: 49 89 ff mov %rdi,%r15
455095: b9 0e 00 00 00 mov $0xe,%ecx
45509a: 41 56 push %r14
45509c: 41 55 push %r13
45509e: 41 54 push %r12
4550a0: 55 push %rbp
4550a1: 53 push %rbx
4550a2: 48 81 ec f8 60 00 00 sub $0x60f8,%rsp
4550a9: 4d 8b 67 58 mov 0x58(%r15),%r12
4550ad: 48 89 74 24 08 mov %rsi,0x8(%rsp)
4550b2: 48 8d 6c 24 70 lea 0x70(%rsp),%rbp
4550b7: 48 89 ef mov %rbp,%rdi
4550ba: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
4550c1: 00 00
4550c3: 48 89 84 24 e8 60 00 mov %rax,0x60e8(%rsp)
4550ca: 00
4550cb: 31 c0 xor %eax,%eax
4550cd: 41 80 bc 24 6b 01 00 cmpb $0x0,0x16b(%r12)
4550d4: 00 00
4550d6: f3 48 ab rep stos %rax,%es:(%rdi)
4550d9: 0f 85 c1 04 00 00 jne 4555a0 <virtqueue_pop@@Base+0x510>
4550df: 48 8b 1d f2 4e 99 00 mov 0x994ef2(%rip),%rbx
# de9fd8 <rcu_reader@@Base+0xde9f20>
4550e6: 64 8b 43 0c mov %fs:0xc(%rbx),%eax
4550ea: 8d 50 01 lea 0x1(%rax),%edx
4550ed: 64 89 53 0c mov %edx,%fs:0xc(%rbx)
4550f1: 85 c0 test %eax,%eax
4550f3: 0f 84 d7 03 00 00 je 4554d0 <virtqueue_pop@@Base+0x440>
4550f9: 49 83 7f 18 00 cmpq $0x0,0x18(%r15)
4550fe: 0f 84 7d 03 00 00 je 455481 <virtqueue_pop@@Base+0x3f1>
455104: 41 0f b7 47 30 movzwl 0x30(%r15),%eax
455109: 66 41 39 47 32 cmp %ax,0x32(%r15)
45510e: 0f 84 0c 04 00 00 je 455520 <virtqueue_pop@@Base+0x490>
This last branch leads to:
455520: 4c 89 ff mov %r15,%rdi
455523: e8 78 b4 ff ff callq 4509a0
<virtio_queue_host_notifier_read@@Base+0x6d0>
455528: 48 83 b8 90 00 00 00 cmpq $0x3,0x90(%rax)
45552f: 03
455530: 0f 86 98 03 00 00 jbe 4558ce <virtqueue_pop@@Base+0x83e>
455536: 48 8b 90 80 00 00 00 mov 0x80(%rax),%rdx
45553d: 48 85 d2 test %rdx,%rdx
455540: 0f 84 c2 02 00 00 je 455808 <virtqueue_pop@@Base+0x778>
455546: 48 8d 72 02 lea 0x2(%rdx),%rsi
45554a: 48 8d 7c 24 42 lea 0x42(%rsp),%rdi
45554f: 48 39 fe cmp %rdi,%rsi
455552: 76 09 jbe 45555d <virtqueue_pop@@Base+0x4cd>
455554: 48 8d 47 02 lea 0x2(%rdi),%rax
455558: 48 39 c6 cmp %rax,%rsi
45555b: 72 3c jb 455599 <virtqueue_pop@@Base+0x509>
45555d: 48 39 fe cmp %rdi,%rsi
455560: 72 2e jb 455590 <virtqueue_pop@@Base+0x500>
455562: ba 02 00 00 00 mov $0x2,%edx
455567: e8 74 24 f3 ff callq 3879e0 <address@hidden>
> I can test different CFLAGS with and without the _FORTIFY_SOURCE and
> with different variants of memcpy (like __builtint_memcpy etc) but i
> need find a way to get the correct assembly output so I know if/when I
> have found something that works.
Good. I think tweaking the compilation flags is the quickest
workaround to produce a working QEMU binary for Alpine. Other distros
don't seem to hit this problem.
In the longer term QEMU will need to fix these memory accessor
functions in the way that Peter described, but doing that properly
requires auditing all the code so each instance that relies on
atomicity can be converted properly (and the other ones will stay
non-atomic because they must support misaligned addresses).
Stefan
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, (continued)
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Natanael Copa, 2019/02/23
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Natanael Copa, 2019/02/23
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Peter Maydell, 2019/02/23
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Natanael Copa, 2019/02/25
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Peter Maydell, 2019/02/25
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Fernando Casas Schössow, 2019/02/23
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error,
Stefan Hajnoczi <=
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Stefan Hajnoczi, 2019/02/25
- Re: [Qemu-devel] [Qemu-block] Guest unresponsive after Virtqueue size exceeded error, Peter Maydell, 2019/02/23