xemu/include
Greg Kurz a2166410ad spapr_pci: Unregister listeners before destroying the IOMMU address space
Hot-unplugging a PHB with a VFIO device connected to it crashes QEMU:

-device spapr-pci-host-bridge,index=1,id=phb1 \
-device vfio-pci,host=0034:01:00.3,id=vfio0

(qemu) device_del phb1
[  357.207183] iommu: Removing device 0001:00:00.0 from group 1
[  360.375523] rpadlpar_io: slot PHB 1 removed
qemu-system-ppc64: memory.c:2742:
 do_address_space_destroy: Assertion `QTAILQ_EMPTY(&as->listeners)' failed.

'as' is the IOMMU address space, which indeed has a listener registered
to by vfio_connect_container() when the VFIO device is realized. This
listener is supposed to be unregistered by vfio_disconnect_container()
when the VFIO device is finalized. Unfortunately, the VFIO device hasn't
reached finalize yet at the time the PHB unrealize function is called,
and address_space_destroy() gets called with the VFIO listener still
being registered.

All regions have just been unmapped from the address space. Listeners
aren't needed anymore at this point. Remove them before destroying the
address space.

The VFIO code will try to remove them _again_ at device finalize,
but it is okay since memory_listener_unregister() is idempotent.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <156110925375.92514.11649846071216864570.stgit@bahia.lan>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
[dwg: Correct spelling error pointed out by aik]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2019-07-02 09:43:58 +10:00
..
authz Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
block block: Add bdrv_child_refresh_perms() 2019-06-18 16:41:10 +02:00
chardev Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
crypto Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
disas Clean up a few header guard symbols 2019-06-12 13:20:20 +02:00
exec spapr_pci: Unregister listeners before destroying the IOMMU address space 2019-07-02 09:43:58 +10:00
fpu Supply missing header guards 2019-06-12 13:20:21 +02:00
hw xics/kvm: Add error propagation to ic*_set_kvm_state() functions 2019-07-02 09:43:58 +10:00
io Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
libdecnumber Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
migration vmstate: Add support for kernel integer types 2019-06-21 13:23:47 +02:00
monitor monitor: Replace monitor_init() with monitor_init_{hmp, qmp}() 2019-06-18 08:14:17 +02:00
net Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
qapi qapi: remove qmp_unregister_command() 2019-02-18 14:44:05 +01:00
qemu Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
qom Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
scsi Normalize header guard symbol definition. 2019-05-13 08:58:55 +02:00
standard-headers linux headers: update against Linux 5.2-rc1 2019-05-21 16:58:56 +02:00
sysemu target/i386: kvm: Add support for save and restore nested state 2019-06-21 13:23:47 +02:00
ui Supply missing header guards 2019-06-12 13:20:21 +02:00
elf.h linux-user: elf: ELF_HWCAP for s390x 2019-06-07 14:53:26 +02:00
glib-compat.h slirp: Move g_spawn_async_with_fds_qemu compatibility to slirp/ 2019-02-07 15:49:08 +02:00
qemu-common.h Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
qemu-io.h Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
trace-tcg.h trace: get rid of generated-events.h/generated-events.c 2016-10-12 09:54:52 +02:00