From 26ad7ab7a6c2b626d79bde63f9a5199d8ed9362a Mon Sep 17 00:00:00 2001 Message-Id: <26ad7ab7a6c2b626d79bde63f9a5199d8ed9362a.1382534061.git.jdenemar@redhat.com> From: Laine Stump Date: Mon, 21 Oct 2013 10:13:00 -0600 Subject: [PATCH] qemu: fix removal of This patch (and the two patches that precede it) resolve: https://bugzilla.redhat.com/show_bug.cgi?id=1005682 When libvirt was changed to delay the final cleanup of device removal until the qemu process had signaled it with a DEVICE_DELETED event for that device, the hostdev removal function (qemuDomainRemoveHostDevice()) was written to properly handle the removal of a hostdev that was actually an SRIOV virtual function (defined with ). However, the function used to search for a device matching the alias name provided in the DEVICE_DELETED message (virDomainDefFindDevice()) would search through the list of netdevs before hostdevs, so qemuDomainRemoveHostDevice() was never called; instead the netdev function, qemuDomainRemoveNetDevice() (which *doesn't* properly cleanup after removal of ), was called. (As a reminder - each results in a virDomainNetDef which contains a virDomainHostdevDef having a parent type of VIR_DOMAIN_DEVICE_NET, and parent.data.net pointing back to the virDomainNetDef; both Defs point to the same device info object (and the info contains the device's "alias", which is used by qemu to identify the device). The virDomainHostdevDef is added to the domain's hostdevs list *and* the virDomainNetDef is added to the domain's nets list, so searching either list for a particular alias will yield a positive result.) This function modifies the qemuDomainRemoveNetDevice() to short circuit itself and call qemu DomainRemoveHostDevice() instead when the actual device is a VIR_DOMAIN_NET_TYPE_HOSTDEV (similar logic to what is done in the higher level qemuDomainDetachNetDevice()) Note that even if virDomainDefFindDevice() changes in the future so that it finds the hostdev entry first, the current code will continue to work properly. (cherry picked from commit 69e047ae214d92feea6e54dfe821b1498d0004a9) Signed-off-by: Jiri Denemark --- src/qemu/qemu_hotplug.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4d29e18..f87b893 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2471,6 +2471,12 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver, virDomainEventPtr event; size_t i; + if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV) { + /* this function handles all hostdev and netdev cleanup */ + qemuDomainRemoveHostDevice(driver, vm, virDomainNetGetActualHostdev(net)); + return; + } + VIR_DEBUG("Removing network interface %s from domain %p %s", net->info.alias, vm, vm->def->name); -- 1.8.4