summary refs log tree commit diff stats
path: root/hw/i386/xen/xen_platform.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw@amazon.co.uk>2023-10-17 13:32:50 +0100
committerDavid Woodhouse <dwmw@amazon.co.uk>2023-11-07 08:54:20 +0000
commit25511f3e8c8e0c5a888d1c5de7891f7d287d2dd3 (patch)
treedf9e3cf435c0b66eef5c0cd268c3f31af32b443a /hw/i386/xen/xen_platform.c
parenta72ccc7fc449748d79914439ddf5c12a6e9fd6a6 (diff)
downloadfocaccia-qemu-25511f3e8c8e0c5a888d1c5de7891f7d287d2dd3.tar.gz
focaccia-qemu-25511f3e8c8e0c5a888d1c5de7891f7d287d2dd3.zip
hw/xen: only remove peers of PCI NICs on unplug
When the Xen guest asks to unplug *emulated* NICs, it's kind of unhelpful
also to unplug the peer of the *Xen* PV NIC.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
Diffstat (limited to 'hw/i386/xen/xen_platform.c')
-rw-r--r--hw/i386/xen/xen_platform.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
index 17457ff3de..e2dd1b536a 100644
--- a/hw/i386/xen/xen_platform.c
+++ b/hw/i386/xen/xen_platform.c
@@ -140,9 +140,14 @@ static void unplug_nic(PCIBus *b, PCIDevice *d, void *o)
 /* Remove the peer of the NIC device. Normally, this would be a tap device. */
 static void del_nic_peer(NICState *nic, void *opaque)
 {
-    NetClientState *nc;
+    NetClientState *nc = qemu_get_queue(nic);
+    ObjectClass *klass = module_object_class_by_name(nc->model);
+
+    /* Only delete peers of PCI NICs that we're about to delete */
+    if (!klass || !object_class_dynamic_cast(klass, TYPE_PCI_DEVICE)) {
+        return;
+    }
 
-    nc = qemu_get_queue(nic);
     if (nc->peer)
         qemu_del_net_client(nc->peer);
 }