qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[BUG] Qemu abort with error "kvm_mem_ioeventfd_add: error adding ioevent


From: Hao Wang
Subject: [BUG] Qemu abort with error "kvm_mem_ioeventfd_add: error adding ioeventfd: File exists (17)"
Date: Fri, 12 Aug 2022 16:31:11 +0800
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0

Hi list,

When I did some tests in my virtual domain with live-attached virtio deivces, I 
got a coredump file of Qemu.

The error print from qemu is "kvm_mem_ioeventfd_add: error adding ioeventfd: 
File exists (17)".
And the call trace in the coredump file displays as below:
#0  0x0000ffff89acecc8 in ?? () from /usr/lib64/libc.so.6
#1  0x0000ffff89a8acbc in raise () from /usr/lib64/libc.so.6
#2  0x0000ffff89a78d2c in abort () from /usr/lib64/libc.so.6
#3  0x0000aaaabd7ccf1c in kvm_mem_ioeventfd_add (listener=<optimized out>, 
section=<optimized out>, match_data=<optimized out>, data=<optimized out>, 
e=<optimized out>) at ../accel/kvm/kvm-all.c:1607
#4  0x0000aaaabd6e0304 in address_space_add_del_ioeventfds (fds_old_nb=164, 
fds_old=0xffff5c80a1d0, fds_new_nb=160, fds_new=0xffff5c565080, 
as=0xaaaabdfa8810 <address_space_memory>)
    at ../softmmu/memory.c:795
#5  address_space_update_ioeventfds (as=0xaaaabdfa8810 <address_space_memory>) 
at ../softmmu/memory.c:856
#6  0x0000aaaabd6e24d8 in memory_region_commit () at ../softmmu/memory.c:1113
#7  0x0000aaaabd6e25c4 in memory_region_transaction_commit () at 
../softmmu/memory.c:1144
#8  0x0000aaaabd394eb4 in pci_bridge_update_mappings 
(br=br@entry=0xaaaae755f7c0) at ../hw/pci/pci_bridge.c:248
#9  0x0000aaaabd394f4c in pci_bridge_write_config (d=0xaaaae755f7c0, 
address=44, val=<optimized out>, len=4) at ../hw/pci/pci_bridge.c:272
#10 0x0000aaaabd39a928 in rp_write_config (d=0xaaaae755f7c0, address=44, 
val=128, len=4) at ../hw/pci-bridge/pcie_root_port.c:39
#11 0x0000aaaabd6df328 in memory_region_write_accessor (mr=0xaaaae63898d0, 
addr=65580, value=<optimized out>, size=4, shift=<optimized out>, 
mask=<optimized out>, attrs=...) at ../softmmu/memory.c:494
#12 0x0000aaaabd6dcb6c in access_with_adjusted_size (addr=addr@entry=65580, 
value=value@entry=0xffff817adc78, size=size@entry=4, access_size_min=<optimized 
out>, access_size_max=<optimized out>,
    access_fn=access_fn@entry=0xaaaabd6df284 <memory_region_write_accessor>, 
mr=mr@entry=0xaaaae63898d0, attrs=attrs@entry=...) at ../softmmu/memory.c:556
#13 0x0000aaaabd6e0dc8 in memory_region_dispatch_write 
(mr=mr@entry=0xaaaae63898d0, addr=65580, data=<optimized out>, op=MO_32, 
attrs=attrs@entry=...) at ../softmmu/memory.c:1534
#14 0x0000aaaabd6d0574 in flatview_write_continue (fv=fv@entry=0xffff5c02da00, 
addr=addr@entry=275146407980, attrs=attrs@entry=..., 
ptr=ptr@entry=0xffff8aa8c028, len=len@entry=4,
    addr1=<optimized out>, l=<optimized out>, mr=mr@entry=0xaaaae63898d0) at 
/usr/src/debug/qemu-6.2.0-226.aarch64/include/qemu/host-utils.h:165
#15 0x0000aaaabd6d4584 in flatview_write (len=4, buf=0xffff8aa8c028, attrs=..., 
addr=275146407980, fv=0xffff5c02da00) at ../softmmu/physmem.c:3375
#16 address_space_write (as=<optimized out>, addr=275146407980, attrs=..., 
buf=buf@entry=0xffff8aa8c028, len=4) at ../softmmu/physmem.c:3467
#17 0x0000aaaabd6d462c in address_space_rw (as=<optimized out>, addr=<optimized 
out>, attrs=..., attrs@entry=..., buf=buf@entry=0xffff8aa8c028, len=<optimized 
out>, is_write=<optimized out>)
    at ../softmmu/physmem.c:3477
#18 0x0000aaaabd7cf6e8 in kvm_cpu_exec (cpu=cpu@entry=0xaaaae625dfd0) at 
../accel/kvm/kvm-all.c:2970
#19 0x0000aaaabd7d09bc in kvm_vcpu_thread_fn (arg=arg@entry=0xaaaae625dfd0) at 
../accel/kvm/kvm-accel-ops.c:49
#20 0x0000aaaabd94ccd8 in qemu_thread_start (args=<optimized out>) at 
../util/qemu-thread-posix.c:559


By printing more info in the coredump file, I found that the addr of 
fds_old[146] and fds_new[146] are same, but fds_old[146] belonged to a 
live-attached virtio-scsi device while fds_new[146] was owned by another 
live-attached virtio-net.
The reason why addr conflicted was then been found from vm's console log. Just 
before qemu aborted, the guest kernel crashed and kdump.service booted the 
dump-capture kernel where re-alloced address for the devices.
Because those virtio devices were live-attached after vm creating, different 
addr may been assigned to them in the dump-capture kernel:

the initial kernel booting log:
[    1.663297] pci 0000:00:02.1: BAR 14: assigned [mem 0x11900000-0x11afffff]
[    1.664560] pci 0000:00:02.1: BAR 15: assigned [mem 
0x8001800000-0x80019fffff 64bit pref]

the dump-capture kernel booting log:
[    1.845211] pci 0000:00:02.0: BAR 14: assigned [mem 0x11900000-0x11bfffff]
[    1.846542] pci 0000:00:02.0: BAR 15: assigned [mem 
0x8001800000-0x8001afffff 64bit pref]


I think directly aborting the qemu process may not be the best choice in this 
case cuz it will interrupt the work of kdump.service so that failed to generate 
memory dump of the crashed guest kernel.
Perhaps, IMO, the error could be simply ignored in this case and just let kdump 
to reboot the system after memory-dump finishing, but I failed to find a 
suitable judgment in the codes.

Any solution for this problem? Hope I can get some helps here.

Hao



reply via email to

[Prev in Thread] Current Thread [Next in Thread]