Message ID | 20170630125028.30265-1-ross.lagerwall@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jun 30, 2017 at 01:50:28PM +0100, Ross Lagerwall wrote: > When the guest unplugs the emulated NICs, cleanup the peer for each NIC > as it is not needed anymore. Most importantly, this allows the tap > interfaces which QEMU holds open to be closed and removed. > > Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com> > --- > > In v2: Don't call nic_cleanup(), just remove the peer of the NIC which > will cleanup up the tap devices. This means that QEMU doesn't segv > when shutting down. > > hw/i386/xen/xen_platform.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c > index 1419fc9..f231558 100644 > --- a/hw/i386/xen/xen_platform.c > +++ b/hw/i386/xen/xen_platform.c > @@ -102,8 +102,19 @@ 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; > + > + nc = qemu_get_queue(nic); > + if (nc->peer) > + qemu_del_net_client(nc->peer); > +} > + > static void pci_unplug_nics(PCIBus *bus) > { > + qemu_foreach_nic(del_nic_peer, NULL); > pci_for_each_device(bus, 0, unplug_nic, NULL); I don't know if it a good idee to clean every NIC (using qemu_foreach_nic) vs only clean NIC that have a PCI device (having unplug_nic cleanup the peer). But I cannot think of a scenario with xen where a nic is not also a pci device. Anyway, this patch works: Acked-by: Anthony PERARD <anthony.perard@citrix.com>
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c index 1419fc9..f231558 100644 --- a/hw/i386/xen/xen_platform.c +++ b/hw/i386/xen/xen_platform.c @@ -102,8 +102,19 @@ 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; + + nc = qemu_get_queue(nic); + if (nc->peer) + qemu_del_net_client(nc->peer); +} + static void pci_unplug_nics(PCIBus *bus) { + qemu_foreach_nic(del_nic_peer, NULL); pci_for_each_device(bus, 0, unplug_nic, NULL); }
When the guest unplugs the emulated NICs, cleanup the peer for each NIC as it is not needed anymore. Most importantly, this allows the tap interfaces which QEMU holds open to be closed and removed. Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com> --- In v2: Don't call nic_cleanup(), just remove the peer of the NIC which will cleanup up the tap devices. This means that QEMU doesn't segv when shutting down. hw/i386/xen/xen_platform.c | 11 +++++++++++ 1 file changed, 11 insertions(+)